Пример #1
0
        void ParseProtobufManifestPayload(ContentManifestPayload payload)
        {
            Files = new List <FileData>(payload.mappings.Count);

            foreach (var file_mapping in payload.mappings)
            {
                FileData filedata = new FileData(file_mapping.filename, (EDepotFileFlag)file_mapping.flags, file_mapping.size, file_mapping.sha_content, FilenamesEncrypted, file_mapping.chunks.Count);

                foreach (var chunk in file_mapping.chunks)
                {
                    filedata.Chunks.Add(new ChunkData(chunk.sha, BitConverter.GetBytes(chunk.crc), chunk.offset, chunk.cb_compressed, chunk.cb_original));
                }

                Files.Add(filedata);
            }
        }
Пример #2
0
        void Deserialize(byte[] data)
        {
            ContentManifestPayload   payload   = null;
            ContentManifestMetadata  metadata  = null;
            ContentManifestSignature signature = null;

            using (var ms = new MemoryStream(data))
                using (var br = new BinaryReader(ms))
                {
                    while ((ms.Length - ms.Position) > 0)
                    {
                        uint magic = br.ReadUInt32();

                        switch (magic)
                        {
                        case Steam3Manifest.MAGIC:
                            ms.Seek(-4, SeekOrigin.Current);
                            Steam3Manifest binaryManifest = new Steam3Manifest(br);
                            ParseBinaryManifest(binaryManifest);

                            uint marker = br.ReadUInt32();
                            if (marker != magic)
                            {
                                throw new InvalidDataException("Unable to find end of message marker for depot manifest");
                            }
                            break;

                        case DepotManifest.PROTOBUF_PAYLOAD_MAGIC:
                            uint   payload_length = br.ReadUInt32();
                            byte[] payload_bytes  = br.ReadBytes((int)payload_length);
                            using (var ms_payload = new MemoryStream(payload_bytes))
                                payload = Serializer.Deserialize <ContentManifestPayload>(ms_payload);
                            break;

                        case DepotManifest.PROTOBUF_METADATA_MAGIC:
                            uint   metadata_length = br.ReadUInt32();
                            byte[] metadata_bytes  = br.ReadBytes((int)metadata_length);
                            using (var ms_metadata = new MemoryStream(metadata_bytes))
                                metadata = Serializer.Deserialize <ContentManifestMetadata>(ms_metadata);
                            break;

                        case DepotManifest.PROTOBUF_SIGNATURE_MAGIC:
                            uint   signature_length = br.ReadUInt32();
                            byte[] signature_bytes  = br.ReadBytes((int)signature_length);
                            using (var ms_signature = new MemoryStream(signature_bytes))
                                signature = Serializer.Deserialize <ContentManifestSignature>(ms_signature);
                            break;

                        case DepotManifest.PROTOBUF_ENDOFMANIFEST_MAGIC:
                            break;

                        default:
                            throw new NotImplementedException(string.Format("Unrecognized magic value {0:X} in depot manifest.", magic));
                        }
                    }
                }

            if (payload != null && metadata != null && signature != null)
            {
                ParseProtobufManifestMetadata(metadata);
                ParseProtobufManifestPayload(payload);
            }
            else
            {
                throw new InvalidDataException("Missing ContentManifest sections required for parsing depot manifest");
            }
        }