From ec90554cf4d68f45b7a52b3fb6e200654272b1de Mon Sep 17 00:00:00 2001
From: ZZYZX <zzyzx@virtual>
Date: Tue, 14 Feb 2017 11:56:38 +0200
Subject: [PATCH] Internal: not copying all lumps manually anymore on 'Save
 As'. The WAD is copied with File.Copy anyway.

---
 Source/Core/General/MapManager.cs | 49 ++++++-------------------------
 Source/Core/IO/WAD.cs             | 28 +++++++++++++-----
 2 files changed, 29 insertions(+), 48 deletions(-)

diff --git a/Source/Core/General/MapManager.cs b/Source/Core/General/MapManager.cs
index ef46480c..a7c0ee69 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 2818a5be..2efa6c2a 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--;
 			
-- 
GitLab