diff --git a/.gitignore b/.gitignore index 8dc62d63..4210b7ee 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,8 @@ /SabreTools/SabreTools.csproj.user /SabreTools.Core/bin/ /SabreTools.Core/obj/ +/SabreTools.FileTypes/bin/ +/SabreTools.FileTypes/obj/ /SabreTools.Filtering/bin/ /SabreTools.Filtering/obj/ /SabreTools.Help/bin/ diff --git a/RombaSharp/Features/BaseFeature.cs b/RombaSharp/Features/BaseFeature.cs index 27974410..ff05ecad 100644 --- a/RombaSharp/Features/BaseFeature.cs +++ b/RombaSharp/Features/BaseFeature.cs @@ -6,11 +6,11 @@ using System.Xml; using System.Xml.Schema; using SabreTools.Core; +using SabreTools.FileTypes; using SabreTools.Help; using SabreTools.Logging; using SabreTools.Library.DatFiles; using SabreTools.Library.DatItems; -using SabreTools.Library.FileTypes; using Microsoft.Data.Sqlite; namespace RombaSharp.Features diff --git a/RombaSharp/RombaSharp.csproj b/RombaSharp/RombaSharp.csproj index c38d1d22..04c39422 100644 --- a/RombaSharp/RombaSharp.csproj +++ b/RombaSharp/RombaSharp.csproj @@ -17,6 +17,7 @@ + diff --git a/SabreTools.Library/External/NaturalSort/NaturalComparer.cs b/SabreTools.Core/NaturalSort/NaturalComparer.cs similarity index 99% rename from SabreTools.Library/External/NaturalSort/NaturalComparer.cs rename to SabreTools.Core/NaturalSort/NaturalComparer.cs index 6a644494..43bfaa60 100644 --- a/SabreTools.Library/External/NaturalSort/NaturalComparer.cs +++ b/SabreTools.Core/NaturalSort/NaturalComparer.cs @@ -11,7 +11,6 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Text.RegularExpressions; diff --git a/SabreTools.Library/External/NaturalSort/NaturalComparerUtil.cs b/SabreTools.Core/NaturalSort/NaturalComparerUtil.cs similarity index 100% rename from SabreTools.Library/External/NaturalSort/NaturalComparerUtil.cs rename to SabreTools.Core/NaturalSort/NaturalComparerUtil.cs diff --git a/SabreTools.Library/External/NaturalSort/NaturalReversedComparer.cs b/SabreTools.Core/NaturalSort/NaturalReversedComparer.cs similarity index 100% rename from SabreTools.Library/External/NaturalSort/NaturalReversedComparer.cs rename to SabreTools.Core/NaturalSort/NaturalReversedComparer.cs diff --git a/SabreTools.Library/FileTypes/Aaru/ChecksumEntry.cs b/SabreTools.FileTypes/Aaru/ChecksumEntry.cs similarity index 97% rename from SabreTools.Library/FileTypes/Aaru/ChecksumEntry.cs rename to SabreTools.FileTypes/Aaru/ChecksumEntry.cs index 4290cd27..209417a4 100644 --- a/SabreTools.Library/FileTypes/Aaru/ChecksumEntry.cs +++ b/SabreTools.FileTypes/Aaru/ChecksumEntry.cs @@ -3,7 +3,7 @@ using System.Text; using SabreTools.Core; -namespace SabreTools.Library.FileTypes.Aaru +namespace SabreTools.FileTypes.Aaru { /// /// Checksum entry, followed by checksum data itself diff --git a/SabreTools.Library/FileTypes/Aaru/ChecksumHeader.cs b/SabreTools.FileTypes/Aaru/ChecksumHeader.cs similarity index 96% rename from SabreTools.Library/FileTypes/Aaru/ChecksumHeader.cs rename to SabreTools.FileTypes/Aaru/ChecksumHeader.cs index 9ec65d69..fdab4b75 100644 --- a/SabreTools.Library/FileTypes/Aaru/ChecksumHeader.cs +++ b/SabreTools.FileTypes/Aaru/ChecksumHeader.cs @@ -3,7 +3,7 @@ using System.Text; using SabreTools.Core; -namespace SabreTools.Library.FileTypes.Aaru +namespace SabreTools.FileTypes.Aaru { /// /// Checksum block, contains a checksum of all user data sectors diff --git a/SabreTools.Library/FileTypes/Aaru/IndexEntry.cs b/SabreTools.FileTypes/Aaru/IndexEntry.cs similarity index 96% rename from SabreTools.Library/FileTypes/Aaru/IndexEntry.cs rename to SabreTools.FileTypes/Aaru/IndexEntry.cs index e8437a20..d285863e 100644 --- a/SabreTools.Library/FileTypes/Aaru/IndexEntry.cs +++ b/SabreTools.FileTypes/Aaru/IndexEntry.cs @@ -3,7 +3,7 @@ using System.Text; using SabreTools.Core; -namespace SabreTools.Library.FileTypes.Aaru +namespace SabreTools.FileTypes.Aaru { /// /// Index entry diff --git a/SabreTools.Library/FileTypes/Aaru/IndexHeader.cs b/SabreTools.FileTypes/Aaru/IndexHeader.cs similarity index 96% rename from SabreTools.Library/FileTypes/Aaru/IndexHeader.cs rename to SabreTools.FileTypes/Aaru/IndexHeader.cs index 8271e7b9..ae1445e7 100644 --- a/SabreTools.Library/FileTypes/Aaru/IndexHeader.cs +++ b/SabreTools.FileTypes/Aaru/IndexHeader.cs @@ -3,7 +3,7 @@ using System.Text; using SabreTools.Core; -namespace SabreTools.Library.FileTypes.Aaru +namespace SabreTools.FileTypes.Aaru { /// /// Header for the index, followed by entries diff --git a/SabreTools.Library/FileTypes/AaruFormat.cs b/SabreTools.FileTypes/AaruFormat.cs similarity index 98% rename from SabreTools.Library/FileTypes/AaruFormat.cs rename to SabreTools.FileTypes/AaruFormat.cs index 6b7d195f..079facec 100644 --- a/SabreTools.Library/FileTypes/AaruFormat.cs +++ b/SabreTools.FileTypes/AaruFormat.cs @@ -1,12 +1,11 @@ -using System; -using System.IO; +using System.IO; using System.Text; using SabreTools.IO; using SabreTools.Core; -using SabreTools.Library.FileTypes.Aaru; +using SabreTools.FileTypes.Aaru; -namespace SabreTools.Library.FileTypes +namespace SabreTools.FileTypes { /// /// AaruFormat code is based on the Aaru project diff --git a/SabreTools.Library/FileTypes/BaseArchive.cs b/SabreTools.FileTypes/BaseArchive.cs similarity index 99% rename from SabreTools.Library/FileTypes/BaseArchive.cs rename to SabreTools.FileTypes/BaseArchive.cs index db75f143..92d3c498 100644 --- a/SabreTools.Library/FileTypes/BaseArchive.cs +++ b/SabreTools.FileTypes/BaseArchive.cs @@ -3,7 +3,7 @@ using System.IO; using SabreTools.Core; -namespace SabreTools.Library.FileTypes +namespace SabreTools.FileTypes { public abstract class BaseArchive : Folder { diff --git a/SabreTools.Library/FileTypes/BaseFile.cs b/SabreTools.FileTypes/BaseFile.cs similarity index 98% rename from SabreTools.Library/FileTypes/BaseFile.cs rename to SabreTools.FileTypes/BaseFile.cs index 7b65ec4f..eef31e87 100644 --- a/SabreTools.Library/FileTypes/BaseFile.cs +++ b/SabreTools.FileTypes/BaseFile.cs @@ -1,16 +1,15 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; using SabreTools.Core; using SabreTools.IO; -using SabreTools.Library.IO; using SabreTools.Logging; +using SabreTools.Skippers; using Compress.ThreadReaders; -namespace SabreTools.Library.FileTypes +namespace SabreTools.FileTypes { public class BaseFile { @@ -268,7 +267,7 @@ namespace SabreTools.Library.FileTypes // Try to match the supplied header skipper if (header != null) { - var rule = Transform.GetMatchingRule(input, Path.GetFileNameWithoutExtension(header)); + var rule = SkipperMatch.GetMatchingRule(input, Path.GetFileNameWithoutExtension(header)); // If there's a match, transform the stream before getting info if (rule.Tests != null && rule.Tests.Count != 0) diff --git a/SabreTools.Library/FileTypes/CHD/CHDFileV1.cs b/SabreTools.FileTypes/CHD/CHDFileV1.cs similarity index 98% rename from SabreTools.Library/FileTypes/CHD/CHDFileV1.cs rename to SabreTools.FileTypes/CHD/CHDFileV1.cs index a8ba7d4c..2f6ffba5 100644 --- a/SabreTools.Library/FileTypes/CHD/CHDFileV1.cs +++ b/SabreTools.FileTypes/CHD/CHDFileV1.cs @@ -4,7 +4,7 @@ using System.Text; using SabreTools.IO; -namespace SabreTools.Library.FileTypes.CHD +namespace SabreTools.FileTypes.CHD { /// /// CHD V1 File diff --git a/SabreTools.Library/FileTypes/CHD/CHDFileV2.cs b/SabreTools.FileTypes/CHD/CHDFileV2.cs similarity index 98% rename from SabreTools.Library/FileTypes/CHD/CHDFileV2.cs rename to SabreTools.FileTypes/CHD/CHDFileV2.cs index fa2e8a71..d89bec34 100644 --- a/SabreTools.Library/FileTypes/CHD/CHDFileV2.cs +++ b/SabreTools.FileTypes/CHD/CHDFileV2.cs @@ -4,7 +4,7 @@ using System.Text; using SabreTools.IO; -namespace SabreTools.Library.FileTypes.CHD +namespace SabreTools.FileTypes.CHD { /// /// CHD V2 File diff --git a/SabreTools.Library/FileTypes/CHD/CHDFileV3.cs b/SabreTools.FileTypes/CHD/CHDFileV3.cs similarity index 98% rename from SabreTools.Library/FileTypes/CHD/CHDFileV3.cs rename to SabreTools.FileTypes/CHD/CHDFileV3.cs index d73da00c..a18d2d07 100644 --- a/SabreTools.Library/FileTypes/CHD/CHDFileV3.cs +++ b/SabreTools.FileTypes/CHD/CHDFileV3.cs @@ -4,7 +4,7 @@ using System.Text; using SabreTools.IO; -namespace SabreTools.Library.FileTypes.CHD +namespace SabreTools.FileTypes.CHD { /// /// CHD V3 File diff --git a/SabreTools.Library/FileTypes/CHD/CHDFileV4.cs b/SabreTools.FileTypes/CHD/CHDFileV4.cs similarity index 98% rename from SabreTools.Library/FileTypes/CHD/CHDFileV4.cs rename to SabreTools.FileTypes/CHD/CHDFileV4.cs index 5ebcd452..b26a6663 100644 --- a/SabreTools.Library/FileTypes/CHD/CHDFileV4.cs +++ b/SabreTools.FileTypes/CHD/CHDFileV4.cs @@ -4,7 +4,7 @@ using System.Text; using SabreTools.IO; -namespace SabreTools.Library.FileTypes.CHD +namespace SabreTools.FileTypes.CHD { /// /// CHD V4 File diff --git a/SabreTools.Library/FileTypes/CHD/CHDFileV5.cs b/SabreTools.FileTypes/CHD/CHDFileV5.cs similarity index 98% rename from SabreTools.Library/FileTypes/CHD/CHDFileV5.cs rename to SabreTools.FileTypes/CHD/CHDFileV5.cs index 1a25171a..ab55c3a2 100644 --- a/SabreTools.Library/FileTypes/CHD/CHDFileV5.cs +++ b/SabreTools.FileTypes/CHD/CHDFileV5.cs @@ -3,7 +3,7 @@ using System.Text; using SabreTools.IO; -namespace SabreTools.Library.FileTypes.CHD +namespace SabreTools.FileTypes.CHD { /// /// CHD V5 File diff --git a/SabreTools.Library/FileTypes/CHDFile.cs b/SabreTools.FileTypes/CHDFile.cs similarity index 98% rename from SabreTools.Library/FileTypes/CHDFile.cs rename to SabreTools.FileTypes/CHDFile.cs index d68e8638..f72e04b2 100644 --- a/SabreTools.Library/FileTypes/CHDFile.cs +++ b/SabreTools.FileTypes/CHDFile.cs @@ -4,9 +4,9 @@ using System.Text; using SabreTools.Core; using SabreTools.IO; -using SabreTools.Library.FileTypes.CHD; +using SabreTools.FileTypes.CHD; -namespace SabreTools.Library.FileTypes +namespace SabreTools.FileTypes { /// /// This is code adapted from chd.h and chd.cpp in MAME diff --git a/SabreTools.Library/External/Compress/File/File.cs b/SabreTools.FileTypes/Compress/File/File.cs similarity index 100% rename from SabreTools.Library/External/Compress/File/File.cs rename to SabreTools.FileTypes/Compress/File/File.cs diff --git a/SabreTools.Library/External/Compress/ICompress.cs b/SabreTools.FileTypes/Compress/ICompress.cs similarity index 100% rename from SabreTools.Library/External/Compress/ICompress.cs rename to SabreTools.FileTypes/Compress/ICompress.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Common/ICoder.cs b/SabreTools.FileTypes/Compress/SevenZip/Common/ICoder.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Common/ICoder.cs rename to SabreTools.FileTypes/Compress/SevenZip/Common/ICoder.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/BZip2/BZip2Constants.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/BZip2/BZip2Constants.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/BZip2/BZip2Constants.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/BZip2/BZip2Constants.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/BZip2/CBZip2InputStream.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/BZip2/CBZip2InputStream.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/BZip2/CBZip2InputStream.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/BZip2/CBZip2InputStream.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/BZip2/CBZip2OutputStream.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/BZip2/CBZip2OutputStream.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/BZip2/CBZip2OutputStream.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/BZip2/CBZip2OutputStream.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/BZip2/CRC.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/BZip2/CRC.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/BZip2/CRC.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/BZip2/CRC.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/LZ/LzBinTree.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/LZ/LzBinTree.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/LZ/LzBinTree.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/LZ/LzBinTree.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/LZ/LzInWindow.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/LZ/LzInWindow.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/LZ/LzInWindow.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/LZ/LzInWindow.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/LZ/LzOutWindow.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/LZ/LzOutWindow.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/LZ/LzOutWindow.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/LZ/LzOutWindow.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/LZMA/LzmaBase.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/LZMA/LzmaBase.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/LZMA/LzmaBase.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/LZMA/LzmaBase.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/LZMA/LzmaDecoder.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/LZMA/LzmaDecoder.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/LZMA/LzmaDecoder.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/LZMA/LzmaDecoder.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/LZMA/LzmaEncoder.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/LZMA/LzmaEncoder.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/LZMA/LzmaEncoder.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/LZMA/LzmaEncoder.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/LZMA/LzmaEncoderProperties.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/LZMA/LzmaEncoderProperties.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/LZMA/LzmaEncoderProperties.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/LZMA/LzmaEncoderProperties.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/LZMA/LzmaStream.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/LZMA/LzmaStream.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/LZMA/LzmaStream.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/LZMA/LzmaStream.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/H/FreqData.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/H/FreqData.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/H/FreqData.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/H/FreqData.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/H/ModelPPM.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/H/ModelPPM.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/H/ModelPPM.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/H/ModelPPM.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/H/PPMContext.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/H/PPMContext.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/H/PPMContext.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/H/PPMContext.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/H/Pointer.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/H/Pointer.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/H/Pointer.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/H/Pointer.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/H/RangeCoder.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/H/RangeCoder.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/H/RangeCoder.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/H/RangeCoder.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/H/RarMemBlock.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/H/RarMemBlock.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/H/RarMemBlock.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/H/RarMemBlock.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/H/RarNode.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/H/RarNode.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/H/RarNode.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/H/RarNode.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/H/SEE2Context.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/H/SEE2Context.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/H/SEE2Context.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/H/SEE2Context.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/H/State.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/H/State.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/H/State.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/H/State.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/H/StateRef.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/H/StateRef.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/H/StateRef.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/H/StateRef.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/H/SubAllocator.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/H/SubAllocator.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/H/SubAllocator.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/H/SubAllocator.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/I1/Allocator.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/I1/Allocator.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/I1/Allocator.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/I1/Allocator.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/I1/Coder.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/I1/Coder.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/I1/Coder.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/I1/Coder.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/I1/MemoryNode.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/I1/MemoryNode.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/I1/MemoryNode.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/I1/MemoryNode.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/I1/Model.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/I1/Model.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/I1/Model.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/I1/Model.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/I1/ModelRestorationMethod.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/I1/ModelRestorationMethod.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/I1/ModelRestorationMethod.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/I1/ModelRestorationMethod.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/I1/Pointer.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/I1/Pointer.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/I1/Pointer.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/I1/Pointer.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/I1/PpmContext.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/I1/PpmContext.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/I1/PpmContext.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/I1/PpmContext.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/I1/PpmState.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/I1/PpmState.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/I1/PpmState.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/I1/PpmState.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/I1/See2Context.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/I1/See2Context.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/I1/See2Context.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/I1/See2Context.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/PpmdProperties.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/PpmdProperties.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/PpmdProperties.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/PpmdProperties.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/PpmdStream.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/PpmdStream.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/PpmdStream.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/PpmdStream.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/Utility.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/Utility.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/PPmd/Utility.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/PPmd/Utility.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/RangeCoder/RangeCoder.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/RangeCoder/RangeCoder.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/RangeCoder/RangeCoder.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/RangeCoder/RangeCoder.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/RangeCoder/RangeCoderBit.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/RangeCoder/RangeCoderBit.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/RangeCoder/RangeCoderBit.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/RangeCoder/RangeCoderBit.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/RangeCoder/RangeCoderBitTree.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/RangeCoder/RangeCoderBitTree.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/RangeCoder/RangeCoderBitTree.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/RangeCoder/RangeCoderBitTree.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/ZSTD/ZstandardDictionary.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/ZSTD/ZstandardDictionary.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/ZSTD/ZstandardDictionary.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/ZSTD/ZstandardDictionary.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/ZSTD/ZstandardInterop.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/ZSTD/ZstandardInterop.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/ZSTD/ZstandardInterop.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/ZSTD/ZstandardInterop.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Compress/ZSTD/ZstandardStream.cs b/SabreTools.FileTypes/Compress/SevenZip/Compress/ZSTD/ZstandardStream.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Compress/ZSTD/ZstandardStream.cs rename to SabreTools.FileTypes/Compress/SevenZip/Compress/ZSTD/ZstandardStream.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Filters/BCJ2Filter.cs b/SabreTools.FileTypes/Compress/SevenZip/Filters/BCJ2Filter.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Filters/BCJ2Filter.cs rename to SabreTools.FileTypes/Compress/SevenZip/Filters/BCJ2Filter.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Filters/BCJFilter.cs b/SabreTools.FileTypes/Compress/SevenZip/Filters/BCJFilter.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Filters/BCJFilter.cs rename to SabreTools.FileTypes/Compress/SevenZip/Filters/BCJFilter.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Filters/Delta.cs b/SabreTools.FileTypes/Compress/SevenZip/Filters/Delta.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Filters/Delta.cs rename to SabreTools.FileTypes/Compress/SevenZip/Filters/Delta.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Filters/Filter.cs b/SabreTools.FileTypes/Compress/SevenZip/Filters/Filter.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Filters/Filter.cs rename to SabreTools.FileTypes/Compress/SevenZip/Filters/Filter.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/SevenZip.cs b/SabreTools.FileTypes/Compress/SevenZip/SevenZip.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/SevenZip.cs rename to SabreTools.FileTypes/Compress/SevenZip/SevenZip.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/SevenZipOpen.cs b/SabreTools.FileTypes/Compress/SevenZip/SevenZipOpen.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/SevenZipOpen.cs rename to SabreTools.FileTypes/Compress/SevenZip/SevenZipOpen.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/SevenZipOpenRead.cs b/SabreTools.FileTypes/Compress/SevenZip/SevenZipOpenRead.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/SevenZipOpenRead.cs rename to SabreTools.FileTypes/Compress/SevenZip/SevenZipOpenRead.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/SevenZipTorrent.cs b/SabreTools.FileTypes/Compress/SevenZip/SevenZipTorrent.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/SevenZipTorrent.cs rename to SabreTools.FileTypes/Compress/SevenZip/SevenZipTorrent.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/SevenZipWrite.cs b/SabreTools.FileTypes/Compress/SevenZip/SevenZipWrite.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/SevenZipWrite.cs rename to SabreTools.FileTypes/Compress/SevenZip/SevenZipWrite.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/SevenZipWriteClose.cs b/SabreTools.FileTypes/Compress/SevenZip/SevenZipWriteClose.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/SevenZipWriteClose.cs rename to SabreTools.FileTypes/Compress/SevenZip/SevenZipWriteClose.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Structure/BindPair.cs b/SabreTools.FileTypes/Compress/SevenZip/Structure/BindPair.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Structure/BindPair.cs rename to SabreTools.FileTypes/Compress/SevenZip/Structure/BindPair.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Structure/Coder.cs b/SabreTools.FileTypes/Compress/SevenZip/Structure/Coder.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Structure/Coder.cs rename to SabreTools.FileTypes/Compress/SevenZip/Structure/Coder.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Structure/FileInfo.cs b/SabreTools.FileTypes/Compress/SevenZip/Structure/FileInfo.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Structure/FileInfo.cs rename to SabreTools.FileTypes/Compress/SevenZip/Structure/FileInfo.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Structure/Folder.cs b/SabreTools.FileTypes/Compress/SevenZip/Structure/Folder.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Structure/Folder.cs rename to SabreTools.FileTypes/Compress/SevenZip/Structure/Folder.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Structure/Header.cs b/SabreTools.FileTypes/Compress/SevenZip/Structure/Header.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Structure/Header.cs rename to SabreTools.FileTypes/Compress/SevenZip/Structure/Header.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Structure/PackedStreamInfo.cs b/SabreTools.FileTypes/Compress/SevenZip/Structure/PackedStreamInfo.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Structure/PackedStreamInfo.cs rename to SabreTools.FileTypes/Compress/SevenZip/Structure/PackedStreamInfo.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Structure/SignatureHeader.cs b/SabreTools.FileTypes/Compress/SevenZip/Structure/SignatureHeader.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Structure/SignatureHeader.cs rename to SabreTools.FileTypes/Compress/SevenZip/Structure/SignatureHeader.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Structure/StreamsInfo.cs b/SabreTools.FileTypes/Compress/SevenZip/Structure/StreamsInfo.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Structure/StreamsInfo.cs rename to SabreTools.FileTypes/Compress/SevenZip/Structure/StreamsInfo.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Structure/UnpackedStreamInfo.cs b/SabreTools.FileTypes/Compress/SevenZip/Structure/UnpackedStreamInfo.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Structure/UnpackedStreamInfo.cs rename to SabreTools.FileTypes/Compress/SevenZip/Structure/UnpackedStreamInfo.cs diff --git a/SabreTools.Library/External/Compress/SevenZip/Util.cs b/SabreTools.FileTypes/Compress/SevenZip/Util.cs similarity index 100% rename from SabreTools.Library/External/Compress/SevenZip/Util.cs rename to SabreTools.FileTypes/Compress/SevenZip/Util.cs diff --git a/SabreTools.Library/External/Compress/ThreadReaders/ThreadCRC.cs b/SabreTools.FileTypes/Compress/ThreadReaders/ThreadCRC.cs similarity index 100% rename from SabreTools.Library/External/Compress/ThreadReaders/ThreadCRC.cs rename to SabreTools.FileTypes/Compress/ThreadReaders/ThreadCRC.cs diff --git a/SabreTools.Library/External/Compress/ThreadReaders/ThreadLoadBuffer.cs b/SabreTools.FileTypes/Compress/ThreadReaders/ThreadLoadBuffer.cs similarity index 100% rename from SabreTools.Library/External/Compress/ThreadReaders/ThreadLoadBuffer.cs rename to SabreTools.FileTypes/Compress/ThreadReaders/ThreadLoadBuffer.cs diff --git a/SabreTools.Library/External/Compress/ThreadReaders/ThreadMD5.cs b/SabreTools.FileTypes/Compress/ThreadReaders/ThreadMD5.cs similarity index 100% rename from SabreTools.Library/External/Compress/ThreadReaders/ThreadMD5.cs rename to SabreTools.FileTypes/Compress/ThreadReaders/ThreadMD5.cs diff --git a/SabreTools.Library/External/Compress/ThreadReaders/ThreadSHA1.cs b/SabreTools.FileTypes/Compress/ThreadReaders/ThreadSHA1.cs similarity index 100% rename from SabreTools.Library/External/Compress/ThreadReaders/ThreadSHA1.cs rename to SabreTools.FileTypes/Compress/ThreadReaders/ThreadSHA1.cs diff --git a/SabreTools.Library/External/Compress/Utils/CRC.cs b/SabreTools.FileTypes/Compress/Utils/CRC.cs similarity index 100% rename from SabreTools.Library/External/Compress/Utils/CRC.cs rename to SabreTools.FileTypes/Compress/Utils/CRC.cs diff --git a/SabreTools.Library/External/Compress/Utils/CRCStream.cs b/SabreTools.FileTypes/Compress/Utils/CRCStream.cs similarity index 100% rename from SabreTools.Library/External/Compress/Utils/CRCStream.cs rename to SabreTools.FileTypes/Compress/Utils/CRCStream.cs diff --git a/SabreTools.Library/External/Compress/Utils/DirUtil.cs b/SabreTools.FileTypes/Compress/Utils/DirUtil.cs similarity index 100% rename from SabreTools.Library/External/Compress/Utils/DirUtil.cs rename to SabreTools.FileTypes/Compress/Utils/DirUtil.cs diff --git a/SabreTools.Library/External/Compress/Utils/Reporter.cs b/SabreTools.FileTypes/Compress/Utils/Reporter.cs similarity index 100% rename from SabreTools.Library/External/Compress/Utils/Reporter.cs rename to SabreTools.FileTypes/Compress/Utils/Reporter.cs diff --git a/SabreTools.Library/External/Compress/ZipEnums.cs b/SabreTools.FileTypes/Compress/ZipEnums.cs similarity index 100% rename from SabreTools.Library/External/Compress/ZipEnums.cs rename to SabreTools.FileTypes/Compress/ZipEnums.cs diff --git a/SabreTools.Library/External/Compress/ZipFile/ZLib/Deflate.cs b/SabreTools.FileTypes/Compress/ZipFile/ZLib/Deflate.cs similarity index 100% rename from SabreTools.Library/External/Compress/ZipFile/ZLib/Deflate.cs rename to SabreTools.FileTypes/Compress/ZipFile/ZLib/Deflate.cs diff --git a/SabreTools.Library/External/Compress/ZipFile/ZLib/InfTree.cs b/SabreTools.FileTypes/Compress/ZipFile/ZLib/InfTree.cs similarity index 100% rename from SabreTools.Library/External/Compress/ZipFile/ZLib/InfTree.cs rename to SabreTools.FileTypes/Compress/ZipFile/ZLib/InfTree.cs diff --git a/SabreTools.Library/External/Compress/ZipFile/ZLib/Inflate.cs b/SabreTools.FileTypes/Compress/ZipFile/ZLib/Inflate.cs similarity index 100% rename from SabreTools.Library/External/Compress/ZipFile/ZLib/Inflate.cs rename to SabreTools.FileTypes/Compress/ZipFile/ZLib/Inflate.cs diff --git a/SabreTools.Library/External/Compress/ZipFile/ZLib/Tree.cs b/SabreTools.FileTypes/Compress/ZipFile/ZLib/Tree.cs similarity index 100% rename from SabreTools.Library/External/Compress/ZipFile/ZLib/Tree.cs rename to SabreTools.FileTypes/Compress/ZipFile/ZLib/Tree.cs diff --git a/SabreTools.Library/External/Compress/ZipFile/ZLib/Zlib.cs b/SabreTools.FileTypes/Compress/ZipFile/ZLib/Zlib.cs similarity index 100% rename from SabreTools.Library/External/Compress/ZipFile/ZLib/Zlib.cs rename to SabreTools.FileTypes/Compress/ZipFile/ZLib/Zlib.cs diff --git a/SabreTools.Library/External/Compress/ZipFile/ZLib/ZlibBaseStream.cs b/SabreTools.FileTypes/Compress/ZipFile/ZLib/ZlibBaseStream.cs similarity index 100% rename from SabreTools.Library/External/Compress/ZipFile/ZLib/ZlibBaseStream.cs rename to SabreTools.FileTypes/Compress/ZipFile/ZLib/ZlibBaseStream.cs diff --git a/SabreTools.Library/External/Compress/ZipFile/ZLib/ZlibCodec.cs b/SabreTools.FileTypes/Compress/ZipFile/ZLib/ZlibCodec.cs similarity index 100% rename from SabreTools.Library/External/Compress/ZipFile/ZLib/ZlibCodec.cs rename to SabreTools.FileTypes/Compress/ZipFile/ZLib/ZlibCodec.cs diff --git a/SabreTools.Library/External/Compress/ZipFile/ZLib/ZlibConstants.cs b/SabreTools.FileTypes/Compress/ZipFile/ZLib/ZlibConstants.cs similarity index 100% rename from SabreTools.Library/External/Compress/ZipFile/ZLib/ZlibConstants.cs rename to SabreTools.FileTypes/Compress/ZipFile/ZLib/ZlibConstants.cs diff --git a/SabreTools.Library/External/Compress/ZipFile/zipFile.cs b/SabreTools.FileTypes/Compress/ZipFile/zipFile.cs similarity index 100% rename from SabreTools.Library/External/Compress/ZipFile/zipFile.cs rename to SabreTools.FileTypes/Compress/ZipFile/zipFile.cs diff --git a/SabreTools.Library/External/Compress/gZip/gZip.cs b/SabreTools.FileTypes/Compress/gZip/gZip.cs similarity index 100% rename from SabreTools.Library/External/Compress/gZip/gZip.cs rename to SabreTools.FileTypes/Compress/gZip/gZip.cs diff --git a/SabreTools.Library/FileTypes/Folder.cs b/SabreTools.FileTypes/Folder.cs similarity index 99% rename from SabreTools.Library/FileTypes/Folder.cs rename to SabreTools.FileTypes/Folder.cs index 382fb5a3..8228cd79 100644 --- a/SabreTools.Library/FileTypes/Folder.cs +++ b/SabreTools.FileTypes/Folder.cs @@ -7,7 +7,7 @@ using SabreTools.Core; using SabreTools.IO; using SabreTools.Logging; -namespace SabreTools.Library.FileTypes +namespace SabreTools.FileTypes { /// /// Represents a folder for reading and writing diff --git a/SabreTools.Library/FileTypes/GZipArchive.cs b/SabreTools.FileTypes/GZipArchive.cs similarity index 99% rename from SabreTools.Library/FileTypes/GZipArchive.cs rename to SabreTools.FileTypes/GZipArchive.cs index 072f6caa..bf953f5c 100644 --- a/SabreTools.Library/FileTypes/GZipArchive.cs +++ b/SabreTools.FileTypes/GZipArchive.cs @@ -10,7 +10,7 @@ using Compress; using Compress.gZip; using Compress.ZipFile.ZLib; -namespace SabreTools.Library.FileTypes +namespace SabreTools.FileTypes { /// /// Represents a TorrentGZip archive for reading and writing diff --git a/SabreTools.Library/FileTypes/LRZipArchive.cs b/SabreTools.FileTypes/LRZipArchive.cs similarity index 98% rename from SabreTools.Library/FileTypes/LRZipArchive.cs rename to SabreTools.FileTypes/LRZipArchive.cs index 769ef5a0..b8efd51e 100644 --- a/SabreTools.Library/FileTypes/LRZipArchive.cs +++ b/SabreTools.FileTypes/LRZipArchive.cs @@ -4,7 +4,7 @@ using System.IO; using SabreTools.Core; -namespace SabreTools.Library.FileTypes +namespace SabreTools.FileTypes { /// /// Represents a TorrentLRZip archive for reading and writing diff --git a/SabreTools.Library/FileTypes/LZ4Archive.cs b/SabreTools.FileTypes/LZ4Archive.cs similarity index 98% rename from SabreTools.Library/FileTypes/LZ4Archive.cs rename to SabreTools.FileTypes/LZ4Archive.cs index b214c357..192c9ccc 100644 --- a/SabreTools.Library/FileTypes/LZ4Archive.cs +++ b/SabreTools.FileTypes/LZ4Archive.cs @@ -4,7 +4,7 @@ using System.IO; using SabreTools.Core; -namespace SabreTools.Library.FileTypes +namespace SabreTools.FileTypes { /// /// Represents a TorrentLRZip archive for reading and writing diff --git a/SabreTools.Library/External/RVIO/RVIO.cs b/SabreTools.FileTypes/RVIO/RVIO.cs similarity index 100% rename from SabreTools.Library/External/RVIO/RVIO.cs rename to SabreTools.FileTypes/RVIO/RVIO.cs diff --git a/SabreTools.Library/External/RVIO/Win32Native.cs b/SabreTools.FileTypes/RVIO/Win32Native.cs similarity index 100% rename from SabreTools.Library/External/RVIO/Win32Native.cs rename to SabreTools.FileTypes/RVIO/Win32Native.cs diff --git a/SabreTools.Library/FileTypes/RarArchive.cs b/SabreTools.FileTypes/RarArchive.cs similarity index 99% rename from SabreTools.Library/FileTypes/RarArchive.cs rename to SabreTools.FileTypes/RarArchive.cs index bc5628ea..127fe036 100644 --- a/SabreTools.Library/FileTypes/RarArchive.cs +++ b/SabreTools.FileTypes/RarArchive.cs @@ -8,7 +8,7 @@ using SharpCompress.Archives; using SharpCompress.Archives.Rar; using SharpCompress.Readers; -namespace SabreTools.Library.FileTypes +namespace SabreTools.FileTypes { /// /// Represents a TorrentRAR archive for reading and writing diff --git a/SabreTools.FileTypes/SabreTools.FileTypes.csproj b/SabreTools.FileTypes/SabreTools.FileTypes.csproj new file mode 100644 index 00000000..9843a60f --- /dev/null +++ b/SabreTools.FileTypes/SabreTools.FileTypes.csproj @@ -0,0 +1,25 @@ + + + + net48;netcoreapp3.1;net5.0 + win10-x64;win7-x86 + Debug;Release + AnyCPU;x64 + + + + NET_FRAMEWORK + + + + + + + + + + + + + + diff --git a/SabreTools.Library/FileTypes/SevenZipArchive.cs b/SabreTools.FileTypes/SevenZipArchive.cs similarity index 99% rename from SabreTools.Library/FileTypes/SevenZipArchive.cs rename to SabreTools.FileTypes/SevenZipArchive.cs index 3d6fc394..caa66747 100644 --- a/SabreTools.Library/FileTypes/SevenZipArchive.cs +++ b/SabreTools.FileTypes/SevenZipArchive.cs @@ -9,7 +9,7 @@ using Compress.SevenZip; using Compress.ZipFile; using NaturalSort; -namespace SabreTools.Library.FileTypes +namespace SabreTools.FileTypes { /// /// Represents a Torrent7zip archive for reading and writing diff --git a/SabreTools.Library/FileTypes/TapeArchive.cs b/SabreTools.FileTypes/TapeArchive.cs similarity index 99% rename from SabreTools.Library/FileTypes/TapeArchive.cs rename to SabreTools.FileTypes/TapeArchive.cs index 1a2c79fc..f3df421c 100644 --- a/SabreTools.Library/FileTypes/TapeArchive.cs +++ b/SabreTools.FileTypes/TapeArchive.cs @@ -11,7 +11,7 @@ using SharpCompress.Common; using SharpCompress.Readers; using SharpCompress.Writers; -namespace SabreTools.Library.FileTypes +namespace SabreTools.FileTypes { /// /// Represents a Tape archive for reading and writing diff --git a/SabreTools.Library/FileTypes/XZArchive.cs b/SabreTools.FileTypes/XZArchive.cs similarity index 99% rename from SabreTools.Library/FileTypes/XZArchive.cs rename to SabreTools.FileTypes/XZArchive.cs index 1a388821..23d3d22e 100644 --- a/SabreTools.Library/FileTypes/XZArchive.cs +++ b/SabreTools.FileTypes/XZArchive.cs @@ -7,7 +7,7 @@ using SabreTools.Core; using SabreTools.IO; using SharpCompress.Compressors.Xz; -namespace SabreTools.Library.FileTypes +namespace SabreTools.FileTypes { /// /// Represents a TorrentXZ archive for reading and writing diff --git a/SabreTools.Library/FileTypes/ZPAQArchive.cs b/SabreTools.FileTypes/ZPAQArchive.cs similarity index 98% rename from SabreTools.Library/FileTypes/ZPAQArchive.cs rename to SabreTools.FileTypes/ZPAQArchive.cs index f1eb9cb3..525dd134 100644 --- a/SabreTools.Library/FileTypes/ZPAQArchive.cs +++ b/SabreTools.FileTypes/ZPAQArchive.cs @@ -4,7 +4,7 @@ using System.IO; using SabreTools.Core; -namespace SabreTools.Library.FileTypes +namespace SabreTools.FileTypes { /// /// Represents a ZPAQArchive archive for reading and writing diff --git a/SabreTools.Library/FileTypes/ZipArchive.cs b/SabreTools.FileTypes/ZipArchive.cs similarity index 99% rename from SabreTools.Library/FileTypes/ZipArchive.cs rename to SabreTools.FileTypes/ZipArchive.cs index 4e3685f7..d2925b3c 100644 --- a/SabreTools.Library/FileTypes/ZipArchive.cs +++ b/SabreTools.FileTypes/ZipArchive.cs @@ -8,7 +8,7 @@ using Compress; using Compress.ZipFile; using NaturalSort; -namespace SabreTools.Library.FileTypes +namespace SabreTools.FileTypes { /// /// Represents a Zip archive for reading and writing diff --git a/SabreTools.Library/FileTypes/ZstdArchive.cs b/SabreTools.FileTypes/ZstdArchive.cs similarity index 98% rename from SabreTools.Library/FileTypes/ZstdArchive.cs rename to SabreTools.FileTypes/ZstdArchive.cs index e27e443e..a9312f23 100644 --- a/SabreTools.Library/FileTypes/ZstdArchive.cs +++ b/SabreTools.FileTypes/ZstdArchive.cs @@ -4,7 +4,7 @@ using System.IO; using SabreTools.Core; -namespace SabreTools.Library.FileTypes +namespace SabreTools.FileTypes { /// /// Represents a ZstdArchive archive for reading and writing diff --git a/SabreTools.IO/DirectoryExtensions.cs b/SabreTools.IO/DirectoryExtensions.cs index ea5e75e9..6e04f6f7 100644 --- a/SabreTools.IO/DirectoryExtensions.cs +++ b/SabreTools.IO/DirectoryExtensions.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using NaturalSort; + namespace SabreTools.IO { /// @@ -241,158 +243,5 @@ namespace SabreTools.IO .Where(dir => Directory.EnumerateFileSystemEntries(dir, "*", SearchOption.AllDirectories).Count() == 0) .ToList(); } - - // TODO: Remove this entire section once External and the rest of IO is in its own library (or pulled in otherwise) - #region TEMPORARY - REMOVEME - - private class NaturalComparer : Comparer, IDisposable - { - private Dictionary table; - - public NaturalComparer() - { - table = new Dictionary(); - } - - public void Dispose() - { - table.Clear(); - table = null; - } - - public override int Compare(string x, string y) - { - if (x.ToLowerInvariant() == y.ToLowerInvariant()) - { - return x.CompareTo(y); - } - if (!table.TryGetValue(x, out string[] x1)) - { - //x1 = Regex.Split(x.Replace(" ", string.Empty), "([0-9]+)"); - x1 = System.Text.RegularExpressions.Regex.Split(x.ToLowerInvariant(), "([0-9]+)").Where(s => !string.IsNullOrWhiteSpace(s)).ToArray(); - table.Add(x, x1); - } - if (!table.TryGetValue(y, out string[] y1)) - { - //y1 = Regex.Split(y.Replace(" ", string.Empty), "([0-9]+)"); - y1 = System.Text.RegularExpressions.Regex.Split(y.ToLowerInvariant(), "([0-9]+)").Where(s => !string.IsNullOrWhiteSpace(s)).ToArray(); - table.Add(y, y1); - } - - for (int i = 0; i < x1.Length && i < y1.Length; i++) - { - if (x1[i] != y1[i]) - { - return PartCompare(x1[i], y1[i]); - } - } - if (y1.Length > x1.Length) - { - return 1; - } - else if (x1.Length > y1.Length) - { - return -1; - } - else - { - return x.CompareTo(y); - } - } - - private static int PartCompare(string left, string right) - { - if (!long.TryParse(left, out long x)) - { - return CompareNumeric(left, right); - } - - if (!long.TryParse(right, out long y)) - { - return CompareNumeric(left, right); - } - - // If we have an equal part, then make sure that "longer" ones are taken into account - if (x.CompareTo(y) == 0) - { - return left.Length - right.Length; - } - - return x.CompareTo(y); - } - - private static int CompareNumeric(string s1, string s2) - { - // Save the orginal strings, for later comparison - string s1orig = s1; - string s2orig = s2; - - // We want to normalize the strings, so we set both to lower case - s1 = s1.ToLowerInvariant(); - s2 = s2.ToLowerInvariant(); - - // If the strings are the same exactly, return - if (s1 == s2) - return s1orig.CompareTo(s2orig); - - // If one is null, then say that's less than - if (s1 == null) - return -1; - if (s2 == null) - return 1; - - // Now split into path parts after converting AltDirSeparator to DirSeparator - s1 = s1.Replace(System.IO.Path.AltDirectorySeparatorChar, System.IO.Path.DirectorySeparatorChar); - s2 = s2.Replace(System.IO.Path.AltDirectorySeparatorChar, System.IO.Path.DirectorySeparatorChar); - string[] s1parts = s1.Split(System.IO.Path.DirectorySeparatorChar); - string[] s2parts = s2.Split(System.IO.Path.DirectorySeparatorChar); - - // Then compare each part in turn - for (int j = 0; j < s1parts.Length && j < s2parts.Length; j++) - { - int compared = CompareNumericPart(s1parts[j], s2parts[j]); - if (compared != 0) - return compared; - } - - // If we got out here, then it looped through at least one of the strings - if (s1parts.Length > s2parts.Length) - return 1; - if (s1parts.Length < s2parts.Length) - return -1; - - return s1orig.CompareTo(s2orig); - } - - private static int CompareNumericPart(string s1, string s2) - { - // Otherwise, loop through until we have an answer - for (int i = 0; i < s1.Length && i < s2.Length; i++) - { - int s1c = s1[i]; - int s2c = s2[i]; - - // If the characters are the same, continue - if (s1c == s2c) - continue; - - // If they're different, check which one was larger - if (s1c > s2c) - return 1; - if (s1c < s2c) - return -1; - } - - // If we got out here, then it looped through at least one of the strings - if (s1.Length > s2.Length) - return 1; - if (s1.Length < s2.Length) - return -1; - - return 0; - } - } - - #endregion } } diff --git a/SabreTools.Library/DatFiles/DatFile.cs b/SabreTools.Library/DatFiles/DatFile.cs index 3c090b75..dbaf28ec 100644 --- a/SabreTools.Library/DatFiles/DatFile.cs +++ b/SabreTools.Library/DatFiles/DatFile.cs @@ -10,12 +10,11 @@ using System.Threading.Tasks; using System.Xml.Serialization; using SabreTools.Core; +using SabreTools.FileTypes; using SabreTools.Filtering; using SabreTools.IO; using SabreTools.Logging; using SabreTools.Library.DatItems; -using SabreTools.Library.FileTypes; -using SabreTools.Library.IO; using SabreTools.Library.Reports; using SabreTools.Skippers; using NaturalSort; @@ -2556,7 +2555,7 @@ namespace SabreTools.Library.DatFiles outputFormat = Header.ForcePacking.AsOutputFormat(); // Preload the Skipper list - Transform.Init(); + SkipperMatch.Init(); #endregion @@ -2696,7 +2695,7 @@ namespace SabreTools.Library.DatFiles outputFormat = Header.ForcePacking.AsOutputFormat(); // Preload the Skipper list - Transform.Init(); + SkipperMatch.Init(); #endregion @@ -2908,7 +2907,7 @@ namespace SabreTools.Library.DatFiles if (Header.HeaderSkipper != null) { // Check to see if we have a matching header first - SkipperRule rule = Transform.GetMatchingRule(fileStream, Path.GetFileNameWithoutExtension(Header.HeaderSkipper)); + SkipperRule rule = SkipperMatch.GetMatchingRule(fileStream, Path.GetFileNameWithoutExtension(Header.HeaderSkipper)); // If there's a match, create the new file to write if (rule.Tests != null && rule.Tests.Count != 0) diff --git a/SabreTools.Library/DatItems/DatItem.cs b/SabreTools.Library/DatItems/DatItem.cs index 0193958f..7624557e 100644 --- a/SabreTools.Library/DatItems/DatItem.cs +++ b/SabreTools.Library/DatItems/DatItem.cs @@ -5,9 +5,9 @@ using System.Linq; using System.Xml.Serialization; using SabreTools.Core; +using SabreTools.FileTypes; using SabreTools.Filtering; using SabreTools.Logging; -using SabreTools.Library.FileTypes; using NaturalSort; using Newtonsoft.Json; using Newtonsoft.Json.Converters; diff --git a/SabreTools.Library/DatItems/Disk.cs b/SabreTools.Library/DatItems/Disk.cs index 0d4afdbf..f1228da0 100644 --- a/SabreTools.Library/DatItems/Disk.cs +++ b/SabreTools.Library/DatItems/Disk.cs @@ -4,8 +4,8 @@ using System.Linq; using System.Xml.Serialization; using SabreTools.Core; +using SabreTools.FileTypes; using SabreTools.Filtering; -using SabreTools.Library.FileTypes; using Newtonsoft.Json; using Newtonsoft.Json.Converters; diff --git a/SabreTools.Library/DatItems/Media.cs b/SabreTools.Library/DatItems/Media.cs index ebfab4df..88faa601 100644 --- a/SabreTools.Library/DatItems/Media.cs +++ b/SabreTools.Library/DatItems/Media.cs @@ -5,8 +5,8 @@ using System.Text; using System.Xml.Serialization; using SabreTools.Core; +using SabreTools.FileTypes; using SabreTools.Filtering; -using SabreTools.Library.FileTypes; using Newtonsoft.Json; namespace SabreTools.Library.DatItems diff --git a/SabreTools.Library/DatItems/Rom.cs b/SabreTools.Library/DatItems/Rom.cs index 31ec0c96..e9dc700b 100644 --- a/SabreTools.Library/DatItems/Rom.cs +++ b/SabreTools.Library/DatItems/Rom.cs @@ -6,8 +6,8 @@ using System.Text; using System.Xml.Serialization; using SabreTools.Core; +using SabreTools.FileTypes; using SabreTools.Filtering; -using SabreTools.Library.FileTypes; using Newtonsoft.Json; using Newtonsoft.Json.Converters; diff --git a/SabreTools.Library/IO/Transform.cs b/SabreTools.Library/IO/Transform.cs deleted file mode 100644 index 16b75426..00000000 --- a/SabreTools.Library/IO/Transform.cs +++ /dev/null @@ -1,404 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; - -using SabreTools.Core; -using SabreTools.Logging; -using SabreTools.Library.FileTypes; -using SabreTools.Skippers; -using Microsoft.Data.Sqlite; - -namespace SabreTools.Library.IO -{ - /// - /// Class for wrapping general file transformations - /// - /// - /// Skippers, in general, are distributed as XML files by some projects - /// in order to denote a way of transforming a file so that it will match - /// the hashes included in their DATs. Each skipper file can contain multiple - /// skipper rules, each of which denote a type of header/transformation. In - /// turn, each of those rules can contain multiple tests that denote that - /// a file should be processed using that rule. Transformations can include - /// simply skipping over a portion of the file all the way to byteswapping - /// the entire file. For the purposes of this library, Skippers also denote - /// a way of changing files directly in order to produce a file whose external - /// hash would match those same DATs. - /// - public static class Transform - { - /// - /// Header skippers represented by a list of skipper objects - /// - private static List List; - - /// - /// Local paths - /// - private static string LocalPath = Path.Combine(Globals.ExeDir, "Skippers") + Path.DirectorySeparatorChar; - - #region Logging - - /// - /// Logging object - /// - private static readonly Logger logger = new Logger(); - - #endregion - - /// - /// Initialize static fields - /// - public static void Init() - { - PopulateSkippers(); - } - - /// - /// Populate the entire list of header Skippers - /// - /// - /// http://mamedev.emulab.it/clrmamepro/docs/xmlheaders.txt - /// http://www.emulab.it/forum/index.php?topic=127.0 - /// - private static void PopulateSkippers() - { - if (List == null) - List = new List(); - - foreach (string skipperFile in Directory.EnumerateFiles(LocalPath, "*", SearchOption.AllDirectories)) - { - List.Add(new SkipperFile(Path.GetFullPath(skipperFile))); - } - } - - /// - /// Detect header skipper compliance and create an output file - /// - /// Name of the file to be parsed - /// Output directory to write the file to, empty means the same directory as the input file - /// True if headers should not be stored in the database, false otherwise - /// True if the output file was created, false otherwise - public static bool DetectTransformStore(string file, string outDir, bool nostore) - { - // Create the output directory if it doesn't exist - if (!Directory.Exists(outDir)) - Directory.CreateDirectory(outDir); - - logger.User($"\nGetting skipper information for '{file}'"); - - // Get the skipper rule that matches the file, if any - SkipperRule rule = GetMatchingRule(file, string.Empty); - - // If we have an empty rule, return false - if (rule.Tests == null || rule.Tests.Count == 0 || rule.Operation != HeaderSkipOperation.None) - return false; - - logger.User("File has a valid copier header"); - - // Get the header bytes from the file first - string hstr; - try - { - // Extract the header as a string for the database -#if NET_FRAMEWORK - using (var fs = File.OpenRead(file)) - { -#else - using var fs = File.OpenRead(file); -#endif - byte[] hbin = new byte[(int)rule.StartOffset]; - fs.Read(hbin, 0, (int)rule.StartOffset); - hstr = Utilities.ByteArrayToString(hbin); -#if NET_FRAMEWORK - } -#endif - } - catch - { - return false; - } - - // Apply the rule to the file - string newfile = (string.IsNullOrWhiteSpace(outDir) ? Path.GetFullPath(file) + ".new" : Path.Combine(outDir, Path.GetFileName(file))); - rule.TransformFile(file, newfile); - - // If the output file doesn't exist, return false - if (!File.Exists(newfile)) - return false; - - // Now add the information to the database if it's not already there - if (!nostore) - { - BaseFile baseFile = BaseFile.GetInfo(newfile, hashes: Hash.SHA1, asFiles: TreatAsFile.NonArchive); - AddHeaderToDatabase(hstr, Utilities.ByteArrayToString(baseFile.SHA1), rule.SourceFile); - } - - return true; - } - - /// - /// Detect and replace header(s) to the given file - /// - /// Name of the file to be parsed - /// Output directory to write the file to, empty means the same directory as the input file - /// True if a header was found and appended, false otherwise - public static bool RestoreHeader(string file, string outDir) - { - // Create the output directory if it doesn't exist - if (!string.IsNullOrWhiteSpace(outDir) && !Directory.Exists(outDir)) - Directory.CreateDirectory(outDir); - - // First, get the SHA-1 hash of the file - BaseFile baseFile = BaseFile.GetInfo(file, hashes: Hash.SHA1, asFiles: TreatAsFile.NonArchive); - - // Retrieve a list of all related headers from the database - List headers = RetrieveHeadersFromDatabase(Utilities.ByteArrayToString(baseFile.SHA1)); - - // If we have nothing retrieved, we return false - if (headers.Count == 0) - return false; - - // Now loop through and create the reheadered files, if possible - for (int i = 0; i < headers.Count; i++) - { - string outputFile = (string.IsNullOrWhiteSpace(outDir) ? $"{Path.GetFullPath(file)}.new" : Path.Combine(outDir, Path.GetFileName(file))) + i; - logger.User($"Creating reheadered file: {outputFile}"); - AppendBytes(file, outputFile, Utilities.StringToByteArray(headers[i]), null); - logger.User("Reheadered file created!"); - } - - return true; - } - - /// - /// Get the SkipperRule associated with a given file - /// - /// Name of the file to be checked - /// Name of the skipper to be used, blank to find a matching skipper - /// Logger object for file and console output - /// The SkipperRule that matched the file - public static SkipperRule GetMatchingRule(string input, string skipperName) - { - // If the file doesn't exist, return a blank skipper rule - if (!File.Exists(input)) - { - logger.Error($"The file '{input}' does not exist so it cannot be tested"); - return new SkipperRule(); - } - - return GetMatchingRule(File.OpenRead(input), skipperName); - } - - /// - /// Get the SkipperRule associated with a given stream - /// - /// Name of the file to be checked - /// Name of the skipper to be used, blank to find a matching skipper - /// True if the underlying stream should be kept open, false otherwise - /// The SkipperRule that matched the file - public static SkipperRule GetMatchingRule(Stream input, string skipperName, bool keepOpen = false) - { - SkipperRule skipperRule = new SkipperRule(); - - // If we have a null skipper name, we return since we're not matching skippers - if (skipperName == null) - return skipperRule; - - // Loop through and find a Skipper that has the right name - logger.Verbose("Beginning search for matching header skip rules"); - List tempList = new List(); - tempList.AddRange(List); - - // Loop through all known SkipperFiles - foreach (SkipperFile skipper in tempList) - { - skipperRule = skipper.GetMatchingRule(input, skipperName); - if (skipperRule != null) - break; - } - - // If we're not keeping the stream open, dispose of the binary reader - if (!keepOpen) - input.Dispose(); - - // If the SkipperRule is null, make it empty - if (skipperRule == null) - skipperRule = new SkipperRule(); - - // If we have a blank rule, inform the user - if (skipperRule.Tests == null) - logger.Verbose("No matching rule found!"); - else - logger.User("Matching rule found!"); - - return skipperRule; - } - - /// - /// Add an aribtrary number of bytes to the inputted file - /// - /// File to be appended to - /// Outputted file - /// Bytes to be added to head of file - /// Bytes to be added to tail of file - private static void AppendBytes(string input, string output, byte[] bytesToAddToHead, byte[] bytesToAddToTail) - { - // If any of the inputs are invalid, skip - if (!File.Exists(input)) - return; - -#if NET_FRAMEWORK - using (FileStream fsr = File.OpenRead(input)) - using (FileStream fsw = File.OpenWrite(output)) - { -#else - using FileStream fsr = File.OpenRead(input); - using FileStream fsw = File.OpenWrite(output); -#endif - AppendBytes(fsr, fsw, bytesToAddToHead, bytesToAddToTail); -#if NET_FRAMEWORK - } -#endif - } - - /// - /// Add an aribtrary number of bytes to the inputted stream - /// - /// Stream to be appended to - /// Outputted stream - /// Bytes to be added to head of stream - /// Bytes to be added to tail of stream - private static void AppendBytes(Stream input, Stream output, byte[] bytesToAddToHead, byte[] bytesToAddToTail) - { - // Write out prepended bytes - if (bytesToAddToHead != null && bytesToAddToHead.Length > 0) - output.Write(bytesToAddToHead, 0, bytesToAddToHead.Length); - - // Now copy the existing file over - input.CopyTo(output); - - // Write out appended bytes - if (bytesToAddToTail != null && bytesToAddToTail.Length > 0) - output.Write(bytesToAddToTail, 0, bytesToAddToTail.Length); - } - - #region Database Operations - - /// - /// Ensure that the databse exists and has the proper schema - /// - /// Name of the databse - /// Connection string for SQLite - private static void EnsureDatabase(string db, string connectionString) - { - // Make sure the file exists - if (!File.Exists(db)) - File.Create(db); - - // Open the database connection - SqliteConnection dbc = new SqliteConnection(connectionString); - dbc.Open(); - - // Make sure the database has the correct schema - try - { - string query = @" -CREATE TABLE IF NOT EXISTS data ( - 'sha1' TEXT NOT NULL, - 'header' TEXT NOT NULL, - 'type' TEXT NOT NULL, - PRIMARY KEY (sha1, header, type) -)"; - SqliteCommand slc = new SqliteCommand(query, dbc); - slc.ExecuteNonQuery(); - slc.Dispose(); - } - catch (Exception ex) - { - logger.Error(ex); - } - finally - { - dbc.Dispose(); - } - } - - /// - /// Add a header to the database - /// - /// String representing the header bytes - /// SHA-1 of the deheadered file - /// Name of the source skipper file - private static void AddHeaderToDatabase(string header, string SHA1, string source) - { - // Ensure the database exists - EnsureDatabase(Constants.HeadererFileName, Constants.HeadererConnectionString); - - // Open the database connection - SqliteConnection dbc = new SqliteConnection(Constants.HeadererConnectionString); - dbc.Open(); - - string query = $"SELECT * FROM data WHERE sha1='{SHA1}' AND header='{header}'"; - SqliteCommand slc = new SqliteCommand(query, dbc); - SqliteDataReader sldr = slc.ExecuteReader(); - bool exists = sldr.HasRows; - - if (!exists) - { - query = $"INSERT INTO data (sha1, header, type) VALUES ('{SHA1}', '{header}', '{source}')"; - slc = new SqliteCommand(query, dbc); - logger.Verbose($"Result of inserting header: {slc.ExecuteNonQuery()}"); - } - - // Dispose of database objects - slc.Dispose(); - sldr.Dispose(); - dbc.Dispose(); - } - - /// - /// Retrieve headers from the database - /// - /// SHA-1 of the deheadered file - /// List of strings representing the headers to add - private static List RetrieveHeadersFromDatabase(string SHA1) - { - // Ensure the database exists - EnsureDatabase(Constants.HeadererFileName, Constants.HeadererConnectionString); - - // Open the database connection - SqliteConnection dbc = new SqliteConnection(Constants.HeadererConnectionString); - dbc.Open(); - - // Create the output list of headers - List headers = new List(); - - string query = $"SELECT header, type FROM data WHERE sha1='{SHA1}'"; - SqliteCommand slc = new SqliteCommand(query, dbc); - SqliteDataReader sldr = slc.ExecuteReader(); - - if (sldr.HasRows) - { - while (sldr.Read()) - { - logger.Verbose($"Found match with rom type '{sldr.GetString(1)}'"); - headers.Add(sldr.GetString(0)); - } - } - else - { - logger.Warning("No matching header could be found!"); - } - - // Dispose of database objects - slc.Dispose(); - sldr.Dispose(); - dbc.Dispose(); - - return headers; - } - - #endregion - } -} \ No newline at end of file diff --git a/SabreTools.Library/SabreTools.Library.csproj b/SabreTools.Library/SabreTools.Library.csproj index 15f46027..0fc303d4 100644 --- a/SabreTools.Library/SabreTools.Library.csproj +++ b/SabreTools.Library/SabreTools.Library.csproj @@ -13,6 +13,7 @@ + @@ -20,9 +21,7 @@ - - diff --git a/SabreTools.Skippers/SkipperFile.cs b/SabreTools.Skippers/SkipperFile.cs index 6ffdc51a..1d87aeef 100644 --- a/SabreTools.Skippers/SkipperFile.cs +++ b/SabreTools.Skippers/SkipperFile.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Globalization; using System.IO; using System.Xml; +using System.Xml.Schema; namespace SabreTools.Skippers { @@ -59,7 +60,16 @@ namespace SabreTools.Skippers Rules = new List(); SourceFile = Path.GetFileNameWithoutExtension(filename); - XmlReader xtr = GetXmlTextReader(filename); + XmlReader xtr = XmlReader.Create(filename, new XmlReaderSettings + { + CheckCharacters = false, + DtdProcessing = DtdProcessing.Ignore, + IgnoreComments = true, + IgnoreWhitespace = true, + ValidationFlags = XmlSchemaValidationFlags.None, + ValidationType = ValidationType.None, + }); + bool valid = Parse(xtr); // If we somehow have an invalid file, zero out the fields @@ -410,34 +420,5 @@ namespace SabreTools.Skippers } #endregion - - // TODO: Remove this region once IO namespace is separated out properly - #region TEMPORARY - REMOVEME - - /// - /// Get the XmlTextReader associated with a file, if possible - /// - /// Name of the file to be parsed - /// The XmlTextReader representing the (possibly converted) file, null otherwise - private static XmlReader GetXmlTextReader(string filename) - { - // Check if file exists - if (!File.Exists(filename)) - return null; - - XmlReader xtr = XmlReader.Create(filename, new XmlReaderSettings - { - CheckCharacters = false, - DtdProcessing = DtdProcessing.Ignore, - IgnoreComments = true, - IgnoreWhitespace = true, - ValidationFlags = System.Xml.Schema.XmlSchemaValidationFlags.None, - ValidationType = ValidationType.None, - }); - - return xtr; - } - - #endregion } } diff --git a/SabreTools.Skippers/SkipperMatch.cs b/SabreTools.Skippers/SkipperMatch.cs new file mode 100644 index 00000000..9dec3e03 --- /dev/null +++ b/SabreTools.Skippers/SkipperMatch.cs @@ -0,0 +1,135 @@ +using System.Collections.Generic; +using System.IO; + +using SabreTools.Core; +using SabreTools.Logging; + +namespace SabreTools.Skippers +{ + /// + /// Class for matching existing Skippers + /// + /// + /// Skippers, in general, are distributed as XML files by some projects + /// in order to denote a way of transforming a file so that it will match + /// the hashes included in their DATs. Each skipper file can contain multiple + /// skipper rules, each of which denote a type of header/transformation. In + /// turn, each of those rules can contain multiple tests that denote that + /// a file should be processed using that rule. Transformations can include + /// simply skipping over a portion of the file all the way to byteswapping + /// the entire file. For the purposes of this library, Skippers also denote + /// a way of changing files directly in order to produce a file whose external + /// hash would match those same DATs. + /// + public static class SkipperMatch + { + /// + /// Header skippers represented by a list of skipper objects + /// + private static List List; + + /// + /// Local paths + /// + private static readonly string LocalPath = Path.Combine(Globals.ExeDir, "Skippers") + Path.DirectorySeparatorChar; + + #region Logging + + /// + /// Logging object + /// + private static readonly Logger logger = new Logger(); + + #endregion + + /// + /// Initialize static fields + /// + public static void Init() + { + PopulateSkippers(); + } + + /// + /// Populate the entire list of header Skippers + /// + /// + /// http://mamedev.emulab.it/clrmamepro/docs/xmlheaders.txt + /// http://www.emulab.it/forum/index.php?topic=127.0 + /// + private static void PopulateSkippers() + { + if (List == null) + List = new List(); + + foreach (string skipperFile in Directory.EnumerateFiles(LocalPath, "*", SearchOption.AllDirectories)) + { + List.Add(new SkipperFile(Path.GetFullPath(skipperFile))); + } + } + + /// + /// Get the SkipperRule associated with a given file + /// + /// Name of the file to be checked + /// Name of the skipper to be used, blank to find a matching skipper + /// Logger object for file and console output + /// The SkipperRule that matched the file + public static SkipperRule GetMatchingRule(string input, string skipperName) + { + // If the file doesn't exist, return a blank skipper rule + if (!File.Exists(input)) + { + logger.Error($"The file '{input}' does not exist so it cannot be tested"); + return new SkipperRule(); + } + + return GetMatchingRule(File.OpenRead(input), skipperName); + } + + /// + /// Get the SkipperRule associated with a given stream + /// + /// Name of the file to be checked + /// Name of the skipper to be used, blank to find a matching skipper + /// True if the underlying stream should be kept open, false otherwise + /// The SkipperRule that matched the file + public static SkipperRule GetMatchingRule(Stream input, string skipperName, bool keepOpen = false) + { + SkipperRule skipperRule = new SkipperRule(); + + // If we have a null skipper name, we return since we're not matching skippers + if (skipperName == null) + return skipperRule; + + // Loop through and find a Skipper that has the right name + logger.Verbose("Beginning search for matching header skip rules"); + List tempList = new List(); + tempList.AddRange(List); + + // Loop through all known SkipperFiles + foreach (SkipperFile skipper in tempList) + { + skipperRule = skipper.GetMatchingRule(input, skipperName); + if (skipperRule != null) + break; + } + + // If we're not keeping the stream open, dispose of the binary reader + if (!keepOpen) + input.Dispose(); + + // If the SkipperRule is null, make it empty + if (skipperRule == null) + skipperRule = new SkipperRule(); + + // If we have a blank rule, inform the user + if (skipperRule.Tests == null) + logger.Verbose("No matching rule found!"); + else + logger.User("Matching rule found!"); + + return skipperRule; + } + } +} \ No newline at end of file diff --git a/SabreTools.sln b/SabreTools.sln index 089c9ee4..570f9efc 100644 --- a/SabreTools.sln +++ b/SabreTools.sln @@ -28,6 +28,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.IO", "SabreTools EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.Filtering", "SabreTools.Filtering\SabreTools.Filtering.csproj", "{35129634-0F13-416A-8D4D-35B71DFECFFD}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SabreTools.FileTypes", "SabreTools.FileTypes\SabreTools.FileTypes.csproj", "{0B36F39B-69CB-4E8A-B251-D063CB08B247}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -108,6 +110,14 @@ Global {35129634-0F13-416A-8D4D-35B71DFECFFD}.Release|Any CPU.Build.0 = Release|Any CPU {35129634-0F13-416A-8D4D-35B71DFECFFD}.Release|x64.ActiveCfg = Release|Any CPU {35129634-0F13-416A-8D4D-35B71DFECFFD}.Release|x64.Build.0 = Release|Any CPU + {0B36F39B-69CB-4E8A-B251-D063CB08B247}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0B36F39B-69CB-4E8A-B251-D063CB08B247}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0B36F39B-69CB-4E8A-B251-D063CB08B247}.Debug|x64.ActiveCfg = Debug|Any CPU + {0B36F39B-69CB-4E8A-B251-D063CB08B247}.Debug|x64.Build.0 = Debug|Any CPU + {0B36F39B-69CB-4E8A-B251-D063CB08B247}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0B36F39B-69CB-4E8A-B251-D063CB08B247}.Release|Any CPU.Build.0 = Release|Any CPU + {0B36F39B-69CB-4E8A-B251-D063CB08B247}.Release|x64.ActiveCfg = Release|Any CPU + {0B36F39B-69CB-4E8A-B251-D063CB08B247}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/SabreTools/Features/BaseFeature.cs b/SabreTools/Features/BaseFeature.cs index 2e978542..bda34e01 100644 --- a/SabreTools/Features/BaseFeature.cs +++ b/SabreTools/Features/BaseFeature.cs @@ -1,11 +1,13 @@ using System; using System.Collections.Generic; +using System.IO; using SabreTools.Core; using SabreTools.Filtering; using SabreTools.Help; using SabreTools.Logging; using SabreTools.Library.DatFiles; +using Microsoft.Data.Sqlite; namespace SabreTools.Features { @@ -3038,6 +3040,39 @@ Some special strings that can be used: #endregion + #region Protected Helpers + + /// + /// Ensure that the databse exists and has the proper schema + /// + /// Name of the databse + /// Connection string for SQLite + protected static void EnsureDatabase(string db, string connectionString) + { + // Make sure the file exists + if (!File.Exists(db)) + File.Create(db); + + // Open the database connection + SqliteConnection dbc = new SqliteConnection(connectionString); + dbc.Open(); + + // Make sure the database has the correct schema + string query = @" +CREATE TABLE IF NOT EXISTS data ( + 'sha1' TEXT NOT NULL, + 'header' TEXT NOT NULL, + 'type' TEXT NOT NULL, + PRIMARY KEY (sha1, header, type) +)"; + SqliteCommand slc = new SqliteCommand(query, dbc); + slc.ExecuteNonQuery(); + slc.Dispose(); + dbc.Dispose(); + } + + #endregion + #region Private Helpers /// diff --git a/SabreTools/Features/DatFromDir.cs b/SabreTools/Features/DatFromDir.cs index 23877b8e..c7ef3670 100644 --- a/SabreTools/Features/DatFromDir.cs +++ b/SabreTools/Features/DatFromDir.cs @@ -5,7 +5,6 @@ using System.IO; using SabreTools.Core; using SabreTools.Help; using SabreTools.Library.DatFiles; -using SabreTools.Library.DatItems; namespace SabreTools.Features { diff --git a/SabreTools/Features/Extract.cs b/SabreTools/Features/Extract.cs index dd931533..1fdf9a81 100644 --- a/SabreTools/Features/Extract.cs +++ b/SabreTools/Features/Extract.cs @@ -1,8 +1,12 @@ -using System.Collections.Generic; +using System.IO; +using System.Collections.Generic; +using SabreTools.Core; +using SabreTools.FileTypes; using SabreTools.Help; using SabreTools.IO; -using SabreTools.Library.IO; +using SabreTools.Skippers; +using Microsoft.Data.Sqlite; namespace SabreTools.Features { @@ -44,8 +48,106 @@ The following systems have headers that this program can work with: List files = DirectoryExtensions.GetFilesOnly(Inputs); foreach (ParentablePath file in files) { - Transform.DetectTransformStore(file.CurrentPath, OutputDir, nostore); + DetectTransformStore(file.CurrentPath, OutputDir, nostore); } } + + /// + /// Detect header skipper compliance and create an output file + /// + /// Name of the file to be parsed + /// Output directory to write the file to, empty means the same directory as the input file + /// True if headers should not be stored in the database, false otherwise + /// True if the output file was created, false otherwise + private bool DetectTransformStore(string file, string outDir, bool nostore) + { + // Create the output directory if it doesn't exist + if (!Directory.Exists(outDir)) + Directory.CreateDirectory(outDir); + + logger.User($"\nGetting skipper information for '{file}'"); + + // Get the skipper rule that matches the file, if any + SkipperRule rule = SkipperMatch.GetMatchingRule(file, string.Empty); + + // If we have an empty rule, return false + if (rule.Tests == null || rule.Tests.Count == 0 || rule.Operation != HeaderSkipOperation.None) + return false; + + logger.User("File has a valid copier header"); + + // Get the header bytes from the file first + string hstr; + try + { + // Extract the header as a string for the database +#if NET_FRAMEWORK + using (var fs = File.OpenRead(file)) + { +#else + using var fs = File.OpenRead(file); +#endif + byte[] hbin = new byte[(int)rule.StartOffset]; + fs.Read(hbin, 0, (int)rule.StartOffset); + hstr = Utilities.ByteArrayToString(hbin); +#if NET_FRAMEWORK + } +#endif + } + catch + { + return false; + } + + // Apply the rule to the file + string newfile = (string.IsNullOrWhiteSpace(outDir) ? Path.GetFullPath(file) + ".new" : Path.Combine(outDir, Path.GetFileName(file))); + rule.TransformFile(file, newfile); + + // If the output file doesn't exist, return false + if (!File.Exists(newfile)) + return false; + + // Now add the information to the database if it's not already there + if (!nostore) + { + BaseFile baseFile = BaseFile.GetInfo(newfile, hashes: Hash.SHA1, asFiles: TreatAsFile.NonArchive); + AddHeaderToDatabase(hstr, Utilities.ByteArrayToString(baseFile.SHA1), rule.SourceFile); + } + + return true; + } + + /// + /// Add a header to the database + /// + /// String representing the header bytes + /// SHA-1 of the deheadered file + /// Name of the source skipper file + private void AddHeaderToDatabase(string header, string SHA1, string source) + { + // Ensure the database exists + EnsureDatabase(Constants.HeadererFileName, Constants.HeadererConnectionString); + + // Open the database connection + SqliteConnection dbc = new SqliteConnection(Constants.HeadererConnectionString); + dbc.Open(); + + string query = $"SELECT * FROM data WHERE sha1='{SHA1}' AND header='{header}'"; + SqliteCommand slc = new SqliteCommand(query, dbc); + SqliteDataReader sldr = slc.ExecuteReader(); + bool exists = sldr.HasRows; + + if (!exists) + { + query = $"INSERT INTO data (sha1, header, type) VALUES ('{SHA1}', '{header}', '{source}')"; + slc = new SqliteCommand(query, dbc); + logger.Verbose($"Result of inserting header: {slc.ExecuteNonQuery()}"); + } + + // Dispose of database objects + slc.Dispose(); + sldr.Dispose(); + dbc.Dispose(); + } } } diff --git a/SabreTools/Features/Restore.cs b/SabreTools/Features/Restore.cs index bbdd6bd7..1917bd22 100644 --- a/SabreTools/Features/Restore.cs +++ b/SabreTools/Features/Restore.cs @@ -1,8 +1,11 @@ -using System.Collections.Generic; +using System.IO; +using System.Collections.Generic; +using SabreTools.Core; +using SabreTools.FileTypes; using SabreTools.Help; using SabreTools.IO; -using SabreTools.Library.IO; +using Microsoft.Data.Sqlite; namespace SabreTools.Features { @@ -40,8 +43,132 @@ The following systems have headers that this program can work with: List files = DirectoryExtensions.GetFilesOnly(Inputs); foreach (ParentablePath file in files) { - Transform.RestoreHeader(file.CurrentPath, OutputDir); + RestoreHeader(file.CurrentPath, OutputDir); } } + + /// + /// Detect and replace header(s) to the given file + /// + /// Name of the file to be parsed + /// Output directory to write the file to, empty means the same directory as the input file + /// True if a header was found and appended, false otherwise + public bool RestoreHeader(string file, string outDir) + { + // Create the output directory if it doesn't exist + if (!string.IsNullOrWhiteSpace(outDir) && !Directory.Exists(outDir)) + Directory.CreateDirectory(outDir); + + // First, get the SHA-1 hash of the file + BaseFile baseFile = BaseFile.GetInfo(file, hashes: Hash.SHA1, asFiles: TreatAsFile.NonArchive); + + // Retrieve a list of all related headers from the database + List headers = RetrieveHeadersFromDatabase(Utilities.ByteArrayToString(baseFile.SHA1)); + + // If we have nothing retrieved, we return false + if (headers.Count == 0) + return false; + + // Now loop through and create the reheadered files, if possible + for (int i = 0; i < headers.Count; i++) + { + string outputFile = (string.IsNullOrWhiteSpace(outDir) ? $"{Path.GetFullPath(file)}.new" : Path.Combine(outDir, Path.GetFileName(file))) + i; + logger.User($"Creating reheadered file: {outputFile}"); + AppendBytes(file, outputFile, Utilities.StringToByteArray(headers[i]), null); + logger.User("Reheadered file created!"); + } + + return true; + } + + /// + /// Retrieve headers from the database + /// + /// SHA-1 of the deheadered file + /// List of strings representing the headers to add + private List RetrieveHeadersFromDatabase(string SHA1) + { + // Ensure the database exists + EnsureDatabase(Constants.HeadererFileName, Constants.HeadererConnectionString); + + // Open the database connection + SqliteConnection dbc = new SqliteConnection(Constants.HeadererConnectionString); + dbc.Open(); + + // Create the output list of headers + List headers = new List(); + + string query = $"SELECT header, type FROM data WHERE sha1='{SHA1}'"; + SqliteCommand slc = new SqliteCommand(query, dbc); + SqliteDataReader sldr = slc.ExecuteReader(); + + if (sldr.HasRows) + { + while (sldr.Read()) + { + logger.Verbose($"Found match with rom type '{sldr.GetString(1)}'"); + headers.Add(sldr.GetString(0)); + } + } + else + { + logger.Warning("No matching header could be found!"); + } + + // Dispose of database objects + slc.Dispose(); + sldr.Dispose(); + dbc.Dispose(); + + return headers; + } + + /// + /// Add an aribtrary number of bytes to the inputted file + /// + /// File to be appended to + /// Outputted file + /// Bytes to be added to head of file + /// Bytes to be added to tail of file + private void AppendBytes(string input, string output, byte[] bytesToAddToHead, byte[] bytesToAddToTail) + { + // If any of the inputs are invalid, skip + if (!File.Exists(input)) + return; + +#if NET_FRAMEWORK + using (FileStream fsr = File.OpenRead(input)) + using (FileStream fsw = File.OpenWrite(output)) + { +#else + using FileStream fsr = File.OpenRead(input); + using FileStream fsw = File.OpenWrite(output); +#endif + AppendBytes(fsr, fsw, bytesToAddToHead, bytesToAddToTail); +#if NET_FRAMEWORK + } +#endif + } + + /// + /// Add an aribtrary number of bytes to the inputted stream + /// + /// Stream to be appended to + /// Outputted stream + /// Bytes to be added to head of stream + /// Bytes to be added to tail of stream + private void AppendBytes(Stream input, Stream output, byte[] bytesToAddToHead, byte[] bytesToAddToTail) + { + // Write out prepended bytes + if (bytesToAddToHead != null && bytesToAddToHead.Length > 0) + output.Write(bytesToAddToHead, 0, bytesToAddToHead.Length); + + // Now copy the existing file over + input.CopyTo(output); + + // Write out appended bytes + if (bytesToAddToTail != null && bytesToAddToTail.Length > 0) + output.Write(bytesToAddToTail, 0, bytesToAddToTail.Length); + } } } diff --git a/SabreTools/Features/Sort.cs b/SabreTools/Features/Sort.cs index dbe30d47..7bba5e98 100644 --- a/SabreTools/Features/Sort.cs +++ b/SabreTools/Features/Sort.cs @@ -5,7 +5,6 @@ using SabreTools.Core; using SabreTools.Help; using SabreTools.IO; using SabreTools.Library.DatFiles; -using SabreTools.Library.FileTypes; using SabreTools.Logging; namespace SabreTools.Features diff --git a/SabreTools/Features/Split.cs b/SabreTools/Features/Split.cs index bd7e9f41..1fcc743b 100644 --- a/SabreTools/Features/Split.cs +++ b/SabreTools/Features/Split.cs @@ -5,7 +5,6 @@ using SabreTools.Core; using SabreTools.Help; using SabreTools.IO; using SabreTools.Library.DatFiles; -using SabreTools.Library.DatItems; using SabreTools.Logging; namespace SabreTools.Features diff --git a/SabreTools/SabreTools.csproj b/SabreTools/SabreTools.csproj index 1e4c899d..b6633824 100644 --- a/SabreTools/SabreTools.csproj +++ b/SabreTools/SabreTools.csproj @@ -12,6 +12,10 @@ NET_FRAMEWORK + + + +