public bool ReadArchive(bool ThrowException)
{
m_FinishedReading.Reset();
if (m_Reader == null)
m_Reader = new FileReader(m_Path, false);
lock (m_Reader)
{
ASCIIEncoding Enc = new ASCIIEncoding();
string MagicNumber = Enc.GetString(m_Reader.ReadBytes(8));
if (!MagicNumber.Equals("FAR!byAZ", StringComparison.InvariantCultureIgnoreCase))
{
if (ThrowException)
throw new FAR3Exception("MagicNumber was wrong - FAR3Archive.cs!");
else
{
m_Reader.Close();
return false;
}
}
m_Reader.ReadUInt32(); //Version.
m_Reader.Seek((long)m_Reader.ReadUInt32());
uint NumFiles = m_Reader.ReadUInt32();
for (int i = 0; i < NumFiles; i++)
{
FAR3Entry Entry = new FAR3Entry();
Entry.DecompressedDataSize = m_Reader.ReadUInt32();
byte[] Dummy = m_Reader.ReadBytes(3);
Entry.CompressedDataSize = (uint)((Dummy[0] << 0) | (Dummy[1] << 8) | (Dummy[2]) << 16);
m_Reader.ReadByte(); //Unknown.
Entry.DataOffset = m_Reader.ReadUInt32();
Entry.Flags = m_Reader.ReadUShort();
Entry.FileNameLength = m_Reader.ReadUShort();
Entry.TypeID = m_Reader.ReadUInt32();
Entry.FileID = m_Reader.ReadUInt32();
Entry.Filename = Enc.GetString(m_Reader.ReadBytes(Entry.FileNameLength));
UniqueFileID ID = new UniqueFileID(Entry.TypeID, Entry.FileID);
if (!m_Entries.ContainsKey(ID.UniqueID))
m_Entries.AddOrUpdate(ID.UniqueID, Entry, (Key, ExistingValue) => ExistingValue = Entry);
}
}
m_FinishedReading.Set();
return true;
}