Ejemplo n.º 1
0
        public object[] Deserialize(Stream readStream, Type[] types, string[] names)
        {
            var reader   = new BinaryReader(readStream);
            var argLenth = reader.ReadByte();
            var args     = new object[argLenth];

            for (int i = 0; i < argLenth; i++)
            {
                var itemType = types[i];
                if (typeof(Stream).IsAssignableFrom(itemType))
                {
                    //TODO: large stream write to temp file, small size stream write to memory stream
                    var tempFs = new TempFileStream(Path.GetTempFileName(), FileMode.Create);
                    int loop   = 0;
                    while (true)
                    {
                        var buff = (byte[])RuntimeTypeModel.Default.DeserializeWithLengthPrefix(readStream, null, typeof(byte[]), ProtoBuf.PrefixStyle.Base128, args.Length + i * loop);
                        if (buff.Length == 0)
                        {
                            tempFs.Position = 0;
                            break;
                        }
                        tempFs.Write(buff, 0, buff.Length);
                        loop++;
                    }
                    args[i] = tempFs;
                }
                else
                {
                    args[i] = RuntimeTypeModel.Default.DeserializeWithLengthPrefix(readStream, null, itemType, ProtoBuf.PrefixStyle.Base128, i);
                }
            }
            return(args);
        }
Ejemplo n.º 2
0
		public void Read(Stream str)
		{
			this.Entries.Clear();
			BigEndianBinaryReader bigEndianBinaryReader = new BigEndianBinaryReader(str);
			this.header.MagicNumber = bigEndianBinaryReader.ReadUInt32();
			this.header.VersionNumber = bigEndianBinaryReader.ReadUInt32();
			this.header.CompressionMethod = bigEndianBinaryReader.ReadUInt32();
			this.header.TotalTOCSize = bigEndianBinaryReader.ReadUInt32();
			this.header.TOCEntrySize = bigEndianBinaryReader.ReadUInt32();
			this.header.numFiles = bigEndianBinaryReader.ReadUInt32();
			this.header.blockSize = bigEndianBinaryReader.ReadUInt32();
			this.header.archiveFlags = bigEndianBinaryReader.ReadUInt32();

            var tocStream = str;
            BigEndianBinaryReader bigEndianBinaryReaderTOC = bigEndianBinaryReader;
            if (this.header.archiveFlags == 4)
            {
                var decStream = new TempFileStream();
                using (var outputStream = new MemoryStream())
                {
                    RijndaelEncryptor.DecryptPSARC(str, outputStream, this.header.TotalTOCSize);

                    int bytesRead;
                    byte[] buffer = new byte[30000];

                    int decMax = (int)this.header.TotalTOCSize - 32;
                    int decSize = 0;
                    outputStream.Seek(0, SeekOrigin.Begin);
                    while ((bytesRead = outputStream.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        decSize += bytesRead;
                        if (decSize > decMax) bytesRead = decMax - (decSize - bytesRead);
                        decStream.Write(buffer, 0, bytesRead);
                    }
                }

                decStream.Seek(0, SeekOrigin.Begin);
                str.Seek(this.header.TotalTOCSize, SeekOrigin.Begin);
                tocStream = decStream;
                bigEndianBinaryReaderTOC = new BigEndianBinaryReader(tocStream);
            }

			if (this.header.MagicNumber == 1347633490)
			{
				if (this.header.CompressionMethod == 2053925218)
				{
					byte b = 1;
					uint num = 256;
					do
					{
						num *= 256;
						b += 1;
					}
					while (num < this.header.blockSize);
					int num2 = 0;
					while (num2 < this.header.numFiles)
					{
						this.Entries.Add(new Entry
						{
							id = num2,
                            MD5 = bigEndianBinaryReaderTOC.ReadBytes(16),
                            zIndex = bigEndianBinaryReaderTOC.ReadUInt32(),
                            Length = bigEndianBinaryReaderTOC.ReadUInt40(),
                            Offset = bigEndianBinaryReaderTOC.ReadUInt40()
						});
						num2++;
					}

                    long decMax = (this.header.archiveFlags == 4) ? 32 : 0;
                    uint num3 = (this.header.TotalTOCSize - (uint)(tocStream.Position + decMax)) / (uint)b;
					uint[] array = new uint[num3];
					num2 = 0;
					while (num2 < num3)
					{
						switch (b)
						{
						case 2:
                            array[num2] = (uint)bigEndianBinaryReaderTOC.ReadUInt16();
							break;
						case 3:
                            array[num2] = bigEndianBinaryReaderTOC.ReadUInt24();
							break;
						case 4:
                            array[num2] = bigEndianBinaryReaderTOC.ReadUInt32();
							break;
						}
						num2++;
					}
					this.inflateEntries(bigEndianBinaryReader, array.ToArray<uint>(), this.header.blockSize);
					this.ReadNames();
				}
			}
            //str.Flush();
		}
Ejemplo n.º 3
0
        public void Read(Stream str)
        {
            this.Entries.Clear();
            BigEndianBinaryReader bigEndianBinaryReader = new BigEndianBinaryReader(str);

            this.header.MagicNumber       = bigEndianBinaryReader.ReadUInt32();
            this.header.VersionNumber     = bigEndianBinaryReader.ReadUInt32();
            this.header.CompressionMethod = bigEndianBinaryReader.ReadUInt32();
            this.header.TotalTOCSize      = bigEndianBinaryReader.ReadUInt32();
            this.header.TOCEntrySize      = bigEndianBinaryReader.ReadUInt32();
            this.header.numFiles          = bigEndianBinaryReader.ReadUInt32();
            this.header.blockSize         = bigEndianBinaryReader.ReadUInt32();
            this.header.archiveFlags      = bigEndianBinaryReader.ReadUInt32();

            var tocStream = str;
            BigEndianBinaryReader bigEndianBinaryReaderTOC = bigEndianBinaryReader;

            if (this.header.archiveFlags == 4)
            {
                var decStream = new TempFileStream();
                using (var outputStream = new MemoryStream())
                {
                    RijndaelEncryptor.DecryptPSARC(str, outputStream, this.header.TotalTOCSize);

                    int    bytesRead;
                    byte[] buffer = new byte[30000];

                    int decMax  = (int)this.header.TotalTOCSize - 32;
                    int decSize = 0;
                    outputStream.Seek(0, SeekOrigin.Begin);
                    while ((bytesRead = outputStream.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        decSize += bytesRead;
                        if (decSize > decMax)
                        {
                            bytesRead = decMax - (decSize - bytesRead);
                        }
                        decStream.Write(buffer, 0, bytesRead);
                    }
                }

                decStream.Seek(0, SeekOrigin.Begin);
                str.Seek(this.header.TotalTOCSize, SeekOrigin.Begin);
                tocStream = decStream;
                bigEndianBinaryReaderTOC = new BigEndianBinaryReader(tocStream);
            }

            if (this.header.MagicNumber == 1347633490)
            {
                if (this.header.CompressionMethod == 2053925218)
                {
                    byte b   = 1;
                    uint num = 256;
                    do
                    {
                        num *= 256;
                        b   += 1;
                    }while (num < this.header.blockSize);
                    int num2 = 0;
                    while (num2 < this.header.numFiles)
                    {
                        this.Entries.Add(new Entry
                        {
                            id     = num2,
                            MD5    = bigEndianBinaryReaderTOC.ReadBytes(16),
                            zIndex = bigEndianBinaryReaderTOC.ReadUInt32(),
                            Length = bigEndianBinaryReaderTOC.ReadUInt40(),
                            Offset = bigEndianBinaryReaderTOC.ReadUInt40()
                        });
                        num2++;
                    }

                    long   decMax = (this.header.archiveFlags == 4) ? 32 : 0;
                    uint   num3   = (this.header.TotalTOCSize - (uint)(tocStream.Position + decMax)) / (uint)b;
                    uint[] array  = new uint[num3];
                    num2 = 0;
                    while (num2 < num3)
                    {
                        switch (b)
                        {
                        case 2:
                            array[num2] = (uint)bigEndianBinaryReaderTOC.ReadUInt16();
                            break;

                        case 3:
                            array[num2] = bigEndianBinaryReaderTOC.ReadUInt24();
                            break;

                        case 4:
                            array[num2] = bigEndianBinaryReaderTOC.ReadUInt32();
                            break;
                        }
                        num2++;
                    }
                    this.inflateEntries(bigEndianBinaryReader, array.ToArray <uint>(), this.header.blockSize);
                    this.ReadNames();
                }
            }
            str.Flush();
        }