diff --git a/SabreTools.Serialization/Wrappers/AACSMediaKeyBlock.cs b/SabreTools.Serialization/Wrappers/AACSMediaKeyBlock.cs
index 7e853de7..ea19b795 100644
--- a/SabreTools.Serialization/Wrappers/AACSMediaKeyBlock.cs
+++ b/SabreTools.Serialization/Wrappers/AACSMediaKeyBlock.cs
@@ -71,10 +71,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.AACS.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new AACSMediaKeyBlock(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/BDPlusSVM.cs b/SabreTools.Serialization/Wrappers/BDPlusSVM.cs
index f2d5a6aa..3f963f00 100644
--- a/SabreTools.Serialization/Wrappers/BDPlusSVM.cs
+++ b/SabreTools.Serialization/Wrappers/BDPlusSVM.cs
@@ -71,10 +71,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.BDPlus.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new BDPlusSVM(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/BFPK.cs b/SabreTools.Serialization/Wrappers/BFPK.cs
index 8ce7e84b..fe186e04 100644
--- a/SabreTools.Serialization/Wrappers/BFPK.cs
+++ b/SabreTools.Serialization/Wrappers/BFPK.cs
@@ -72,10 +72,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.BFPK.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new BFPK(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/BSP.cs b/SabreTools.Serialization/Wrappers/BSP.cs
index 06ab426c..de04a6eb 100644
--- a/SabreTools.Serialization/Wrappers/BSP.cs
+++ b/SabreTools.Serialization/Wrappers/BSP.cs
@@ -71,10 +71,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.BSP.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new BSP(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/CFB.cs b/SabreTools.Serialization/Wrappers/CFB.cs
index 24534dd8..6aa35d35 100644
--- a/SabreTools.Serialization/Wrappers/CFB.cs
+++ b/SabreTools.Serialization/Wrappers/CFB.cs
@@ -118,10 +118,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.CFB.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new CFB(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/CHD.cs b/SabreTools.Serialization/Wrappers/CHD.cs
index 4450e2a4..cce48d87 100644
--- a/SabreTools.Serialization/Wrappers/CHD.cs
+++ b/SabreTools.Serialization/Wrappers/CHD.cs
@@ -107,10 +107,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.CHD.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new CHD(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/CIA.cs b/SabreTools.Serialization/Wrappers/CIA.cs
index ab396c45..835a215e 100644
--- a/SabreTools.Serialization/Wrappers/CIA.cs
+++ b/SabreTools.Serialization/Wrappers/CIA.cs
@@ -62,10 +62,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.CIA.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new CIA(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/GCF.cs b/SabreTools.Serialization/Wrappers/GCF.cs
index 11a7183d..a2d1da64 100644
--- a/SabreTools.Serialization/Wrappers/GCF.cs
+++ b/SabreTools.Serialization/Wrappers/GCF.cs
@@ -213,10 +213,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.GCF.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new GCF(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/GZip.cs b/SabreTools.Serialization/Wrappers/GZip.cs
index d75c1481..add67b90 100644
--- a/SabreTools.Serialization/Wrappers/GZip.cs
+++ b/SabreTools.Serialization/Wrappers/GZip.cs
@@ -121,10 +121,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.GZip.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new GZip(model, data);
}
catch
@@ -135,15 +139,6 @@ namespace SabreTools.Serialization.Wrappers
#endregion
- #region JSON Export
-
-#if NETCOREAPP
- ///
- public override string ExportJSON() => throw new NotImplementedException();
-#endif
-
- #endregion
-
#region Extraction
///
@@ -184,6 +179,63 @@ namespace SabreTools.Serialization.Wrappers
}
}
+ ///
+ public bool ExtractExperimental(string outputDirectory, bool includeDebug)
+ {
+ // Ensure there is data to extract
+ if (Header == null || DataOffset < 0)
+ {
+ if (includeDebug) Console.Error.WriteLine("Invalid archive detected, skipping...");
+ return false;
+ }
+
+ // Ensure that DEFLATE is being used
+ if (Header.CM != CompressionMethod.Deflate)
+ {
+ if (includeDebug) Console.Error.WriteLine($"Invalid compression method {Header.CM} detected, only DEFLATE is supported. Skipping...");
+ return false;
+ }
+
+ try
+ {
+ // Seek to the start of the compressed data
+ long offset = _dataSource.Seek(DataOffset, SeekOrigin.Begin);
+ if (offset != DataOffset)
+ {
+ if (includeDebug) Console.Error.WriteLine($"Could not seek to compressed data at {DataOffset}");
+ return false;
+ }
+
+ // Ensure directory separators are consistent
+ string filename = Header.OriginalFileName ?? Filename ?? $"extracted_file";
+ if (Path.DirectorySeparatorChar == '\\')
+ filename = filename.Replace('/', '\\');
+ else if (Path.DirectorySeparatorChar == '/')
+ filename = filename.Replace('\\', '/');
+
+ // Ensure the full output directory exists
+ filename = Path.Combine(outputDirectory, filename);
+ var directoryName = Path.GetDirectoryName(filename);
+ if (directoryName != null && !Directory.Exists(directoryName))
+ Directory.CreateDirectory(directoryName);
+
+ // Open the source as a DEFLATE stream
+ var deflateStream = new DeflateStream(_dataSource, CompressionMode.Decompress, leaveOpen: true);
+
+ // Write the file
+ using var fs = File.Open(filename, FileMode.Create, FileAccess.Write, FileShare.None);
+ deflateStream.CopyTo(fs);
+ fs.Flush();
+
+ return true;
+ }
+ catch (Exception ex)
+ {
+ if (includeDebug) Console.Error.WriteLine(ex);
+ return false;
+ }
+ }
+
#endregion
}
}
diff --git a/SabreTools.Serialization/Wrappers/IRD.cs b/SabreTools.Serialization/Wrappers/IRD.cs
index 2a791300..6504e5f7 100644
--- a/SabreTools.Serialization/Wrappers/IRD.cs
+++ b/SabreTools.Serialization/Wrappers/IRD.cs
@@ -61,10 +61,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.IRD.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new IRD(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/InstallShieldArchiveV3.cs b/SabreTools.Serialization/Wrappers/InstallShieldArchiveV3.cs
index bb37f7b1..738f1784 100644
--- a/SabreTools.Serialization/Wrappers/InstallShieldArchiveV3.cs
+++ b/SabreTools.Serialization/Wrappers/InstallShieldArchiveV3.cs
@@ -158,10 +158,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.InstallShieldArchiveV3.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new InstallShieldArchiveV3(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/InstallShieldCabinet.cs b/SabreTools.Serialization/Wrappers/InstallShieldCabinet.cs
index 9eff743f..42e4d674 100644
--- a/SabreTools.Serialization/Wrappers/InstallShieldCabinet.cs
+++ b/SabreTools.Serialization/Wrappers/InstallShieldCabinet.cs
@@ -150,10 +150,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.InstallShieldCabinet.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new InstallShieldCabinet(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/LZKWAJ.cs b/SabreTools.Serialization/Wrappers/LZKWAJ.cs
index bfb8a993..97aa4d8a 100644
--- a/SabreTools.Serialization/Wrappers/LZKWAJ.cs
+++ b/SabreTools.Serialization/Wrappers/LZKWAJ.cs
@@ -81,10 +81,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.LZKWAJ.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new LZKWAJ(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/LZQBasic.cs b/SabreTools.Serialization/Wrappers/LZQBasic.cs
index 580607a3..219e22aa 100644
--- a/SabreTools.Serialization/Wrappers/LZQBasic.cs
+++ b/SabreTools.Serialization/Wrappers/LZQBasic.cs
@@ -65,10 +65,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.LZQBasic.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new LZQBasic(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/LZSZDD.cs b/SabreTools.Serialization/Wrappers/LZSZDD.cs
index c26c9348..acfd6fc5 100644
--- a/SabreTools.Serialization/Wrappers/LZSZDD.cs
+++ b/SabreTools.Serialization/Wrappers/LZSZDD.cs
@@ -72,10 +72,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.LZSZDD.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new LZSZDD(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/LinearExecutable.cs b/SabreTools.Serialization/Wrappers/LinearExecutable.cs
index a4589d5f..575d2e7a 100644
--- a/SabreTools.Serialization/Wrappers/LinearExecutable.cs
+++ b/SabreTools.Serialization/Wrappers/LinearExecutable.cs
@@ -80,10 +80,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.LinearExecutable.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new LinearExecutable(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/MSDOS.cs b/SabreTools.Serialization/Wrappers/MSDOS.cs
index 55158201..870ad769 100644
--- a/SabreTools.Serialization/Wrappers/MSDOS.cs
+++ b/SabreTools.Serialization/Wrappers/MSDOS.cs
@@ -61,10 +61,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.MSDOS.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new MSDOS(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/MicrosoftCabinet.cs b/SabreTools.Serialization/Wrappers/MicrosoftCabinet.cs
index 6454463a..d531c74c 100644
--- a/SabreTools.Serialization/Wrappers/MicrosoftCabinet.cs
+++ b/SabreTools.Serialization/Wrappers/MicrosoftCabinet.cs
@@ -103,10 +103,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.MicrosoftCabinet.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new MicrosoftCabinet(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/MoPaQ.cs b/SabreTools.Serialization/Wrappers/MoPaQ.cs
index 4eb1492c..0329f0aa 100644
--- a/SabreTools.Serialization/Wrappers/MoPaQ.cs
+++ b/SabreTools.Serialization/Wrappers/MoPaQ.cs
@@ -61,10 +61,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.MoPaQ.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new MoPaQ(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/N3DS.cs b/SabreTools.Serialization/Wrappers/N3DS.cs
index 4db96c26..56c02b16 100644
--- a/SabreTools.Serialization/Wrappers/N3DS.cs
+++ b/SabreTools.Serialization/Wrappers/N3DS.cs
@@ -256,10 +256,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.N3DS.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new N3DS(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/NCF.cs b/SabreTools.Serialization/Wrappers/NCF.cs
index 25c1a3e8..42fa6d97 100644
--- a/SabreTools.Serialization/Wrappers/NCF.cs
+++ b/SabreTools.Serialization/Wrappers/NCF.cs
@@ -61,10 +61,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.NCF.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new NCF(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/NewExecutable.cs b/SabreTools.Serialization/Wrappers/NewExecutable.cs
index ea4e646e..6e501c73 100644
--- a/SabreTools.Serialization/Wrappers/NewExecutable.cs
+++ b/SabreTools.Serialization/Wrappers/NewExecutable.cs
@@ -357,10 +357,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.NewExecutable.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new NewExecutable(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/Nitro.cs b/SabreTools.Serialization/Wrappers/Nitro.cs
index c466a0d9..d94432bb 100644
--- a/SabreTools.Serialization/Wrappers/Nitro.cs
+++ b/SabreTools.Serialization/Wrappers/Nitro.cs
@@ -84,10 +84,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.Nitro.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new Nitro(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/PAK.cs b/SabreTools.Serialization/Wrappers/PAK.cs
index e390ee3c..de5ceeb1 100644
--- a/SabreTools.Serialization/Wrappers/PAK.cs
+++ b/SabreTools.Serialization/Wrappers/PAK.cs
@@ -71,10 +71,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.PAK.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new PAK(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/PFF.cs b/SabreTools.Serialization/Wrappers/PFF.cs
index 1d8300e0..6a74f8ca 100644
--- a/SabreTools.Serialization/Wrappers/PFF.cs
+++ b/SabreTools.Serialization/Wrappers/PFF.cs
@@ -76,10 +76,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.PFF.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new PFF(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/PIC.cs b/SabreTools.Serialization/Wrappers/PIC.cs
index 00e7a23c..942e9f16 100644
--- a/SabreTools.Serialization/Wrappers/PIC.cs
+++ b/SabreTools.Serialization/Wrappers/PIC.cs
@@ -70,10 +70,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.PIC.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new PIC(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/PKZIP.cs b/SabreTools.Serialization/Wrappers/PKZIP.cs
index 297fbdf1..fcc50988 100644
--- a/SabreTools.Serialization/Wrappers/PKZIP.cs
+++ b/SabreTools.Serialization/Wrappers/PKZIP.cs
@@ -91,10 +91,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.PKZIP.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new PKZIP(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/PlayJAudioFile.cs b/SabreTools.Serialization/Wrappers/PlayJAudioFile.cs
index f62239c8..164cfedd 100644
--- a/SabreTools.Serialization/Wrappers/PlayJAudioFile.cs
+++ b/SabreTools.Serialization/Wrappers/PlayJAudioFile.cs
@@ -61,10 +61,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.PlayJAudio.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new PlayJAudioFile(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/PlayJPlaylist.cs b/SabreTools.Serialization/Wrappers/PlayJPlaylist.cs
index 1446fcd8..e502e983 100644
--- a/SabreTools.Serialization/Wrappers/PlayJPlaylist.cs
+++ b/SabreTools.Serialization/Wrappers/PlayJPlaylist.cs
@@ -61,10 +61,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.PlayJPlaylist.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new PlayJPlaylist(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/PortableExecutable.cs b/SabreTools.Serialization/Wrappers/PortableExecutable.cs
index c012f513..bb02d1e5 100644
--- a/SabreTools.Serialization/Wrappers/PortableExecutable.cs
+++ b/SabreTools.Serialization/Wrappers/PortableExecutable.cs
@@ -835,10 +835,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.PortableExecutable.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new PortableExecutable(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/Quantum.cs b/SabreTools.Serialization/Wrappers/Quantum.cs
index 1f35015d..73457b48 100644
--- a/SabreTools.Serialization/Wrappers/Quantum.cs
+++ b/SabreTools.Serialization/Wrappers/Quantum.cs
@@ -80,10 +80,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.Quantum.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new Quantum(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/SGA.cs b/SabreTools.Serialization/Wrappers/SGA.cs
index cfa9e377..2f673b10 100644
--- a/SabreTools.Serialization/Wrappers/SGA.cs
+++ b/SabreTools.Serialization/Wrappers/SGA.cs
@@ -109,10 +109,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.SGA.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new SGA(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/SecuROMDFA.cs b/SabreTools.Serialization/Wrappers/SecuROMDFA.cs
index 1f7485fc..cf8787ae 100644
--- a/SabreTools.Serialization/Wrappers/SecuROMDFA.cs
+++ b/SabreTools.Serialization/Wrappers/SecuROMDFA.cs
@@ -62,10 +62,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.SecuROMDFA.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new SecuROMDFA(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/TapeArchive.cs b/SabreTools.Serialization/Wrappers/TapeArchive.cs
index 7f04edf1..73babb46 100644
--- a/SabreTools.Serialization/Wrappers/TapeArchive.cs
+++ b/SabreTools.Serialization/Wrappers/TapeArchive.cs
@@ -73,10 +73,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.TapeArchive.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new TapeArchive(model, data);
}
catch
@@ -87,15 +91,6 @@ namespace SabreTools.Serialization.Wrappers
#endregion
- #region JSON Export
-
-#if NETCOREAPP
- ///
- public override string ExportJSON() => throw new System.NotImplementedException();
-#endif
-
- #endregion
-
#region Extraction
///
@@ -103,7 +98,7 @@ namespace SabreTools.Serialization.Wrappers
{
// Ensure there are entries to extract
if (Entries == null || Entries.Length == 0)
- return true;
+ return false;
try
{
diff --git a/SabreTools.Serialization/Wrappers/VBSP.cs b/SabreTools.Serialization/Wrappers/VBSP.cs
index 87ddf332..f8839cac 100644
--- a/SabreTools.Serialization/Wrappers/VBSP.cs
+++ b/SabreTools.Serialization/Wrappers/VBSP.cs
@@ -71,10 +71,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.VBSP.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new VBSP(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/VPK.cs b/SabreTools.Serialization/Wrappers/VPK.cs
index 8a5f457b..edda8214 100644
--- a/SabreTools.Serialization/Wrappers/VPK.cs
+++ b/SabreTools.Serialization/Wrappers/VPK.cs
@@ -136,10 +136,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.VPK.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new VPK(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/WAD3.cs b/SabreTools.Serialization/Wrappers/WAD3.cs
index 3bb3c63e..35450b9a 100644
--- a/SabreTools.Serialization/Wrappers/WAD3.cs
+++ b/SabreTools.Serialization/Wrappers/WAD3.cs
@@ -70,10 +70,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.WAD3.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new WAD3(model, data);
}
catch
diff --git a/SabreTools.Serialization/Wrappers/XZP.cs b/SabreTools.Serialization/Wrappers/XZP.cs
index 163202ae..f3f7af88 100644
--- a/SabreTools.Serialization/Wrappers/XZP.cs
+++ b/SabreTools.Serialization/Wrappers/XZP.cs
@@ -73,10 +73,14 @@ namespace SabreTools.Serialization.Wrappers
try
{
+ // Cache the current offset
+ long currentOffset = data.Position;
+
var model = Deserializers.XZP.DeserializeStream(data);
if (model == null)
return null;
+ data.Seek(currentOffset, SeekOrigin.Begin);
return new XZP(model, data);
}
catch