mirror of
https://github.com/SabreTools/SabreTools.Serialization.git
synced 2026-07-26 18:53:10 +00:00
Fix significant issue with how view streams are used
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user