public void ReadChunks(ReadChunkDelegate tryParseChunk) { do { ChunkId chunkID = ChunkId.FromStream(_reader); if (chunkID == ChunkId.Empty) // End reached { break; } // Check if chunk is known, and if not, mark it if (_knownChunkList != null && !UnknownChunksFound && !_knownChunkList.Contains(chunkID)) { UnknownChunksFound = true; } // Read up to a 64 bit number for the chunk size long chunkSize = LEB128.ReadLong(_reader); // Try loading chunk content long chunkStart = _reader.BaseStream.Position; bool chunkRecognized = false; Exception chunkException = null; try { chunkRecognized = tryParseChunk(chunkID, chunkSize); } catch (OperationCanceledException) { // Don't actually keep going if it's an 'OperationCanceledException' throw; } catch (Exception exc) { chunkException = exc; } long readDataCount = _reader.BaseStream.Position - chunkStart; // Print messages for various problems that might have occurred while loading if (chunkException != null) { logger.Error(chunkException, "Chunk loading raised an exception" + GetLocoationStr(chunkStart, chunkSize, chunkID)); } else if (!chunkRecognized) { logger.Warn("Chunk not recognized" + GetLocoationStr(chunkStart, chunkSize, chunkID)); } else if (readDataCount > chunkSize) { logger.Error("More data was read than available (Read: " + readDataCount + " Available: " + chunkSize + ")" + GetLocoationStr(chunkStart, chunkSize, chunkID)); } else if (readDataCount < chunkSize) { logger.Warn("Not all the available data was read (Read: " + readDataCount + " Available: " + chunkSize + ")" + GetLocoationStr(chunkStart, chunkSize, chunkID)); } // Adjust _stream position if necessaary if (readDataCount != chunkSize) { _reader.BaseStream.Position = chunkStart + chunkSize; } } while (true); }
public long ReadChunkLong(long length) { return(LEB128.ReadLong(_reader)); }