mirror of
https://github.com/claunia/SabreTools.git
synced 2025-12-16 19:14:27 +00:00
[ArchiveTools] More GZ handling and fixes
This commit is contained in:
@@ -286,6 +286,23 @@ namespace SabreTools.Helper
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (at == ArchiveType.GZip)
|
||||||
|
{
|
||||||
|
// Dispose the original reader
|
||||||
|
reader.Dispose();
|
||||||
|
|
||||||
|
using(FileStream itemstream = File.OpenRead(input))
|
||||||
|
{
|
||||||
|
using (FileStream outstream = File.Create(Path.Combine(tempdir, Path.GetFileNameWithoutExtension(input))))
|
||||||
|
{
|
||||||
|
using (GZipStream gzstream = new GZipStream(itemstream, CompressionMode.Decompress))
|
||||||
|
{
|
||||||
|
gzstream.CopyTo(outstream);
|
||||||
|
outfile = Path.GetFullPath(Path.Combine(tempdir, Path.GetFileNameWithoutExtension(input)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -487,8 +504,25 @@ namespace SabreTools.Helper
|
|||||||
IReader reader = null;
|
IReader reader = null;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
reader = ReaderFactory.Open(File.OpenRead(input));
|
|
||||||
logger.Log("Found archive of type: " + at);
|
logger.Log("Found archive of type: " + at);
|
||||||
|
long size = 0;
|
||||||
|
string crc = "";
|
||||||
|
|
||||||
|
// If we have a gzip file, get the crc directly
|
||||||
|
if (at == ArchiveType.GZip)
|
||||||
|
{
|
||||||
|
// Get the CRC and size from the file
|
||||||
|
using (BinaryReader br = new BinaryReader(File.OpenRead(input)))
|
||||||
|
{
|
||||||
|
br.BaseStream.Seek(-8, SeekOrigin.End);
|
||||||
|
byte[] headercrc = br.ReadBytes(4);
|
||||||
|
crc = BitConverter.ToString(headercrc.Reverse().ToArray()).Replace("-", string.Empty).ToLowerInvariant();
|
||||||
|
byte[] headersize = br.ReadBytes(4);
|
||||||
|
size = BitConverter.ToInt32(headersize.Reverse().ToArray(), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
reader = ReaderFactory.Open(File.OpenRead(input));
|
||||||
|
|
||||||
if (at != ArchiveType.Tar)
|
if (at != ArchiveType.Tar)
|
||||||
{
|
{
|
||||||
@@ -496,15 +530,17 @@ namespace SabreTools.Helper
|
|||||||
{
|
{
|
||||||
if (reader.Entry != null && !reader.Entry.IsDirectory)
|
if (reader.Entry != null && !reader.Entry.IsDirectory)
|
||||||
{
|
{
|
||||||
logger.Log("Entry found: '" + reader.Entry.Key + "': " + reader.Entry.Size + ", " + reader.Entry.Crc.ToString("X").ToLowerInvariant());
|
logger.Log("Entry found: '" + reader.Entry.Key + "': "
|
||||||
|
+ (size == 0 ? reader.Entry.Size : size) + ", "
|
||||||
|
+ (crc == "" ? reader.Entry.Crc.ToString("X").ToLowerInvariant() : crc));
|
||||||
|
|
||||||
roms.Add(new Rom
|
roms.Add(new Rom
|
||||||
{
|
{
|
||||||
Type = "rom",
|
Type = "rom",
|
||||||
Name = reader.Entry.Key,
|
Name = reader.Entry.Key,
|
||||||
Game = gamename,
|
Game = gamename,
|
||||||
Size = reader.Entry.Size,
|
Size = (size == 0 ? reader.Entry.Size : size),
|
||||||
CRC = reader.Entry.Crc.ToString("X").ToLowerInvariant(),
|
CRC = (crc == "" ? reader.Entry.Crc.ToString("X").ToLowerInvariant() : crc),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -570,35 +606,44 @@ namespace SabreTools.Helper
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get the Romba-specific header data
|
// Get the Romba-specific header data
|
||||||
|
byte[] header; // Get preamble header for checking
|
||||||
|
byte[] headercheck = new byte[] { 0x1f, 0x8b, 0x8, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0x0 };
|
||||||
byte[] headermd5; // MD5
|
byte[] headermd5; // MD5
|
||||||
byte[] headercrc; // CRC
|
byte[] headercrc; // CRC
|
||||||
byte[] headersz; // Int64 size
|
byte[] headersz; // Int64 size
|
||||||
using (FileStream itemstream = File.OpenRead(input))
|
using (BinaryReader br = new BinaryReader(File.OpenRead(input)))
|
||||||
{
|
{
|
||||||
using (BinaryReader br = new BinaryReader(itemstream))
|
header = br.ReadBytes(12);
|
||||||
{
|
headermd5 = br.ReadBytes(16);
|
||||||
br.BaseStream.Seek(12, SeekOrigin.Begin);
|
headercrc = br.ReadBytes(4);
|
||||||
headermd5 = br.ReadBytes(16);
|
headersz = br.ReadBytes(8);
|
||||||
headercrc = br.ReadBytes(4);
|
}
|
||||||
headersz = br.ReadBytes(8);
|
|
||||||
}
|
// If the header is not correct, return a blank rom
|
||||||
|
bool correct = true;
|
||||||
|
for (int i = 0; i < header.Length; i++)
|
||||||
|
{
|
||||||
|
correct &= (header[i] == headercheck[i]);
|
||||||
|
}
|
||||||
|
if (!correct)
|
||||||
|
{
|
||||||
|
return new Rom();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now convert the data and get the right position
|
// Now convert the data and get the right position
|
||||||
string gzmd5 = BitConverter.ToString(headermd5).Replace("-", string.Empty);
|
string gzmd5 = BitConverter.ToString(headermd5).Replace("-", string.Empty);
|
||||||
string gzcrc = BitConverter.ToString(headercrc).Replace("-", string.Empty);
|
string gzcrc = BitConverter.ToString(headercrc).Replace("-", string.Empty);
|
||||||
string gzsize = BitConverter.ToString(headersz.Reverse().ToArray()).Replace("-", string.Empty);
|
long extractedsize = (long)BitConverter.ToUInt64(headersz.Reverse().ToArray(), 0);
|
||||||
long extractedsize = Convert.ToInt64(gzsize, 16);
|
|
||||||
|
|
||||||
Rom rom = new Rom
|
Rom rom = new Rom
|
||||||
{
|
{
|
||||||
Type = "rom",
|
Type = "rom",
|
||||||
Game = Path.GetFileNameWithoutExtension(input),
|
Game = Path.GetFileNameWithoutExtension(input).ToLowerInvariant(),
|
||||||
Name = Path.GetFileNameWithoutExtension(input),
|
Name = Path.GetFileNameWithoutExtension(input).ToLowerInvariant(),
|
||||||
Size = extractedsize,
|
Size = extractedsize,
|
||||||
CRC = gzcrc,
|
CRC = gzcrc.ToLowerInvariant(),
|
||||||
MD5 = gzmd5,
|
MD5 = gzmd5.ToLowerInvariant(),
|
||||||
SHA1 = Path.GetFileNameWithoutExtension(input),
|
SHA1 = Path.GetFileNameWithoutExtension(input).ToLowerInvariant(),
|
||||||
};
|
};
|
||||||
|
|
||||||
return rom;
|
return rom;
|
||||||
|
|||||||
Reference in New Issue
Block a user