Beispiel #1
0
        /// <summary>
        /// Loads a MPK file
        /// </summary>
        /// <param name="fname">The filename to load</param>
        public void Load(string fname)
        {
            var fi = new FileInfo(fname);

            if (!fi.Exists)
            {
                throw new FileNotFoundException("File does not exist", fname);
            }

            using (FileStream file = fi.OpenRead())
            {
                _buf = new byte[fi.Length];
                file.Read(_buf, 0, _buf.Length);
            }

            _hdr = new MPKFileHeader {
                Name = fname, UncompressedSize = (uint)fi.Length, TimeStamp = (uint)DateTime.Now.ToFileTime()
            };

            var def = new Deflater();

            def.SetInput(_buf, 0, _buf.Length);
            def.Finish();

            // create temporary buffer
            var tempbuffer = new byte[_buf.Length + _buf.Length / 5];

            _hdr.CompressedSize = (uint)def.Deflate(tempbuffer, 0, tempbuffer.Length);

            _compBuf = new byte[_hdr.CompressedSize];
            Buffer.BlockCopy(tempbuffer, 0, _compBuf, 0, (int)_hdr.CompressedSize);


            var crc = new Crc32();

            crc.Update(_compBuf, 0, (int)_hdr.CompressedSize);

            _hdr.CRC = crc;
        }
Beispiel #2
0
        /// <summary>
        /// Reads a MPK from a binary reader
        /// </summary>
        /// <param name="rdr">The binary reader pointing to the MPK</param>
        private void ReadArchive(BinaryReader rdr)
        {
            _files.Clear();

            _crc.Value = 0;
            _sizeDir   = 0;
            _sizeName  = 0;
            _numFiles  = 0;

            var buf = new byte[16];

            rdr.Read(buf, 0, 16);

            for (byte i = 0; i < 16; ++i)
            {
                buf[i] ^= i;
            }

            _crc.Value = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
            _sizeDir   = (buf[4] << 24) | (buf[5] << 16) | (buf[6] << 8) | buf[7];
            _sizeName  = (buf[8] << 24) | (buf[9] << 16) | (buf[10] << 8) | buf[11];
            _numFiles  = (buf[12] << 24) | (buf[13] << 16) | (buf[14] << 8) | buf[15];

            buf = new byte[_sizeName];
            rdr.Read(buf, 0, _sizeName);

            var inf = new Inflater();

            inf.SetInput(buf);
            buf = new byte[1024];
            inf.Inflate(buf);
            buf[inf.TotalOut] = 0;

            _name = Marshal.ConvertToString(buf);

            long totalin = 0;

            buf = ReadDirectory(rdr, ref totalin);

            using (var directory = new MemoryStream(buf))
            {
                long pos = rdr.BaseStream.Position;
                long len = rdr.BaseStream.Seek(0, SeekOrigin.End);
                rdr.BaseStream.Position = pos;

                buf = new byte[len - pos];
                rdr.Read(buf, 0, buf.Length);

                using (var files = new MemoryStream(buf))
                {
                    rdr.BaseStream.Position = pos - totalin;
                    buf = new byte[totalin];
                    rdr.Read(buf, 0, buf.Length);

                    var crc = new Crc32();
                    crc.Reset();
                    crc.Update(buf);

                    if (crc.Value != _crc.Value)
                    {
                        throw new Exception("Invalid or corrupt MPK");
                    }

                    while (directory.Position < directory.Length && files.Position < files.Length)
                    {
                        crc.Reset();

                        buf = new byte[MPKFileHeader.MaxSize];
                        directory.Read(buf, 0, MPKFileHeader.MaxSize);

                        MPKFileHeader hdr;

                        using (var hdrStream = new MemoryStream(buf))
                        {
                            using (var hdrRdr = new BinaryReader(hdrStream, Encoding.UTF8))
                            {
                                hdr = new MPKFileHeader(hdrRdr);
                            }
                        }

                        var compbuf = new byte[hdr.CompressedSize];
                        files.Read(compbuf, 0, compbuf.Length);

                        crc.Update(compbuf, 0, compbuf.Length);

                        inf.Reset();
                        inf.SetInput(compbuf, 0, compbuf.Length);
                        buf = new byte[hdr.UncompressedSize];
                        inf.Inflate(buf, 0, buf.Length);

                        var file = new MPKFile(compbuf, buf, hdr);

                        if (crc.Value != hdr.CRC.Value)
                        {
                            OnInvalidFile(file);
                            continue;
                        }

                        _files.Add(hdr.Name.ToLower(), file);
                    }
                }
            }
        }
Beispiel #3
0
 /// <summary>
 /// Constructs a new MPK file entry
 /// </summary>
 /// <param name="compData">The compressed data of this file entry</param>
 /// <param name="data">The uncompressed data of this file entry</param>
 /// <param name="hdr">The file entry header</param>
 public MPKFile(byte[] compData, byte[] data, MPKFileHeader hdr)
 {
     _compBuf = compData;
     _buf     = data;
     _hdr     = hdr;
 }
Beispiel #4
0
		/// <summary>
		/// Reads a MPK from a binary reader
		/// </summary>
		/// <param name="rdr">The binary reader pointing to the MPK</param>
		private void ReadArchive(BinaryReader rdr)
		{
			_files.Clear();

			_crc.Value = 0;
			_sizeDir = 0;
			_sizeName = 0;
			_numFiles = 0;

			var buf = new byte[16];
			rdr.Read(buf, 0, 16);

			for (byte i = 0; i < 16; ++i)
			{
				buf[i] ^= i;
			}

			_crc.Value = ((buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]);
			_sizeDir = ((buf[4] << 24) | (buf[5] << 16) | (buf[6] << 8) | buf[7]);
			_sizeName = ((buf[8] << 24) | (buf[9] << 16) | (buf[10] << 8) | buf[11]);
			_numFiles = ((buf[12] << 24) | (buf[13] << 16) | (buf[14] << 8) | buf[15]);

			buf = new byte[_sizeName];
			rdr.Read(buf, 0, _sizeName);

			var inf = new Inflater();
			inf.SetInput(buf);
			buf = new byte[1024];
			inf.Inflate(buf);
			buf[inf.TotalOut] = 0;

			_name = Marshal.ConvertToString(buf);

			long totalin = 0;
			buf = ReadDirectory(rdr, ref totalin);

			using (var directory = new MemoryStream(buf))
			{
				long pos = rdr.BaseStream.Position;
				long len = rdr.BaseStream.Seek(0, SeekOrigin.End);
				rdr.BaseStream.Position = pos;

				buf = new byte[len - pos];
				rdr.Read(buf, 0, buf.Length);

				using (var files = new MemoryStream(buf))
				{
					rdr.BaseStream.Position = pos - totalin;
					buf = new byte[totalin];
					rdr.Read(buf, 0, buf.Length);

					var crc = new Crc32();
					crc.Reset();
					crc.Update(buf);

					if (crc.Value != _crc.Value)
					{
						throw new Exception("Invalid or corrupt MPK");
					}

					while (directory.Position < directory.Length && files.Position < files.Length)
					{
						crc.Reset();

						buf = new byte[MPKFileHeader.MaxSize];
						directory.Read(buf, 0, MPKFileHeader.MaxSize);

						MPKFileHeader hdr;

						using (var hdrStream = new MemoryStream(buf))
						{
							using (var hdrRdr = new BinaryReader(hdrStream, Encoding.UTF8))
							{
								hdr = new MPKFileHeader(hdrRdr);
							}
						}

						var compbuf = new byte[hdr.CompressedSize];
						files.Read(compbuf, 0, compbuf.Length);

						crc.Update(compbuf, 0, compbuf.Length);

						inf.Reset();
						inf.SetInput(compbuf, 0, compbuf.Length);
						buf = new byte[hdr.UncompressedSize];
						inf.Inflate(buf, 0, buf.Length);

						var file = new MPKFile(compbuf, buf, hdr);

						if (crc.Value != hdr.CRC.Value)
						{
							OnInvalidFile(file);
							continue;
						}

						_files.Add(hdr.Name.ToLower(), file);
					}
				}
			}
		}
Beispiel #5
0
		/// <summary>
		/// Constructs a new MPK file entry
		/// </summary>
		/// <param name="compData">The compressed data of this file entry</param>
		/// <param name="data">The uncompressed data of this file entry</param>
		/// <param name="hdr">The file entry header</param>
		public MPKFile(byte[] compData, byte[] data, MPKFileHeader hdr)
		{
			_compBuf = compData;
			_buf = data;
			_hdr = hdr;
		}
Beispiel #6
0
		/// <summary>
		/// Loads a MPK file
		/// </summary>
		/// <param name="fname">The filename to load</param>
		public void Load(string fname)
		{
			var fi = new FileInfo(fname);

			if (!fi.Exists)
			{
				throw new FileNotFoundException("File does not exist", fname);
			}

			using (FileStream file = fi.OpenRead())
			{
				_buf = new byte[fi.Length];
				file.Read(_buf, 0, _buf.Length);
			}

			_hdr = new MPKFileHeader { Name = fname, UncompressedSize = (uint)fi.Length, TimeStamp = (uint)DateTime.Now.ToFileTime() };

			var def = new Deflater();

			def.SetInput(_buf, 0, _buf.Length);
			def.Finish();

			// create temporary buffer
			var tempbuffer = new byte[_buf.Length + _buf.Length / 5];
			_hdr.CompressedSize = (uint)def.Deflate(tempbuffer, 0, tempbuffer.Length);

			_compBuf = new byte[_hdr.CompressedSize];
			Buffer.BlockCopy(tempbuffer, 0, _compBuf, 0, (int)_hdr.CompressedSize);


			var crc = new Crc32();
			crc.Update(_compBuf, 0, (int)_hdr.CompressedSize);

			_hdr.CRC = crc;
		}