All pastes #292355 Raw Edit

Someone

public text v1 · immutable
#292355 ·published 2006-12-26 12:49 UTC
rendered paste body
using System;
using System.IO;

using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip.Compression;

namespace MPKLib
{
    public class MPAK
    {
        /// <summary>
        /// Loads an MPK/NPK from the file specified
        /// </summary>
        /// <param name="filename">file</param>
        public MPAK(string filename)
        {
            Load(filename);
        }
        
        /// <summary>
        /// Creates a new empty MPAK
        /// </summary>
        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();
        }
    }
}