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