Internal: not copying all lumps manually anymore on 'Save As'. The WAD is copied with File.Copy anyway.

This commit is contained in:
ZZYZX 2017-02-14 11:56:38 +02:00 committed by spherallic
parent 055d2cb33f
commit ec90554cf4
2 changed files with 29 additions and 48 deletions

View file

@ -940,52 +940,20 @@ namespace CodeImp.DoomBuilder
if(File.Exists(settingsfile)) File.Delete(settingsfile); 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 // 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 // Copy if original file still exists
if(File.Exists(filepathname)) File.Copy(filepathname, newfilepathname, true); if(File.Exists(filepathname)) File.Copy(filepathname, newfilepathname, true);
} }
// If the target file exists, we need to rebuild it // If the target file exists, we need to rebuild it
if(File.Exists(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.
// Move the target file aside targetwad = new WAD(newfilepathname);
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);
}
} }
catch(Exception e) catch(Exception e)
{ {
@ -1585,6 +1553,7 @@ namespace CodeImp.DoomBuilder
} }
target.WriteHeaders(); //mxd target.WriteHeaders(); //mxd
target.Compress(); // [ZZ]
} }
} }

View file

@ -280,8 +280,11 @@ namespace CodeImp.DoomBuilder.IO
// This writes the WAD header and lumps table // This writes the WAD header and lumps table
public void WriteHeaders() public void WriteHeaders()
{ {
// Seek to beginning // [ZZ] don't allow any edit actions on readonly archive
file.Seek(0, SeekOrigin.Begin); if (isreadonly) return;
// Seek to beginning
file.Seek(0, SeekOrigin.Begin);
// Write WAD type // Write WAD type
writer.Write(ENCODING.GetBytes(isiwad ? TYPE_IWAD : TYPE_PWAD)); 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) { return Insert(name, position, datalength, true); } //mxd
public Lump Insert(string name, int position, int datalength, bool writeheaders) public Lump Insert(string name, int position, int datalength, bool writeheaders)
{ {
// We will be adding a lump // [ZZ] don't allow any edit actions on readonly archive
numlumps++; if (isreadonly) return null;
// We will be adding a lump
numlumps++;
// Extend the file // Extend the file
file.SetLength(file.Length + datalength + 16); file.SetLength(file.Length + datalength + 16);
@ -392,8 +398,11 @@ namespace CodeImp.DoomBuilder.IO
// This removes a lump from the WAD file by index // This removes a lump from the WAD file by index
public void RemoveAt(int index) public void RemoveAt(int index)
{ {
// Remove from list // [ZZ] don't allow any edit actions on readonly archive
Lump l = lumps[index]; if (isreadonly) return;
// Remove from list
Lump l = lumps[index];
lumps.RemoveAt(index); lumps.RemoveAt(index);
l.Dispose(); l.Dispose();
numlumps--; numlumps--;
@ -405,8 +414,11 @@ namespace CodeImp.DoomBuilder.IO
// This removes a lump from the WAD file // This removes a lump from the WAD file
public void Remove(Lump lump) public void Remove(Lump lump)
{ {
// Remove from list // [ZZ] don't allow any edit actions on readonly archive
lumps.Remove(lump); if (isreadonly) return;
// Remove from list
lumps.Remove(lump);
lump.Dispose(); lump.Dispose();
numlumps--; numlumps--;