/// <summary> /// Open the specified TPI package. /// </summary> public void Open(String Source) { Close(); lock (Entries) { Filename = Source; if (!File.Exists(Source.ToLower().Replace(".tpi", ".tpd"))) { throw new Exception("The TPI file does not have it's TPD equivalent: " + Filename); } TpdFile = new TPD(); TpdFile.Open(Source.ToLower().Replace(".tpi", ".tpd")); using (FileStream Stream = new FileStream(Filename, FileMode.Open, FileAccess.Read, FileShare.Read)) { Byte[] Buffer = new Byte[Kernel.MAX_BUFFER_SIZE]; Stream.Read(Buffer, 0, sizeof(Header)); Kernel.memcpy(pHeader, Buffer, sizeof(Header)); if (Kernel.cstring(pHeader->Identifier, MAX_IDENTIFIERSIZE) != TPI_IDENTIFIER) { throw new Exception("Invalid TPI Header in file: " + Filename); } if (pHeader->Version != TPI_VERSION) { throw new Exception("Unsupported TPI version!"); } using (BinaryReader Reader = new BinaryReader(Stream, Encoding)) { for (Int32 i = 0; i < pHeader->Number; i++) { Entry Entry = new Entry(); Entry.Path = Encoding.GetString(Reader.ReadBytes(Reader.ReadByte())); Entry.Unknown1 = Reader.ReadInt16(); Entry.UncompressedSize = Reader.ReadUInt32(); Entry.CompressedSize = Reader.ReadUInt32(); if (Reader.ReadUInt32() != Entry.CompressedSize) { continue; } if (Reader.ReadUInt32() != Entry.UncompressedSize) { continue; } Entry.Offset = Reader.ReadUInt32(); if (!Entries.ContainsKey(Entry.Path)) { Entries.Add(Entry.Path, Entry); } } } } } }
/// <summary> /// Close the file, reset the dictionary and free all the used memory. /// </summary> public void Close() { Kernel.memset(pHeader, 0x00, sizeof(Header)); if (Entries != null) { lock (Entries) { Entries.Clear(); } } if (TpdFile != null) { TpdFile.Close(); } TpdFile = null; }