diff --git a/SabreTools.Library/Data/Enums.cs b/SabreTools.Library/Data/Enums.cs
index ff3f857a..43dec0a9 100644
--- a/SabreTools.Library/Data/Enums.cs
+++ b/SabreTools.Library/Data/Enums.cs
@@ -96,13 +96,21 @@
{
None = 0,
+ // Bare types
+ CHD,
+ Folder,
+
// Archival types
SevenZipArchive,
- CHD,
GZipArchive,
+ LRZipArchive,
+ LZ4Archive,
RarArchive,
- TarArchive,
+ TapeArchive,
+ XZArchive,
ZipArchive,
+ ZPAQArchive,
+ ZstdArchive,
}
///
diff --git a/SabreTools.Library/FileTypes/BaseArchive.cs b/SabreTools.Library/FileTypes/BaseArchive.cs
index f270a12d..e852bbf9 100644
--- a/SabreTools.Library/FileTypes/BaseArchive.cs
+++ b/SabreTools.Library/FileTypes/BaseArchive.cs
@@ -9,20 +9,16 @@ using System.IO;
using MemoryStream = System.IO.MemoryStream;
using Stream = System.IO.Stream;
#endif
-using SharpCompress.Common;
namespace SabreTools.Library.FileTypes
{
- public abstract class BaseArchive
+ public abstract class BaseArchive : BaseFile
{
#region Protected instance variables
// Buffer size used by archives
protected const int _bufferSize = 4096 * 128;
- protected ArchiveType _archiveType;
- protected string _filename;
-
#endregion
#region Construtors
@@ -39,8 +35,8 @@ namespace SabreTools.Library.FileTypes
///
/// Name of the file to use as an archive
public BaseArchive(string filename)
+ : base(filename)
{
- _filename = filename;
}
#endregion
diff --git a/SabreTools.Library/FileTypes/BaseFile.cs b/SabreTools.Library/FileTypes/BaseFile.cs
new file mode 100644
index 00000000..072609ab
--- /dev/null
+++ b/SabreTools.Library/FileTypes/BaseFile.cs
@@ -0,0 +1,92 @@
+using System.Collections.Generic;
+
+using SabreTools.Library.Data;
+
+namespace SabreTools.Library.FileTypes
+{
+ public abstract class BaseFile
+ {
+ #region Protected instance variables
+
+ protected FileType _fileType;
+ protected string _filename;
+ protected List _children;
+
+ // External hash values for the file
+ protected long? _size;
+ protected byte[] _crc;
+ protected byte[] _md5;
+ protected byte[] _sha1;
+ protected byte[] _sha256;
+ protected byte[] _sha384;
+ protected byte[] _sha512;
+
+ #endregion
+
+ #region Publicly facing variables
+
+ // TODO: Get all of these values automatically so there is no public "set"
+ public string Filename
+ {
+ get { return _filename; }
+ set { _filename = value; }
+ }
+ public long? Size
+ {
+ get { return _size; }
+ set { _size = value; }
+ }
+ public byte[] CRC
+ {
+ get { return _crc; }
+ set { _crc = value; }
+ }
+ public byte[] MD5
+ {
+ get { return _md5; }
+ set { _md5 = value; }
+ }
+ public byte[] SHA1
+ {
+ get { return _sha1; }
+ set { _sha1 = value; }
+ }
+ public byte[] SHA256
+ {
+ get { return _sha256; }
+ set { _sha256 = value; }
+ }
+ public byte[] SHA384
+ {
+ get { return _sha384; }
+ set { _sha384 = value; }
+ }
+ public byte[] SHA512
+ {
+ get { return _sha512; }
+ set { _sha512 = value; }
+ }
+
+ #endregion
+
+ #region Construtors
+
+ ///
+ /// Create a new Archive with no base file
+ ///
+ public BaseFile()
+ {
+ }
+
+ ///
+ /// Create a new Archive from the given file
+ ///
+ /// Name of the file to use as an archive
+ public BaseFile(string filename)
+ {
+ _filename = filename;
+ }
+
+ #endregion
+ }
+}
diff --git a/SabreTools.Library/FileTypes/CHDFile.cs b/SabreTools.Library/FileTypes/CHDFile.cs
index b423367f..d95cb821 100644
--- a/SabreTools.Library/FileTypes/CHDFile.cs
+++ b/SabreTools.Library/FileTypes/CHDFile.cs
@@ -88,7 +88,7 @@ namespace SabreTools.Library.FileTypes
/// 0x68-0x7b - Parent SHA-1
/// ----------------------------------------------
///
- public class CHDFile : IDisposable
+ public class CHDFile : BaseFile, IDisposable
{
#region Private instance variables
@@ -122,6 +122,7 @@ namespace SabreTools.Library.FileTypes
/// Stream representing the CHD file
public CHDFile(Stream chdstream)
{
+ _fileType = FileType.CHD;
m_br = new BinaryReader(chdstream);
}
diff --git a/SabreTools.Library/FileTypes/CoreRarArchive.cs b/SabreTools.Library/FileTypes/CoreRarArchive.cs
index 69a5967a..d81d4931 100644
--- a/SabreTools.Library/FileTypes/CoreRarArchive.cs
+++ b/SabreTools.Library/FileTypes/CoreRarArchive.cs
@@ -1,7 +1,8 @@
using System;
using System.Collections.Generic;
-
+using System.IO;
using SabreTools.Library.Data;
+using SabreTools.Library.DatItems;
///
/// This code is based on the header format described at http://www.rarlab.com/technote.htm#srvheaders
@@ -116,7 +117,7 @@ using SabreTools.Library.Data;
///
namespace SabreTools.Library.FileTypes
{
- public class CoreRarArchive
+ public class CoreRarArchive : BaseArchive
{
// SFX Module Information
public byte[] SFX;
@@ -148,6 +149,55 @@ namespace SabreTools.Library.FileTypes
// Entry Information
public List Entries = new List();
+
+ #region Unimplemented methods
+
+ public override bool ExtractAll(string outDir)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override string ExtractEntry(string entryName, string outDir)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override (MemoryStream, string) ExtractEntryStream(string entryName)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override List GetArchiveFileInfo(Hash omitFromScan = Hash.DeepHashes, bool date = false)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override List GetEmptyFolders()
+ {
+ throw new NotImplementedException();
+ }
+
+ public override bool IsTorrent()
+ {
+ throw new NotImplementedException();
+ }
+
+ public override bool Write(string inputFile, string outDir, Rom rom, bool date = false, bool romba = false)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override bool Write(Stream inputStream, string outDir, Rom rom, bool date = false, bool romba = false)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override bool Write(List inputFiles, string outDir, List roms, bool date = false, bool romba = false)
+ {
+ throw new NotImplementedException();
+ }
+
+ #endregion
}
public class CoreRarArchiveEntry
diff --git a/SabreTools.Library/FileTypes/Folder.cs b/SabreTools.Library/FileTypes/Folder.cs
index a2fbe6c7..69cde234 100644
--- a/SabreTools.Library/FileTypes/Folder.cs
+++ b/SabreTools.Library/FileTypes/Folder.cs
@@ -37,6 +37,7 @@ namespace SabreTools.Library.FileTypes
public Folder()
: base()
{
+ _fileType = FileType.Folder;
}
///
@@ -47,6 +48,7 @@ namespace SabreTools.Library.FileTypes
public Folder(string filename)
: base(filename)
{
+ _fileType = FileType.Folder;
}
#endregion
diff --git a/SabreTools.Library/FileTypes/GZipArchive.cs b/SabreTools.Library/FileTypes/GZipArchive.cs
index f102dc0b..98ef07fa 100644
--- a/SabreTools.Library/FileTypes/GZipArchive.cs
+++ b/SabreTools.Library/FileTypes/GZipArchive.cs
@@ -21,7 +21,6 @@ using SeekOrigin = System.IO.SeekOrigin;
using Stream = System.IO.Stream;
#endif
using Ionic.Zlib;
-using SharpCompress.Common;
namespace SabreTools.Library.FileTypes
{
@@ -38,6 +37,7 @@ namespace SabreTools.Library.FileTypes
public GZipArchive()
: base()
{
+ _fileType = FileType.GZipArchive;
}
///
@@ -48,7 +48,7 @@ namespace SabreTools.Library.FileTypes
public GZipArchive(string filename)
: base(filename)
{
- _archiveType = ArchiveType.GZip;
+ _fileType = FileType.GZipArchive;
}
#endregion
diff --git a/SabreTools.Library/FileTypes/LRZipArchive.cs b/SabreTools.Library/FileTypes/LRZipArchive.cs
index 9cb46e0e..212f6c1b 100644
--- a/SabreTools.Library/FileTypes/LRZipArchive.cs
+++ b/SabreTools.Library/FileTypes/LRZipArchive.cs
@@ -27,6 +27,7 @@ namespace SabreTools.Library.FileTypes
public LRZipArchive()
: base()
{
+ _fileType = FileType.LRZipArchive;
}
///
@@ -36,7 +37,7 @@ namespace SabreTools.Library.FileTypes
public LRZipArchive(string filename)
: base(filename)
{
- //_archiveType = ArchiveType.LRZip;
+ _fileType = FileType.LRZipArchive;
}
#endregion
diff --git a/SabreTools.Library/FileTypes/LZ4Archive.cs b/SabreTools.Library/FileTypes/LZ4Archive.cs
index 9ef909e3..bd20b142 100644
--- a/SabreTools.Library/FileTypes/LZ4Archive.cs
+++ b/SabreTools.Library/FileTypes/LZ4Archive.cs
@@ -27,6 +27,7 @@ namespace SabreTools.Library.FileTypes
public LZ4Archive()
: base()
{
+ _fileType = FileType.LZ4Archive;
}
///
@@ -36,7 +37,7 @@ namespace SabreTools.Library.FileTypes
public LZ4Archive(string filename)
: base(filename)
{
- //_archiveType = ArchiveType.LRZip;
+ _fileType = FileType.LZ4Archive;
}
#endregion
diff --git a/SabreTools.Library/FileTypes/RarArchive.cs b/SabreTools.Library/FileTypes/RarArchive.cs
index 81451b26..e543f1f7 100644
--- a/SabreTools.Library/FileTypes/RarArchive.cs
+++ b/SabreTools.Library/FileTypes/RarArchive.cs
@@ -20,7 +20,6 @@ using Stream = System.IO.Stream;
#endif
using SharpCompress.Archives;
using SharpCompress.Archives.Rar;
-using SharpCompress.Common;
using SharpCompress.Readers;
namespace SabreTools.Library.FileTypes
@@ -38,6 +37,7 @@ namespace SabreTools.Library.FileTypes
public RarArchive()
: base()
{
+ _fileType = FileType.RarArchive;
}
///
@@ -48,7 +48,7 @@ namespace SabreTools.Library.FileTypes
public RarArchive(string filename)
: base(filename)
{
- _archiveType = ArchiveType.Rar;
+ _fileType = FileType.RarArchive;
}
#endregion
@@ -252,13 +252,13 @@ namespace SabreTools.Library.FileTypes
// Check for the signature first (Skipping the SFX Module)
byte[] signature = br.ReadBytes(8);
int startpos = 0;
- while (startpos < Constants.MibiByte && BitConverter.ToString(signature, 0, 7) != Constants.RarSignature && BitConverter.ToString(signature) != Constants.RarFiveSig)
+ while (startpos < Constants.MibiByte && !signature.StartsWith(Constants.RarSignature, exact: true) && !signature.StartsWith(Constants.RarFiveSignature, exact: true))
{
startpos++;
br.BaseStream.Position = startpos;
signature = br.ReadBytes(8);
}
- if (BitConverter.ToString(signature, 0, 7) != Constants.RarSignature && BitConverter.ToString(signature) != Constants.RarFiveSig)
+ if (!signature.StartsWith(Constants.RarSignature, exact: true) && !signature.StartsWith(Constants.RarFiveSignature, exact: true))
{
return;
}
diff --git a/SabreTools.Library/FileTypes/SevenZipArchive.cs b/SabreTools.Library/FileTypes/SevenZipArchive.cs
index 7ae2b907..9f577eac 100644
--- a/SabreTools.Library/FileTypes/SevenZipArchive.cs
+++ b/SabreTools.Library/FileTypes/SevenZipArchive.cs
@@ -22,7 +22,6 @@ using ROMVault2.SupportedFiles.Zip;
using SevenZip; // TODO: Remove this when 7zip write is implemented in SharpCompress
using SharpCompress.Archives;
using SharpCompress.Archives.SevenZip;
-using SharpCompress.Common;
using SharpCompress.Readers;
namespace SabreTools.Library.FileTypes
@@ -41,6 +40,7 @@ namespace SabreTools.Library.FileTypes
public SevenZipArchive()
: base()
{
+ _fileType = FileType.SevenZipArchive;
}
///
@@ -51,7 +51,7 @@ namespace SabreTools.Library.FileTypes
public SevenZipArchive(string filename)
: base(filename)
{
- _archiveType = ArchiveType.SevenZip;
+ _fileType = FileType.SevenZipArchive;
}
#endregion
diff --git a/SabreTools.Library/FileTypes/TapeArchive.cs b/SabreTools.Library/FileTypes/TapeArchive.cs
index e6d25496..b2d90863 100644
--- a/SabreTools.Library/FileTypes/TapeArchive.cs
+++ b/SabreTools.Library/FileTypes/TapeArchive.cs
@@ -40,6 +40,7 @@ namespace SabreTools.Library.FileTypes
public TapeArchive()
: base()
{
+ _fileType = FileType.TapeArchive;
}
///
@@ -50,7 +51,7 @@ namespace SabreTools.Library.FileTypes
public TapeArchive(string filename)
: base(filename)
{
- _archiveType = ArchiveType.Tar;
+ _fileType = FileType.TapeArchive;
}
#endregion
diff --git a/SabreTools.Library/FileTypes/TorrentZipArchive.cs b/SabreTools.Library/FileTypes/TorrentZipArchive.cs
index 8aa6615f..340254b0 100644
--- a/SabreTools.Library/FileTypes/TorrentZipArchive.cs
+++ b/SabreTools.Library/FileTypes/TorrentZipArchive.cs
@@ -36,6 +36,7 @@ namespace SabreTools.Library.FileTypes
public TorrentZipArchive()
: base()
{
+ _fileType = FileType.ZipArchive;
}
///
@@ -46,7 +47,7 @@ namespace SabreTools.Library.FileTypes
public TorrentZipArchive(string filename)
: base(filename)
{
- _archiveType = ArchiveType.Zip;
+ _fileType = FileType.ZipArchive;
}
#endregion
diff --git a/SabreTools.Library/FileTypes/XZArchive.cs b/SabreTools.Library/FileTypes/XZArchive.cs
index f84ab620..90f85ce3 100644
--- a/SabreTools.Library/FileTypes/XZArchive.cs
+++ b/SabreTools.Library/FileTypes/XZArchive.cs
@@ -40,6 +40,7 @@ namespace SabreTools.Library.FileTypes
public XZArchive()
: base()
{
+ _fileType = FileType.XZArchive;
}
///
@@ -50,7 +51,7 @@ namespace SabreTools.Library.FileTypes
public XZArchive(string filename)
: base(filename)
{
- //_archiveType = ArchiveType.XZip;
+ _fileType = FileType.XZArchive;
}
#endregion
diff --git a/SabreTools.Library/FileTypes/ZPAQArchive.cs b/SabreTools.Library/FileTypes/ZPAQArchive.cs
index 487b520a..969dafda 100644
--- a/SabreTools.Library/FileTypes/ZPAQArchive.cs
+++ b/SabreTools.Library/FileTypes/ZPAQArchive.cs
@@ -27,6 +27,7 @@ namespace SabreTools.Library.FileTypes
public ZPAQArchive()
: base()
{
+ _fileType = FileType.ZPAQArchive;
}
///
@@ -36,7 +37,7 @@ namespace SabreTools.Library.FileTypes
public ZPAQArchive(string filename)
: base(filename)
{
- //_archiveType = ArchiveType.LRZip;
+ _fileType = FileType.ZPAQArchive;
}
#endregion
diff --git a/SabreTools.Library/FileTypes/ZstdArchive.cs b/SabreTools.Library/FileTypes/ZstdArchive.cs
index ddae145a..3e861b35 100644
--- a/SabreTools.Library/FileTypes/ZstdArchive.cs
+++ b/SabreTools.Library/FileTypes/ZstdArchive.cs
@@ -27,6 +27,7 @@ namespace SabreTools.Library.FileTypes
public ZstdArchive()
: base()
{
+ _fileType = FileType.ZstdArchive;
}
///
@@ -36,7 +37,7 @@ namespace SabreTools.Library.FileTypes
public ZstdArchive(string filename)
: base(filename)
{
- //_archiveType = ArchiveType.LRZip;
+ _fileType = FileType.ZstdArchive;
}
#endregion
diff --git a/SabreTools.Library/SabreTools.Library.csproj b/SabreTools.Library/SabreTools.Library.csproj
index 035fe3aa..c9272f63 100644
--- a/SabreTools.Library/SabreTools.Library.csproj
+++ b/SabreTools.Library/SabreTools.Library.csproj
@@ -133,6 +133,7 @@
+
diff --git a/SabreTools.Library/Tools/Utilities.cs b/SabreTools.Library/Tools/Utilities.cs
index 5092b451..1e6d237b 100644
--- a/SabreTools.Library/Tools/Utilities.cs
+++ b/SabreTools.Library/Tools/Utilities.cs
@@ -466,13 +466,12 @@ namespace SabreTools.Library.Tools
case FileType.SevenZipArchive:
archive = new SevenZipArchive(input);
break;
- case FileType.TarArchive:
+ case FileType.TapeArchive:
archive = new TapeArchive(input);
break;
case FileType.ZipArchive:
archive = new TorrentZipArchive(input);
break;
- case FileType.CHD:
default:
// We ignore these types for now
break;
@@ -496,7 +495,7 @@ namespace SabreTools.Library.Tools
return new RarArchive();
case FileType.SevenZipArchive:
return new SevenZipArchive();
- case FileType.TarArchive:
+ case FileType.TapeArchive:
return new TapeArchive();
case FileType.ZipArchive:
return new TorrentZipArchive();
@@ -1320,7 +1319,7 @@ namespace SabreTools.Library.Tools
}
else if (magic.StartsWith(Constants.TarSignature) || magic.StartsWith(Constants.TarZeroSignature))
{
- outFileType = FileType.TarArchive;
+ outFileType = FileType.TapeArchive;
}
else if (magic.StartsWith(Constants.ZipSignature) || magic.StartsWith(Constants.ZipSignatureEmpty) || magic.StartsWith(Constants.ZipSignatureSpanned))
{
@@ -1350,12 +1349,7 @@ namespace SabreTools.Library.Tools
FileType? fileType = GetFileType(input);
switch (fileType)
- {
- case FileType.CHD:
- case null:
- shouldExternalProcess = true;
- shouldInternalProcess = false;
- break;
+ {
case FileType.GZipArchive:
shouldExternalProcess = ((archiveScanLevel & ArchiveScanLevel.GZipExternal) != 0);
shouldInternalProcess = ((archiveScanLevel & ArchiveScanLevel.GZipInternal) != 0);
@@ -1372,6 +1366,11 @@ namespace SabreTools.Library.Tools
shouldExternalProcess = ((archiveScanLevel & ArchiveScanLevel.ZipExternal) != 0);
shouldInternalProcess = ((archiveScanLevel & ArchiveScanLevel.ZipInternal) != 0);
break;
+ case null:
+ default:
+ shouldExternalProcess = true;
+ shouldInternalProcess = false;
+ break;
}
}