diff --git a/BSA.Tools/BSA.Tools.csproj b/BSA.Tools/BSA.Tools.csproj deleted file mode 100644 index 9c0d635f..00000000 --- a/BSA.Tools/BSA.Tools.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - - netstandard2.0 - - - - true - x64 - - - - - PreserveNewest - - - - diff --git a/BSA.Tools/BSAFile.cs b/BSA.Tools/BSAFile.cs deleted file mode 100644 index 9c726299..00000000 --- a/BSA.Tools/BSAFile.cs +++ /dev/null @@ -1,372 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Runtime.InteropServices; -using System.Text; -using System.Threading; -using static BSA.Tools.libbsarch; - -namespace BSA.Tools -{ - // Represents a BSA archive on disk (in READ mode) - public class BSAFile : IDisposable - { - private static Mutex GlobalLock = new Mutex(false); - protected unsafe libbsarch.bsa_archive_t* _archive; - - public UInt32 Version - { - get - { - unsafe - { - return libbsarch.bsa_version_get(_archive); - } - } - } - - public bsa_archive_type_t Type - { - get - { - unsafe - { - return libbsarch.bsa_archive_type_get(_archive); - } - } - } - - public UInt32 FileCount - { - get - { - unsafe - { - return libbsarch.bsa_file_count_get(_archive); - } - } - } - - public UInt32 ArchiveFlags - { - get - { - unsafe - { - return libbsarch.bsa_archive_flags_get(_archive); - } - } - set - { - unsafe - { - libbsarch.bsa_archive_flags_set(_archive, value); - } - } - } - - public UInt32 FileFlags - { - get - { - unsafe - { - return libbsarch.bsa_file_flags_get(_archive); - } - } - set - { - unsafe - { - libbsarch.bsa_file_flags_set(_archive, value); - } - } - } - - public bool Compress - { - get - { - unsafe - { - return libbsarch.bsa_compress_get(_archive); - } - } - set - { - unsafe - { - libbsarch.bsa_compress_set(_archive, value); - } - } - } - - public bool ShareData - { - get - { - unsafe - { - return libbsarch.bsa_share_data_get(_archive); - } - } - set - { - unsafe - { - libbsarch.bsa_share_data_set(_archive, value); - } - } - } - - - public void Save() - { - unsafe - { - check_err(libbsarch.bsa_save(_archive)); - } - } - - private IEnumerable _entries = null; - public IEnumerable Entries { - get - { - if (_entries != null) - return _entries; - - return GetAndCacheEntries(); - } - - - } - - private IEnumerable GetAndCacheEntries() - { - var entries = new List(); - unsafe - { - foreach (var filename in GetFileNames()) - { - entries.Add(new ArchiveEntry(this, _archive, filename)); - } - } - _entries = entries; - return entries; - } - - public BSAFile() - { - GlobalLock.WaitOne(); - unsafe - { - _archive = libbsarch.bsa_create(); - } - } - - public void Create(string filename, bsa_archive_type_t type, EntryList entries) - { - unsafe - { - check_err(libbsarch.bsa_create_archive(_archive, filename, type, entries._list)); - } - } - - public BSAFile(string filename) - { - GlobalLock.WaitOne(); - unsafe - { - _archive = libbsarch.bsa_create(); - check_err(libbsarch.bsa_load_from_file(_archive, filename)); - } - } - - public void AddFile(string filename, byte[] data) - { - unsafe - { - var ptr = Marshal.AllocHGlobal(data.Length); - Marshal.Copy(data, 0, ptr, data.Length); - libbsarch.bsa_add_file_from_memory(_archive, filename, (UInt32)data.Length, (byte*)ptr); - Marshal.FreeHGlobal(ptr); - } - } - - public void Dispose() - { - unsafe - { - check_err(libbsarch.bsa_free(_archive)); - } - GlobalLock.ReleaseMutex(); - } - - public static void check_err(libbsarch.bsa_result_message_t bsa_result_message_t) - { - if (bsa_result_message_t.code != 0) - { - unsafe - { - int i = 0; - for (i = 0; i < 1024 * 2; i += 2) - if (bsa_result_message_t.text[i] == 0) break; - - var msg = new String((sbyte*)bsa_result_message_t.text, 0, i, Encoding.Unicode); - throw new Exception(msg); - } - } - } - - public IEnumerable GetFileNames() - { - List filenames = new List(); - unsafe - { - check_err(libbsarch.bsa_iterate_files(_archive, (archive, filename, file, folder, context) => - { - lock (filenames) - { - filenames.Add(filename); - } - return false; - }, null)); - } - return filenames; - } - } - - public class ArchiveEntry - { - private BSAFile _archive; - private unsafe libbsarch.bsa_archive_t* _archivep; - private string _filename; - - public string Filename { - get - { - return _filename; - } - } - - public unsafe ArchiveEntry(BSAFile archive, libbsarch.bsa_archive_t* archivep, string filename) - { - _archive = archive; - _archivep = archivep; - _filename = filename; - } - - public FileData GetFileData() - { - unsafe - { - var result = libbsarch.bsa_extract_file_data_by_filename(_archivep, _filename); - BSAFile.check_err(result.message); - return new FileData(_archive, _archivep, result.buffer); - } - } - - public void ExtractTo(Stream stream) - { - using (var data = GetFileData()) - { - data.WriteTo(stream); - } - } - - public void ExtractTo(string filename) - { - unsafe - { - libbsarch.bsa_extract_file(_archivep, _filename, filename); - } - } - } - - public class FileData : IDisposable - { - private BSAFile archive; - private unsafe libbsarch.bsa_archive_t* archivep; - private libbsarch.bsa_result_buffer_t result; - - public unsafe FileData(BSAFile archive, libbsarch.bsa_archive_t* archivep, libbsarch.bsa_result_buffer_t result) - { - this.archive = archive; - this.archivep = archivep; - this.result = result; - } - - public void WriteTo(Stream stream) - { - var memory = ToByteArray(); - stream.Write(memory, 0, (int)result.size); - } - - public byte[] ToByteArray() - { - unsafe - { - byte[] memory = new byte[result.size]; - Marshal.Copy((IntPtr)result.data, memory, 0, (int)result.size); - return memory; - } - } - - public void Dispose() - { - unsafe - { - BSAFile.check_err(libbsarch.bsa_file_data_free(archivep, result)); - } - } - } - - public class EntryList : IDisposable - { - public unsafe bsa_entry_list_t* _list; - - public EntryList() - { - unsafe - { - _list = libbsarch.bsa_entry_list_create(); - } - } - - public UInt32 Count - { - get - { - lock (this) - { - unsafe - { - return libbsarch.bsa_entry_list_count(_list); - } - } - } - } - - public void Add(string entry) - { - lock(this) - { - unsafe - { - libbsarch.bsa_entry_list_add(_list, entry); - } - } - } - - public void Dispose() - { - lock (this) - { - unsafe - { - libbsarch.bsa_entry_list_free(_list); - } - } - } - } -} diff --git a/BSA.Tools/Extensions.cs b/BSA.Tools/Extensions.cs deleted file mode 100644 index 7a66f2ce..00000000 --- a/BSA.Tools/Extensions.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; - -namespace BSA.Tools -{ - public static class Extensions - { - public static string ReadFourCC(this BinaryReader stream) - { - byte[] buf = new byte[4]; - stream.Read(buf, 0, 4); - return new string(buf.Select(b => (char)b).ToArray()); - } - } -} diff --git a/BSA.Tools/libbsarch.cs b/BSA.Tools/libbsarch.cs deleted file mode 100644 index 34736610..00000000 --- a/BSA.Tools/libbsarch.cs +++ /dev/null @@ -1,137 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using System.Text; - -namespace BSA.Tools -{ - public class libbsarch - { - public struct bsa_archive_t { }; - public struct bsa_file_record_t { }; - public struct bsa_folder_record_t { }; - - public unsafe delegate bool bsa_file_iteration_proc_t(bsa_archive_t archive, [MarshalAs(UnmanagedType.LPWStr)] string file_path, bsa_file_record_t *file_record, bsa_folder_record_t *folder_record, void* context); - - [DllImport("libbsarch.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] - public static extern unsafe bsa_archive_t* bsa_create(); - - - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)] - public struct bsa_result_message_t - { - public byte code; // bsa_result_code_t - - public unsafe fixed byte text[1024 * 2]; - - } - - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)] - public unsafe struct bsa_result_buffer_t - { - public UInt32 size; - public IntPtr data; - } - - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)] - public unsafe struct bsa_result_message_buffer_t - { - public bsa_result_buffer_t buffer; - public bsa_result_message_t message; - } - - [DllImport("libbsarch.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] - public static extern unsafe bsa_result_message_t bsa_free(bsa_archive_t* t); - - [DllImport("libbsarch.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] - public static extern unsafe bsa_result_message_t bsa_load_from_file(bsa_archive_t* archive, string file_path); - - - [DllImport("libbsarch.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] - public static extern unsafe UInt32 bsa_version_get(bsa_archive_t* archive); - - - [DllImport("libbsarch.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] - public static extern unsafe UInt32 bsa_file_count_get(bsa_archive_t* archive); - - [DllImport("libbsarch.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] - public static extern unsafe bsa_result_message_t bsa_iterate_files(bsa_archive_t *archive, bsa_file_iteration_proc_t file_iteration_proc, void* context); - - [DllImport("libbsarch.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] - public static extern unsafe bsa_result_message_buffer_t bsa_extract_file_data_by_filename(bsa_archive_t* archive, string file_path); - - [DllImport("libbsarch.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] - public static extern unsafe bsa_result_message_t bsa_extract_file(bsa_archive_t* archive, string file_path, string save_as); - - [DllImport("libbsarch.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] - public static extern unsafe bsa_result_message_t bsa_file_data_free(bsa_archive_t* archive, bsa_result_buffer_t file_data_result); - - [DllImport("libbsarch.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] - public static extern unsafe bsa_archive_type_t bsa_archive_type_get(bsa_archive_t* archive); - - public enum bsa_archive_type_t : Int32 - { - baNone, baTES3, baTES4, baFO3, baSSE, baFO4, baFO4dds - } - - [DllImport("libbsarch.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] - - public static extern unsafe bsa_result_message_t bsa_add_file_from_memory(bsa_archive_t* archive, string file_path, UInt32 size, byte* data); - - [DllImport("libbsarch.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] - public static extern unsafe bsa_result_message_t bsa_save(bsa_archive_t* archive); - - [DllImport("libbsarch.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] - public static extern unsafe bsa_result_message_t bsa_create_archive(bsa_archive_t* archive, string file_path, bsa_archive_type_t archive_type, bsa_entry_list_t* entry_list); - - - // Entry Lists - - public struct bsa_entry_list_t { } - - [DllImport("libbsarch.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] - public static extern unsafe bsa_entry_list_t* bsa_entry_list_create(); - - [DllImport("libbsarch.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] - public static extern unsafe bsa_result_message_t bsa_entry_list_free(bsa_entry_list_t* entry_list); - - [DllImport("libbsarch.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] - public static extern unsafe UInt32 bsa_entry_list_count(bsa_entry_list_t* entry_list); - - [DllImport("libbsarch.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] - public static extern unsafe bsa_result_message_t bsa_entry_list_add(bsa_entry_list_t* entry_list, string entry_string); - - [DllImport("libbsarch.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] - public static extern unsafe UInt32 bsa_entry_list_get(bsa_entry_list_t* entry_list, UInt32 index, UInt32 string_buffer_size, string string_buffer); - - - - [DllImport("libbsarch.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] - public static extern unsafe UInt32 bsa_archive_flags_get(bsa_archive_t* archive); - - [DllImport("libbsarch.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] - public static extern unsafe void bsa_archive_flags_set(bsa_archive_t* archive, UInt32 flags); - - [DllImport("libbsarch.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] - public static extern unsafe UInt32 bsa_file_flags_get(bsa_archive_t* archive); - - [DllImport("libbsarch.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] - public static extern unsafe void bsa_file_flags_set(bsa_archive_t* archive, UInt32 flags); - - [DllImport("libbsarch.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] - public static extern unsafe bool bsa_compress_get(bsa_archive_t* archive); - - [DllImport("libbsarch.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] - public static extern unsafe void bsa_compress_set(bsa_archive_t* archive, bool flags); - - [DllImport("libbsarch.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] - public static extern unsafe bool bsa_share_data_get(bsa_archive_t* archive); - - [DllImport("libbsarch.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] - public static extern unsafe void bsa_share_data_set(bsa_archive_t* archive, bool flags); - - - } - - -} diff --git a/BSA.Tools/libbsarch.dll b/BSA.Tools/libbsarch.dll deleted file mode 100644 index eab88b94..00000000 Binary files a/BSA.Tools/libbsarch.dll and /dev/null differ diff --git a/Compression.BSA.Test/Program.cs b/Compression.BSA.Test/Program.cs index 14b0b299..ecf26484 100644 --- a/Compression.BSA.Test/Program.cs +++ b/Compression.BSA.Test/Program.cs @@ -13,7 +13,7 @@ namespace Compression.BSA.Test const string TempDir = "c:\\tmp\\out"; static void Main(string[] args) { - foreach (var bsa in Directory.EnumerateFiles(TestDir, "*.bsa", SearchOption.AllDirectories).Skip(16)) + foreach (var bsa in Directory.EnumerateFiles(TestDir, "*.bsa", SearchOption.AllDirectories)) { Console.WriteLine($"From {bsa}"); Console.WriteLine("Cleaning Output Dir"); diff --git a/Compression.BSA/BSABuilder.cs b/Compression.BSA/BSABuilder.cs index 4139b087..10210061 100644 --- a/Compression.BSA/BSABuilder.cs +++ b/Compression.BSA/BSABuilder.cs @@ -11,6 +11,7 @@ namespace Compression.BSA { public class BSABuilder : IDisposable { + internal LZ4Level _compressionLevel; internal byte[] _fileId; internal uint _version; internal uint _offset; @@ -26,6 +27,7 @@ namespace Compression.BSA public BSABuilder() { + _compressionLevel = LZ4Level.L10_OPT; _fileId = Encoding.ASCII.GetBytes("BSA\0"); _offset = 0x24; } @@ -326,7 +328,7 @@ namespace Compression.BSA if (_bsa.HeaderType == VersionType.SSE) { var r = new MemoryStream(); - using (var w = LZ4Stream.Encode(r)) + using (var w = LZ4Stream.Encode(r, new LZ4EncoderSettings() { CompressionLevel = _bsa._compressionLevel })) (new MemoryStream(_rawData)).CopyTo(w); _rawData = r.ToArray(); diff --git a/Compression.BSA/Utils.cs b/Compression.BSA/Utils.cs index dc225bc3..dd8cf209 100644 --- a/Compression.BSA/Utils.cs +++ b/Compression.BSA/Utils.cs @@ -5,7 +5,7 @@ using System.Text; namespace Compression.BSA { - public static class Utils + internal static class Utils { private static Encoding Windows1251 = Encoding.GetEncoding(1251); public static string ReadStringLen(this BinaryReader rdr) diff --git a/README.md b/README.md index 5d848df6..c9f630a6 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ rights of the game publisher and the mod authors. ### Socal Links [Discord](https://discord.gg/zgbrkmA) + ### How it works At a technical level the process is as follows. diff --git a/Wabbajack.Common/Data.cs b/Wabbajack.Common/Data.cs index c50f39a6..03de50de 100644 --- a/Wabbajack.Common/Data.cs +++ b/Wabbajack.Common/Data.cs @@ -103,7 +103,7 @@ namespace Wabbajack.Common public string TempID; public string IsCompressed; public uint Version; - public Int32 Type; + public uint Type; public bool ShareData; public uint FileFlags { get; set; } diff --git a/Wabbajack.Common/Wabbajack.Common.csproj b/Wabbajack.Common/Wabbajack.Common.csproj index 86d1b20f..668d3151 100644 --- a/Wabbajack.Common/Wabbajack.Common.csproj +++ b/Wabbajack.Common/Wabbajack.Common.csproj @@ -66,10 +66,6 @@ - - {b6389807-ea59-4633-b42b-a85f52fec135} - BSA.Tools - {8aa97f58-5044-4bba-b8d9-a74b6947a660} SevenZipExtractor diff --git a/Wabbajack.sln b/Wabbajack.sln index bf44ceec..17891ae9 100644 --- a/Wabbajack.sln +++ b/Wabbajack.sln @@ -5,8 +5,6 @@ VisualStudioVersion = 16.0.29102.190 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wabbajack.Common", "Wabbajack.Common\Wabbajack.Common.csproj", "{B3F3FB6E-B9EB-4F49-9875-D78578BC7AE5}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BSA.Tools", "BSA.Tools\BSA.Tools.csproj", "{B6389807-EA59-4633-B42B-A85F52FEC135}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SevenZipExtractor", "SevenZipExtractor\SevenZipExtractor.csproj", "{8AA97F58-5044-4BBA-B8D9-A74B6947A660}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Wabbajack", "Wabbajack\Wabbajack.csproj", "{33602679-8484-40C7-A10C-774DFF5D8314}" @@ -15,6 +13,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Compression.BSA", "Compress EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Compression.BSA.Test", "Compression.BSA.Test\Compression.BSA.Test.csproj", "{BA2CFEA1-072B-42D6-822A-8C6D0E3AE5D9}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{4EDEF6CC-2F5C-439B-BEAF-9D03895099F1}" + ProjectSection(SolutionItems) = preProject + LICENSE.txt = LICENSE.txt + README.md = README.md + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -25,10 +29,6 @@ Global {B3F3FB6E-B9EB-4F49-9875-D78578BC7AE5}.Debug|Any CPU.Build.0 = Debug|Any CPU {B3F3FB6E-B9EB-4F49-9875-D78578BC7AE5}.Release|Any CPU.ActiveCfg = Release|Any CPU {B3F3FB6E-B9EB-4F49-9875-D78578BC7AE5}.Release|Any CPU.Build.0 = Release|Any CPU - {B6389807-EA59-4633-B42B-A85F52FEC135}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B6389807-EA59-4633-B42B-A85F52FEC135}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B6389807-EA59-4633-B42B-A85F52FEC135}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B6389807-EA59-4633-B42B-A85F52FEC135}.Release|Any CPU.Build.0 = Release|Any CPU {8AA97F58-5044-4BBA-B8D9-A74B6947A660}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8AA97F58-5044-4BBA-B8D9-A74B6947A660}.Debug|Any CPU.Build.0 = Debug|Any CPU {8AA97F58-5044-4BBA-B8D9-A74B6947A660}.Release|Any CPU.ActiveCfg = Release|Any CPU diff --git a/Wabbajack/Compiler.cs b/Wabbajack/Compiler.cs index f17d26d8..17b9a750 100644 --- a/Wabbajack/Compiler.cs +++ b/Wabbajack/Compiler.cs @@ -1,4 +1,4 @@ -using BSA.Tools; +using Compression.BSA; using Newtonsoft.Json; using SevenZipExtractor; using SharpCompress.Archives; @@ -295,13 +295,10 @@ namespace Wabbajack var bsa_id = to.Split('\\')[1]; var bsa = InstallDirectives.OfType().First(b => b.TempID == bsa_id); - using (var a = new BSAFile(Path.Combine(MO2Folder, bsa.To))) + using (var a = new BSAReader(Path.Combine(MO2Folder, bsa.To))) { - var file = a.Entries.First(e => e.Filename == Path.Combine(to.Split('\\').Skip(2).ToArray())); - using (var data = file.GetFileData()) - { - return data.ToByteArray(); - } + var file = a.Files.First(e => e.Path == Path.Combine(to.Split('\\').Skip(2).ToArray())); + return file.GetData(); } } @@ -498,18 +495,15 @@ namespace Wabbajack }; CreateBSA directive; - using (var bsa = new BSAFile(source.AbsolutePath)) + using (var bsa = new BSAReader(source.AbsolutePath)) { directive = new CreateBSA() { To = source.Path, TempID = id, - Version = bsa.Version, - Type = (int)bsa.Type, - FileFlags = bsa.FileFlags, - ArchiveFlags = bsa.ArchiveFlags, - Compress = bsa.Compress, - ShareData = bsa.ShareData + Type = (uint)bsa.HeaderType, + FileFlags = (uint)bsa.FileFlags, + ArchiveFlags = (uint)bsa.ArchiveFlags, }; }; @@ -527,16 +521,14 @@ namespace Wabbajack { Status($"Hashing BSA: {absolutePath}"); var results = new List<(string, string)>(); - using (var a = new BSAFile(absolutePath)) + using (var a = new BSAReader(absolutePath)) { - foreach (var entry in a.Entries) + foreach (var entry in a.Files) { - Status($"Hashing BSA: {absolutePath} - {entry.Filename}"); + Status($"Hashing BSA: {absolutePath} - {entry.Path}"); - using (var data = entry.GetFileData()) - { - results.Add((entry.Filename, data.ToByteArray().SHA256())); - }; + var data = entry.GetData(); + results.Add((entry.Path, data.SHA256())); } } return results; diff --git a/Wabbajack/Installer.cs b/Wabbajack/Installer.cs index 4816b1f5..9871e233 100644 --- a/Wabbajack/Installer.cs +++ b/Wabbajack/Installer.cs @@ -1,4 +1,4 @@ -using BSA.Tools; +using Compression.BSA; using SevenZipExtractor; using System; using System.Collections.Generic; @@ -9,7 +9,6 @@ using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using Wabbajack.Common; -using static BSA.Tools.libbsarch; namespace Wabbajack { @@ -91,37 +90,34 @@ namespace Wabbajack private void BuildBSAs() { var bsas = ModList.Directives.OfType().ToList(); - Info("Building {0} bsa files"); + Info($"Building {bsas.Count} bsa files"); bsas.Do(bsa => { Status($"Building {bsa.To}"); var source_dir = Path.Combine(Outputfolder, Consts.BSACreationDir, bsa.TempID); - using (var entries = new EntryList()) + var source_files = Directory.EnumerateFiles(source_dir, "*", SearchOption.AllDirectories) + .Select(e => e.Substring(source_dir.Length + 1)) + .ToList(); + + using (var a = new BSABuilder()) { - var source_files = Directory.EnumerateFiles(source_dir, "*", SearchOption.AllDirectories) - .Select(e => e.Substring(source_dir.Length + 1)) - .ToList(); - source_files.Do(name => entries.Add(name)); + //a.Create(Path.Combine(Outputfolder, bsa.To), (bsa_archive_type_t)bsa.Type, entries); + a.HeaderType = (VersionType)bsa.Type; + a.FileFlags = (FileFlags)bsa.FileFlags; + a.ArchiveFlags = (ArchiveFlags)bsa.ArchiveFlags; - using (var a = new BSAFile()) + source_files.PMap(f => { + Status($"Adding {f} to BSA"); + using (var fs = File.OpenRead(Path.Combine(source_dir, f))) + a.AddFile(f, fs); + }); - a.Create(Path.Combine(Outputfolder, bsa.To), (bsa_archive_type_t)bsa.Type, entries); - a.FileFlags = bsa.FileFlags; - a.ArchiveFlags = bsa.ArchiveFlags; - a.ShareData = bsa.ShareData; + Info($"Writing {bsa.To}"); + a.Build(Path.Combine(Outputfolder, bsa.To)); - - source_files.Do(e => - { - a.AddFile(e, File.ReadAllBytes(Path.Combine(source_dir, e))); - }); - - a.Save(); - - } } }); diff --git a/Wabbajack/Wabbajack.csproj b/Wabbajack/Wabbajack.csproj index d48b3207..6aef1cac 100644 --- a/Wabbajack/Wabbajack.csproj +++ b/Wabbajack/Wabbajack.csproj @@ -117,9 +117,9 @@ - - {b6389807-ea59-4633-b42b-a85f52fec135} - BSA.Tools + + {ff5d892f-8ff4-44fc-8f7f-cd58f307ad1b} + Compression.BSA {8aa97f58-5044-4bba-b8d9-a74b6947a660}