Пример #1
0
            /// <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);
                                }
                            }
                        }
                    }
                }
            }
Пример #2
0
 /// <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;
 }