2017-03-04 07:59:37 -05:00
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.IO;
|
|
|
|
|
|
|
|
|
|
namespace ACE.DatLoader
|
|
|
|
|
{
|
|
|
|
|
public class DatDirectory
|
|
|
|
|
{
|
2018-02-05 21:26:06 -06:00
|
|
|
private uint rootSectorOffset { get; }
|
2017-03-04 07:59:37 -05:00
|
|
|
|
2018-02-05 21:26:06 -06:00
|
|
|
private uint blockSize { get; }
|
2017-03-04 07:59:37 -05:00
|
|
|
|
2017-05-05 10:26:35 -04:00
|
|
|
|
2018-02-06 10:18:38 -06:00
|
|
|
public DatDirectoryHeader DatDirectoryHeader { get; } = new DatDirectoryHeader();
|
2017-05-05 10:26:35 -04:00
|
|
|
|
2018-02-06 10:18:38 -06:00
|
|
|
public List<DatDirectory> Directories { get; } = new List<DatDirectory>();
|
|
|
|
|
|
2017-03-04 07:59:37 -05:00
|
|
|
|
2018-02-06 10:18:38 -06:00
|
|
|
public DatDirectory(uint rootSectorOffset, uint blockSize)
|
2017-03-04 07:59:37 -05:00
|
|
|
{
|
2018-02-06 10:18:38 -06:00
|
|
|
this.rootSectorOffset = rootSectorOffset;
|
|
|
|
|
this.blockSize = blockSize;
|
|
|
|
|
}
|
2017-03-04 07:59:37 -05:00
|
|
|
|
2018-02-06 10:18:38 -06:00
|
|
|
public void Read(FileStream stream)
|
|
|
|
|
{
|
|
|
|
|
var headerReader = new DatReader(stream, rootSectorOffset, DatDirectoryHeader.ObjectSize, blockSize);
|
2017-03-04 07:59:37 -05:00
|
|
|
|
2018-02-06 10:18:38 -06:00
|
|
|
using (var memoryStream = new MemoryStream(headerReader.Buffer))
|
|
|
|
|
using (var reader = new BinaryReader(memoryStream))
|
|
|
|
|
DatDirectoryHeader.Unpack(reader);
|
2017-03-04 07:59:37 -05:00
|
|
|
|
|
|
|
|
// directory is allowed to have files + 1 subdirectories
|
2018-02-06 10:18:38 -06:00
|
|
|
if (DatDirectoryHeader.Branches[0] != 0)
|
2017-03-04 07:59:37 -05:00
|
|
|
{
|
2018-02-06 10:18:38 -06:00
|
|
|
for (int i = 0; i < DatDirectoryHeader.EntryCount + 1; i++)
|
|
|
|
|
{
|
|
|
|
|
var directory = new DatDirectory(DatDirectoryHeader.Branches[i], blockSize);
|
|
|
|
|
directory.Read(stream);
|
|
|
|
|
Directories.Add(directory);
|
|
|
|
|
}
|
2017-05-05 10:26:35 -04:00
|
|
|
}
|
2017-03-04 07:59:37 -05:00
|
|
|
}
|
|
|
|
|
|
2017-05-05 10:26:35 -04:00
|
|
|
public void AddFilesToList(Dictionary<uint, DatFile> dicFiles)
|
|
|
|
|
{
|
2018-02-06 10:18:38 -06:00
|
|
|
Directories.ForEach(d => d.AddFilesToList(dicFiles));
|
|
|
|
|
|
2018-02-07 09:02:24 -06:00
|
|
|
for (int i = 0; i < DatDirectoryHeader.EntryCount; i++)
|
|
|
|
|
dicFiles[DatDirectoryHeader.Entries[i].ObjectId] = DatDirectoryHeader.Entries[i];
|
2017-05-05 10:26:35 -04:00
|
|
|
}
|
2017-03-04 07:59:37 -05:00
|
|
|
}
|
|
|
|
|
}
|