public void ReadFlagWord() { if (!ContinuationBitSet) { throw new MalformedFrameException("Attempted to read flag word when none advertised"); } m_flagWord = BaseReader.ReadUInt16(); m_bitCount = 0; }
public EFileReadErrorCodes ReadBuffer(RedBuffer buffer, Type fileRootType) { _hashService = Locator.Current.GetService <IHashService>(); var _chunks = new List <RedBaseClass>(); var result = new Package04(); _outputFile = result; header.version = BaseReader.ReadUInt16(); if (header.version < 2 || header.version > 4) { return(EFileReadErrorCodes.UnsupportedVersion); } header.numSections = _reader.ReadUInt16(); if (header.numSections < 6 || header.numSections > 7) { return(EFileReadErrorCodes.UnsupportedVersion); } result.Version = header.version; result.Sections = header.numSections; header.numComponents = _reader.ReadUInt32(); if (header.numSections == 7) { header.refPoolDescOffset = _reader.ReadUInt32(); header.refPoolDataOffset = _reader.ReadUInt32(); } header.namePoolDescOffset = _reader.ReadUInt32(); header.namePoolDataOffset = _reader.ReadUInt32(); header.chunkDescOffset = _reader.ReadUInt32(); header.chunkDataOffset = _reader.ReadUInt32(); if (header.numSections == 7 && header.refPoolDescOffset != 0) { return(EFileReadErrorCodes.NoCr2w); } if (header.refPoolDescOffset != 0) { return(EFileReadErrorCodes.NoCr2w); } if (fileRootType == typeof(gamePersistentStateDataResource)) { var numCruids = _reader.ReadUInt32(); for (var i = 0; i < numCruids; i++) { result.RootCruids.Add(_reader.ReadUInt64()); } } else if (fileRootType != typeof(inkWidgetLibraryResource)) { result.CruidIndex = _reader.ReadInt16(); var numCruids = _reader.ReadUInt16(); for (var i = 0; i < numCruids; i++) { result.RootCruids.Add(_reader.ReadUInt64()); } } var baseOff = BaseStream.Position; // read refs var refCount = (header.refPoolDataOffset - header.refPoolDescOffset) / 4; BaseStream.Position = baseOff + header.refPoolDescOffset; var refDesc = BaseStream.ReadStructs <Package04ImportHeader>(refCount); var readAsHash = fileRootType == typeof(appearanceAppearanceResource); foreach (var r in refDesc) { BaseStream.Position = baseOff + r.offset; importsList.Add(ReadImport(r, readAsHash)); } // read strings var nameCount = (header.namePoolDataOffset - header.namePoolDescOffset) / 4; BaseStream.Position = baseOff + header.namePoolDescOffset; var nameDesc = BaseStream.ReadStructs <Package04NameHeader>(nameCount); foreach (var s in nameDesc) { BaseStream.Position = baseOff + s.offset; _namesList.Add(ReadName(s)); } // read chunks var chunkCount = (header.chunkDataOffset - header.chunkDescOffset) / 8; BaseStream.Position = baseOff + header.chunkDescOffset; var chunkDesc = BaseStream.ReadStructs <Package04ChunkHeader>(chunkCount); for (var i = 0; i < chunkDesc.Length; i++) { _chunks.Add(ReadChunk(chunkDesc[i])); } var newChunks = new List <RedBaseClass>(); for (var i = 0; i < _chunks.Count; i++) { if (!HandleQueue.ContainsKey(i)) { newChunks.Add(_chunks[i]); continue; } foreach (var handle in HandleQueue[i]) { handle.SetValue(_chunks[i]); } } result.Chunks = newChunks; buffer.Data = result; return(EFileReadErrorCodes.NoError); }