X-Git-Url: http://ecere.com/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=ecere%2Fsrc%2Fsys%2FEARArchive.ec;h=5d85c632eeaf04160ec5ff96aa23c9ca3e0ef61f;hb=bfb2c58581e87ff251d70d89e0629a17c4bb5868;hp=4a125dd76346c2a44cf3403b04dd7f217c25f27e;hpb=8d8ca99e3daea40f3d0d7b08148f851b9793a6f7;p=sdk diff --git a/ecere/src/sys/EARArchive.ec b/ecere/src/sys/EARArchive.ec index 4a125dd..5d85c63 100644 --- a/ecere/src/sys/EARArchive.ec +++ b/ecere/src/sys/EARArchive.ec @@ -163,7 +163,11 @@ class EARArchive : Archive Defrag(rootDir); archiveStart += Update(); } - + if(f && writeAccess) + { + f.Flush(); + f.Unlock(0, 0, true); + } delete f; /*if(rootDir && writeAccess) @@ -1549,61 +1553,68 @@ class EARFileSystem : FileSystem EARArchive archive { writeAccess = flags.writeAccess }; if(archive) { - // Check for existing Archive - if((archive.f = fileName ? (flags.buffered ? FileOpenBuffered : FileOpen)(fileName, flags.writeAccess ? readWrite : read) : TempFile { openMode = readWrite } )) + int try = flags.waitLock ? 10 : 0; + for(; try >= 0; try--) { - EARHeader header; - bool opened = false; - uint archiveSize = 0; - archive.f.Seek(-(int)sizeof(uint), end); - archive.f.Read(&archiveSize, sizeof(uint), 1); - archive.f.Seek(-(int)archiveSize, end); - - archive.archiveStart = archive.f.Tell(); - if(archive.f.Read(&header, sizeof(EARHeader), 1) == 1 && - !strncmp(header.recognition, earRecognition, sizeof(earRecognition))) - opened = true; - - if(!opened) + // Check for existing Archive + if((archive.f = fileName ? (flags.buffered ? FileOpenBuffered : FileOpen)(fileName, flags.writeAccess ? readWrite : read) : TempFile { openMode = readWrite } )) { - archive.f.Seek(0, start); + EARHeader header; + bool opened = false; + uint archiveSize = 0; + archive.f.Seek(-(int)sizeof(uint), end); + archive.f.Read(&archiveSize, sizeof(uint), 1); + archive.f.Seek(-(int)archiveSize, end); + archive.archiveStart = archive.f.Tell(); - archiveSize = archive.f.GetSize(); if(archive.f.Read(&header, sizeof(EARHeader), 1) == 1 && !strncmp(header.recognition, earRecognition, sizeof(earRecognition))) opened = true; - } - if(opened) - { - // At this point we recognized the file as a valid eAR archive - archive.rootDir = archive.archiveStart + sizeof(EARHeader); - archive.totalSize = header.totalSize; - - archive.f.Seek(archive.rootDir, start); - if(flags.buffered) - { - archive.freeBlocks.Add(FreeBlock { start = archive.rootDir + 2 * sizeof(uint), end = MAXDWORD }); - archive.SubtractUsedBlocks(); - } - else + if(!opened) { - archive.freeBlocks.Add(FreeBlock { start = archive.archiveStart + (archiveSize - sizeof(uint)), end = MAXDWORD }); + archive.f.Seek(0, start); + archive.archiveStart = archive.f.Tell(); + archiveSize = archive.f.GetSize(); + if(archive.f.Read(&header, sizeof(EARHeader), 1) == 1 && + !strncmp(header.recognition, earRecognition, sizeof(earRecognition))) + opened = true; } - /* - if(!flags.writeAccess) - { - delete archive.f; - archive.f = FileOpen(fileName, readWrite); - } - */ - if(archive.f) + if(opened) { - incref archive.f; - result = archive; + // At this point we recognized the file as a valid eAR archive + archive.rootDir = archive.archiveStart + sizeof(EARHeader); + archive.totalSize = header.totalSize; + + archive.f.Seek(archive.rootDir, start); + if(flags.buffered) + { + archive.freeBlocks.Add(FreeBlock { start = archive.rootDir + 2 * sizeof(uint), end = MAXDWORD }); + archive.SubtractUsedBlocks(); + } + else + { + archive.freeBlocks.Add(FreeBlock { start = archive.archiveStart + (archiveSize - sizeof(uint)), end = MAXDWORD }); + } + + /* + if(!flags.writeAccess) + { + delete archive.f; + archive.f = FileOpen(fileName, readWrite); + } + */ + if(archive.f) + { + incref archive.f; + result = archive; + } } + break; } + else if(try > 0) + Sleep(0.01); } // This piece of code will create a new archive as a new file or at the footer @@ -1643,7 +1654,7 @@ class EARFileSystem : FileSystem result = archive; } } - if(archive.f && flags.writeAccess && flags.exclusive && !archive.f.Lock(flags.exclusive ? exclusive : shared, 0, 0, false)) + if(archive.f && flags.writeAccess && flags.exclusive && !archive.f.Lock(flags.exclusive ? exclusive : shared, 0, 0, flags.waitLock)) result = null; if(!result) {