diff --git a/Source/Core/General/MapManager.cs b/Source/Core/General/MapManager.cs index ef46480..a7c0ee6 100644 --- a/Source/Core/General/MapManager.cs +++ b/Source/Core/General/MapManager.cs @@ -940,52 +940,20 @@ namespace CodeImp.DoomBuilder if(File.Exists(settingsfile)) File.Delete(settingsfile); } + // [ZZ] We really want to tell apart saving into current archive from saving into a new one. + // Treat "save as" into the current archive as normal save. + bool isSaveAs = (purpose == SavePurpose.AsNewFile) && (newfilepathname != filepathname); // On Save AS we have to copy the previous file to the new file - if((purpose == SavePurpose.AsNewFile) && (!String.IsNullOrEmpty(filepathname))) + if(isSaveAs) { // Copy if original file still exists if(File.Exists(filepathname)) File.Copy(filepathname, newfilepathname, true); } // If the target file exists, we need to rebuild it - if(File.Exists(newfilepathname)) - { - // Move the target file aside - origwadfile = newfilepathname + ".temp"; - File.Move(newfilepathname, origwadfile); - - // Open original file - WAD origwad = new WAD(origwadfile, true); - - // Create new target file - targetwad = new WAD(newfilepathname) { IsIWAD = origwad.IsIWAD }; //mxd. Let's preserve wad type - - // Copy all lumps, except the original map - GameConfiguration origcfg; //mxd - if(origmapconfigname == configinfo.Filename) - { - origcfg = config; - } - else - { - ConfigurationInfo ci = General.GetConfigurationInfo(origmapconfigname); - origcfg = new GameConfiguration(ci.Configuration); - - // Needed only once! - origmapconfigname = configinfo.Filename; - } - - mapheaderindex = CopyAllLumpsExceptMap(origwad, targetwad, origcfg, origmapname); - - // Close original file and delete it - origwad.Dispose(); - File.Delete(origwadfile); - } - else - { - // Create new target file - targetwad = new WAD(newfilepathname); - } + // [ZZ] The original code here would do some weird trickery with tempfiles. + // I'm just finding the map lumps and deleting them on later stages. + targetwad = new WAD(newfilepathname); } catch(Exception e) { @@ -1009,7 +977,7 @@ namespace CodeImp.DoomBuilder data.Resume(); General.WriteLogLine("Map saving failed: " + e.Message); return false; - } + } // Copy map lumps to target file CopyLumpsByType(tempwad, TEMP_MAP_HEADER, targetwad, origmapname, mapheaderindex, true, true, includenodes, true); @@ -1585,6 +1553,7 @@ namespace CodeImp.DoomBuilder } target.WriteHeaders(); //mxd + target.Compress(); // [ZZ] } } diff --git a/Source/Core/IO/WAD.cs b/Source/Core/IO/WAD.cs index 2818a5b..2efa6c2 100644 --- a/Source/Core/IO/WAD.cs +++ b/Source/Core/IO/WAD.cs @@ -280,8 +280,11 @@ namespace CodeImp.DoomBuilder.IO // This writes the WAD header and lumps table public void WriteHeaders() { - // Seek to beginning - file.Seek(0, SeekOrigin.Begin); + // [ZZ] don't allow any edit actions on readonly archive + if (isreadonly) return; + + // Seek to beginning + file.Seek(0, SeekOrigin.Begin); // Write WAD type writer.Write(ENCODING.GetBytes(isiwad ? TYPE_IWAD : TYPE_PWAD)); @@ -369,8 +372,11 @@ namespace CodeImp.DoomBuilder.IO public Lump Insert(string name, int position, int datalength) { return Insert(name, position, datalength, true); } //mxd public Lump Insert(string name, int position, int datalength, bool writeheaders) { - // We will be adding a lump - numlumps++; + // [ZZ] don't allow any edit actions on readonly archive + if (isreadonly) return null; + + // We will be adding a lump + numlumps++; // Extend the file file.SetLength(file.Length + datalength + 16); @@ -392,8 +398,11 @@ namespace CodeImp.DoomBuilder.IO // This removes a lump from the WAD file by index public void RemoveAt(int index) { - // Remove from list - Lump l = lumps[index]; + // [ZZ] don't allow any edit actions on readonly archive + if (isreadonly) return; + + // Remove from list + Lump l = lumps[index]; lumps.RemoveAt(index); l.Dispose(); numlumps--; @@ -405,8 +414,11 @@ namespace CodeImp.DoomBuilder.IO // This removes a lump from the WAD file public void Remove(Lump lump) { - // Remove from list - lumps.Remove(lump); + // [ZZ] don't allow any edit actions on readonly archive + if (isreadonly) return; + + // Remove from list + lumps.Remove(lump); lump.Dispose(); numlumps--;