using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using Wabbajack.Common; namespace Compression.BSA { public interface IBSAReader : IAsyncDisposable { /// <summary> /// The files defined by the archive /// </summary> IEnumerable<IFile> Files { get; } ArchiveStateObject State { get; } void Dump(Action<string> print); } public interface IBSABuilder : IAsyncDisposable { Task AddFile(FileStateObject state, Stream src); Task Build(AbsolutePath filename); } public class ArchiveStateObject { public virtual IBSABuilder MakeBuilder(long size) { throw new NotImplementedException(); } } public class FileStateObject { public int Index { get; set; } public RelativePath Path { get; set; } } public interface IFile { /// <summary> /// The path of the file inside the archive /// </summary> RelativePath Path { get; } /// <summary> /// The uncompressed file size /// </summary> uint Size { get; } /// <summary> /// Get the metadata for the file. /// </summary> FileStateObject State { get; } /// <summary> /// Copies this entry to the given stream. 100% thread safe, the .bsa will be opened multiple times /// in order to maintain thread-safe access. /// </summary> /// <param name="output"></param> ValueTask CopyDataTo(Stream output); void Dump(Action<string> print); } }