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}