Fix significant issue with how view streams are used

This commit is contained in:
Matt Nadareski
2025-08-28 14:10:08 -04:00
parent 5daf759033
commit 7fda7be457
38 changed files with 210 additions and 19 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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
/// <inheritdoc/>
public override string ExportJSON() => throw new NotImplementedException();
#endif
#endregion
#region Extraction
/// <inheritdoc/>
@@ -184,6 +179,63 @@ namespace SabreTools.Serialization.Wrappers
}
}
/// <inheritdoc cref="Extract(string, bool)"/>
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
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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
/// <inheritdoc/>
public override string ExportJSON() => throw new System.NotImplementedException();
#endif
#endregion
#region Extraction
/// <inheritdoc/>
@@ -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
{

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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