Ejemplo n.º 1
0
        /// <summary>
        ///     Loads a data stream as a <see cref="Package" />.
        /// </summary>
        /// <param name="br">The <see cref="BinaryReader" /> for the data stream.</param>
        /// <returns>A new <see cref="Package" /> instance.</returns>
        public Package Load(BinaryReader br)
        {
            var package     = new Package();
            var chunkReader = new FrontendChunkReader(package, br);

            foreach (var chunk in chunkReader.ReadMainChunks())
            {
                switch (chunk)
                {
                case PackageHeaderChunk packageHeaderChunk:
                    ProcessPackageHeaderChunk(package, packageHeaderChunk);
                    break;

                case ObjectContainerChunk objectContainerChunk:
                    ProcessObjectContainerChunk(package, objectContainerChunk);
                    break;

                case MessageDefinitionsChunk messageNamesChunk:
                    package.MessageDefinitions.AddRange(messageNamesChunk.Definitions);
                    break;
                }
            }

            return(package);
        }
Ejemplo n.º 2
0
        public override void Read(Package package, FrontendChunkBlock chunkBlock,
                                  FrontendChunkReader chunkReader, BinaryReader reader)
        {
            ResourceNamesChunk resourceNamesChunk = null;

            foreach (var chunk in chunkReader.ReadMainChunks(chunkBlock.Size))
            {
                switch (chunk)
                {
                case ResourceNamesChunk rnc:
                    resourceNamesChunk = rnc;
                    break;

                case ResourceRequestsChunk _ when resourceNamesChunk == null:
                    throw new ChunkReadingException("RsRq came before RsNm?!");

                case ResourceRequestsChunk rrc:
                {
                    foreach (var resourceRequest in rrc.ResourceRequests)
                    {
                        resourceRequest.Name = resourceNamesChunk.Names[resourceRequest.NameOffset];
                    }

                    package.ResourceRequests.AddRange(rrc.ResourceRequests);

                    break;
                }
                }
            }
        }
Ejemplo n.º 3
0
        public override void Read(Package package, FrontendChunkBlock chunkBlock,
                                  FrontendChunkReader chunkReader, BinaryReader reader)
        {
            if ((chunkBlock.Size - 4) % 0x18 != 0)
            {
                throw new ChunkReadingException("Malformed RsRq chunk");
            }

            var numRequests = reader.ReadInt32();

            ResourceRequests = new List <ResourceRequest>(numRequests);

            for (var i = 0; i < numRequests; i++)
            {
                var resourceRequest = new ResourceRequest();
                resourceRequest.ID         = reader.ReadUInt32();
                resourceRequest.NameOffset = reader.ReadUInt32();
                resourceRequest.Type       = (ResourceType)reader.ReadUInt32();
                resourceRequest.Flags      = reader.ReadUInt32();
                resourceRequest.Handle     = reader.ReadUInt32();
                resourceRequest.UserParam  = reader.ReadUInt32();

                ResourceRequests.Add(resourceRequest);
            }
        }
Ejemplo n.º 4
0
 public override void Read(Package package, FrontendChunkBlock chunkBlock, FrontendChunkReader chunkReader, BinaryReader reader)
 {
     chunkReader.ReadObjects(chunkBlock.Size);
     //foreach (var frontendObject in chunkReader.ReadObjects(chunkBlock.Size))
     //{
     //    Objects.Add(frontendObject);
     //}
 }
Ejemplo n.º 5
0
        public override void Read(Package package, FrontendChunkBlock chunkBlock,
                                  FrontendChunkReader chunkReader, BinaryReader reader)
        {
            TagStream tagStream = new MessageTagStream(reader, package, chunkBlock,
                                                       chunkBlock.Size);

            while (tagStream.HasTag())
            {
                var tag = tagStream.NextTag(null);
                package = ProcessTag(package, tag);
            }
        }
Ejemplo n.º 6
0
        public override void Read(Package package, FrontendChunkBlock chunkBlock,
                                  FrontendChunkReader chunkReader, BinaryReader reader)
        {
            Names = new Dictionary <long, string>();

            while (reader.BaseStream.Position < chunkBlock.EndOffset)
            {
                var pos = reader.BaseStream.Position;
                var str = NullTerminatedString.Read(reader);
                if (!string.IsNullOrEmpty(str))
                {
                    Names[pos - chunkBlock.DataOffset] = str;
                }
            }
        }
Ejemplo n.º 7
0
        public override void Read(Package package, FrontendChunkBlock chunkBlock,
                                  FrontendChunkReader chunkReader, BinaryReader reader)
        {
            if (chunkBlock.Size % 8 != 0)
            {
                throw new ChunkReadingException("Invalid TypeList chunk");
            }

            TypeSizeList = new List <TypeSizeEntry>(chunkBlock.Size >> 3);

            for (int i = 0; i < chunkBlock.Size >> 3; i++)
            {
                TypeSizeList.Add(new TypeSizeEntry
                {
                    ID   = reader.ReadUInt32(),
                    Size = reader.ReadUInt32()
                });
            }
        }
Ejemplo n.º 8
0
        public override void Read(FrontendPackage package, FrontendChunkBlock chunkBlock,
                                  FrontendChunkReader chunkReader, BinaryReader reader)
        {
            if (reader.ReadUInt32() != 0x20000)
            {
                throw new InvalidDataException("Invalid header constant");
            }

            if (reader.ReadUInt32() != 0)
            {
                throw new InvalidDataException("Expected null after constant");
            }

            NumResourceNames = reader.ReadInt32();

            reader.ReadUInt32();
            //if (reader.ReadUInt32() != 3)
            //{
            //    throw new InvalidDataException("Invalid header version");
            //}

            int nameLength = reader.ReadInt32();

            if (nameLength < 1)
            {
                throw new InvalidDataException("Invalid name length");
            }

            int filenameLength = reader.ReadInt32();

            if (filenameLength < 1)
            {
                throw new InvalidDataException("Invalid filename length");
            }

            Name     = new string(reader.ReadChars(nameLength)).Trim('\0');
            Filename = new string(reader.ReadChars(filenameLength)).Trim('\0');

            reader.AlignReader(4);
        }
Ejemplo n.º 9
0
        public override void Read(FrontendPackage package, FrontendChunkBlock chunkBlock, FrontendChunkReader chunkReader, BinaryReader reader)
        {
            FrontendTagStream tagStream = new FrontendMessagesTagStream(reader, package, chunkBlock,
                                                                        chunkBlock.Size);

            while (tagStream.HasTag())
            {
                FrontendTag tag = tagStream.NextTag(null);
                //Debug.WriteLine("PKG RESPONSES TAG {0}", tag);
                package = ProcessTag(package, tag);
            }
        }
Ejemplo n.º 10
0
 public override void Read(Package package, FrontendChunkBlock chunkBlock,
                           FrontendChunkReader chunkReader, BinaryReader reader)
 {
     reader.ReadBytes(chunkBlock.Size);
 }
Ejemplo n.º 11
0
 public ObjectReaderState(FrontendChunkBlock currentChunkBlock, FrontendChunkReader chunkReader)
 {
     CurrentChunkBlock = currentChunkBlock;
     ChunkReader       = chunkReader;
 }
Ejemplo n.º 12
0
 public override void Read(FrontendPackage package, FrontendChunkBlock chunkBlock,
                           FrontendChunkReader chunkReader, BinaryReader reader)
 {
     NumEntries = reader.ReadUInt32();
 }