Пример #1
0
        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);
        }
Пример #2
0
 public long ReadChunkLong(long length)
 {
     return(LEB128.ReadLong(_reader));
 }