69 lines
1.6 KiB
C#
69 lines
1.6 KiB
C#
using System.Text;
|
|
|
|
namespace KeepersCompound.LGS.Database;
|
|
|
|
public struct ChunkHeader
|
|
{
|
|
public string Name { get; set; }
|
|
public Version Version { get; set; }
|
|
|
|
public ChunkHeader(BinaryReader reader)
|
|
{
|
|
Name = reader.ReadNullString(12);
|
|
Version = new(reader);
|
|
reader.ReadBytes(4);
|
|
}
|
|
|
|
public readonly void Write(BinaryWriter writer)
|
|
{
|
|
var writeBytes = new byte[12];
|
|
var nameBytes = Encoding.UTF8.GetBytes(Name);
|
|
nameBytes[..Math.Min(12, nameBytes.Length)].CopyTo(writeBytes, 0);
|
|
writer.Write(writeBytes);
|
|
Version.Write(writer);
|
|
writer.Write(new byte[4]);
|
|
}
|
|
}
|
|
|
|
public interface IChunk
|
|
{
|
|
public ChunkHeader Header { get; set; }
|
|
|
|
public void Read(BinaryReader reader, DbFile.TableOfContents.Entry entry)
|
|
{
|
|
reader.BaseStream.Seek(entry.Offset, SeekOrigin.Begin);
|
|
|
|
Header = new(reader);
|
|
ReadData(reader, entry);
|
|
}
|
|
|
|
public void Write(BinaryWriter writer)
|
|
{
|
|
Header.Write(writer);
|
|
WriteData(writer);
|
|
}
|
|
|
|
public abstract void ReadData(BinaryReader reader, DbFile.TableOfContents.Entry entry);
|
|
public abstract void WriteData(BinaryWriter writer);
|
|
}
|
|
|
|
public class GenericChunk : IChunk
|
|
{
|
|
public ChunkHeader Header { get; set; }
|
|
public byte[] Data { get; set; }
|
|
|
|
public void ReadData(BinaryReader reader, DbFile.TableOfContents.Entry entry)
|
|
{
|
|
Data = reader.ReadBytes((int)entry.Size);
|
|
}
|
|
|
|
public void WriteData(BinaryWriter writer)
|
|
{
|
|
writer.Write(Data);
|
|
}
|
|
}
|
|
|
|
public interface IMergable
|
|
{
|
|
public abstract void Merge(IMergable other);
|
|
} |