using System; using System.IO; using ICSharpCode.SharpZipLib.Checksums; using ICSharpCode.SharpZipLib.Zip.Compression; namespace MPKLib { public class MPAK { /// /// Loads an MPK/NPK from the file specified /// /// file public MPAK(string filename) { Load(filename); } /// /// Creates a new empty MPAK /// public MPAK() { } public bool Load(string file) { BinaryReader reader = new StreamReader(file); uint mpak = reader.ReadUInt32(); if (mpak != 0x4B41504D) throw new Exception("Unkown file format."); byte version = reader.ReadByte(); if (version != 0x02) throw new Exception("Unkown mpk archive version (" + m_version + ")!"); byte[] buffer = new byte[16]; reader.Read(buffer, 0, 16); for (int i = 0; i < 16; i++) buffer[0] ^= i; long checksum = (long)(buffer[0] + (buffer[1] << 8) + (buffer[2] << 16) + (buffer[3] << 24)); int dirsize = buffer[4] + (buffer[5] << 8) + (buffer[6] << 16) + (buffer[7] << 24); int namesize = buffer[8] + (buffer[9] << 8) + (buffer[10] << 16) + (buffer[11] << 24); int filecount = buffer[12] + (buffer[13] << 8) + (buffer[14] << 16) + (buffer[15] << 24); buffer = new byte[namesize]; reader.Read(buffer, 0, namesize); Inflater inflater = new Inflater(); inflater.SetInput(buffer); /* procedure TMPKFile.ReadArchive(AIn: TStream); var FDirSize, FFileCount: LongInt; FDirBuf, FFileBuf: TStream; procedure ReadHeader(ABuf: TStream); var FBuf: array of Byte; FName: Pointer; I, FNameSize: Integer; begin // Read 16 byte. SetLength(FBuf, 16); try ABuf.Read(FBuf[0], 16); // Decode buffer for I := 0 to 15 do FBuf[I] := FBuf[I] xor I; // Parse FChecksum := FBuf[0] + (FBuf[1] shl 8) + (FBuf[2] shl 16) + (FBuf[3] shl 24); FDirSize := FBuf[4] + (FBuf[5] shl 8) + (FBuf[6] shl 16) + (FBuf[7] shl 24); FNameSize := FBuf[8] + (FBuf[9] shl 8) + (FBuf[10] shl 16) + (FBuf[11] shl 24); FFileCount := FBuf[12] + (FBuf[13] shl 8) + (FBuf[14] shl 16) + (FBuf[15] shl 24); finally SetLength(FBuf, 0); end; // Read deflated name data SetLength(FBuf, FNameSize); try ABuf.Read(FBuf[0], FNameSize); // Inflate name data DecompressBuf(@FBuf[0], FNameSize, 0, FName, I); try FInnerName := LeftStr(PChar(FName), I); finally FreeMem(FName); end; finally SetLength(FBuf, 0); end; end; */ } public bool Save(string file) { throw new NotImplementedException(); } } }