private bool AddPage(ContainerReader.PageHeader hdr) { PacketReader packetReader; if (!this._packetReaders.TryGetValue(hdr.StreamSerial, out packetReader)) { packetReader = new PacketReader(this, hdr.StreamSerial); } bool flag1 = false; bool flag2 = (hdr.Flags & PageFlags.ContinuesPacket) == PageFlags.ContinuesPacket; bool flag3 = (hdr.Flags & PageFlags.EndOfStream) == PageFlags.EndOfStream; bool flag4 = hdr.IsResync; int offset = 0; int length1 = hdr.PacketSizes.Length; foreach (int length2 in hdr.PacketSizes) { Packet packet1 = new Packet(this._stream, hdr.DataOffset + (long)offset, length2); packet1.PageGranulePosition = hdr.GranulePosition; packet1.IsEndOfStream = flag3; packet1.PageSequenceNumber = hdr.SequenceNumber; packet1.IsContinued = flag1; packet1.IsContinuation = flag2; packet1.IsResync = flag4; Packet packet2 = packet1; packet2.SetBuffer(hdr.SavedBuffer, offset); packetReader.AddPacket((DataPacket)packet2); offset += length2; flag2 = false; flag4 = false; if (--length1 == 1) { flag1 = hdr.LastPacketContinues; } } if (!this._packetReaders.ContainsKey(hdr.StreamSerial)) { int streamSerial = hdr.StreamSerial; this._packetReaders.Add(streamSerial, packetReader); this._eosFlags.Add(streamSerial, flag3); this._streamSerials.Add(streamSerial); return(true); } else { Dictionary <int, bool> dictionary; int streamSerial; (dictionary = this._eosFlags)[streamSerial = hdr.StreamSerial] = dictionary[streamSerial] | flag3; return(false); } }
private int GatherNextPage(string noPageErrorMessage) { ContainerReader.PageHeader nextPageHeader = this.FindNextPageHeader(); if (nextPageHeader == null) { throw new InvalidDataException(noPageErrorMessage); } if (this.AddPage(nextPageHeader)) { Action <int> action = this._newStreamCallback; if (action != null) { action(nextPageHeader.StreamSerial); } } return(nextPageHeader.StreamSerial); }
private ContainerReader.PageHeader ReadPageHeader(long position) { this._stream.Position = position; byte[] buffer = new byte[27]; if (this._stream.Read(buffer, 0, buffer.Length) != buffer.Length) return (ContainerReader.PageHeader) null; if ((int) buffer[0] != 79 || (int) buffer[1] != 103 || ((int) buffer[2] != 103 || (int) buffer[3] != 83)) return (ContainerReader.PageHeader) null; if ((int) buffer[4] != 0) return (ContainerReader.PageHeader) null; ContainerReader.PageHeader pageHeader = new ContainerReader.PageHeader(); pageHeader.Flags = (PageFlags) buffer[5]; pageHeader.GranulePosition = BitConverter.ToInt64(buffer, 6); pageHeader.StreamSerial = BitConverter.ToInt32(buffer, 14); pageHeader.SequenceNumber = BitConverter.ToInt32(buffer, 18); uint num = BitConverter.ToUInt32(buffer, 22); uint crc = 0U; for (int index = 0; index < 22; ++index) this.UpdateCRC((int) buffer[index], ref crc); this.UpdateCRC(0, ref crc); this.UpdateCRC(0, ref crc); this.UpdateCRC(0, ref crc); this.UpdateCRC(0, ref crc); this.UpdateCRC((int) buffer[26], ref crc); int length1 = (int) buffer[26]; int[] numArray1 = new int[length1]; int count = 0; int length2 = 0; for (int index = 0; index < length1; ++index) { int nextVal = this._stream.ReadByte(); this.UpdateCRC(nextVal, ref crc); numArray1[length2] += nextVal; if (nextVal < (int) byte.MaxValue) { ++length2; pageHeader.LastPacketContinues = false; } else pageHeader.LastPacketContinues = true; count += nextVal; } if (pageHeader.LastPacketContinues) ++length2; if (length2 < numArray1.Length) { int[] numArray2 = new int[length2]; for (int index = 0; index < length2; ++index) numArray2[index] = numArray1[index]; numArray1 = numArray2; } pageHeader.PacketSizes = numArray1; pageHeader.DataOffset = position + 27L + (long) length1; pageHeader.SavedBuffer = new byte[count]; if (this._stream.Read(pageHeader.SavedBuffer, 0, count) != count) return (ContainerReader.PageHeader) null; int index1 = -1; while (++index1 < count) this.UpdateCRC((int) pageHeader.SavedBuffer[index1], ref crc); if ((int) crc != (int) num) return (ContainerReader.PageHeader) null; this._containerBits += (long) (8 * (27 + length1)); ++this._pageCount; return pageHeader; }
private ContainerReader.PageHeader ReadPageHeader(long position) { this._stream.Position = position; byte[] buffer = new byte[27]; if (this._stream.Read(buffer, 0, buffer.Length) != buffer.Length) { return((ContainerReader.PageHeader)null); } if ((int)buffer[0] != 79 || (int)buffer[1] != 103 || ((int)buffer[2] != 103 || (int)buffer[3] != 83)) { return((ContainerReader.PageHeader)null); } if ((int)buffer[4] != 0) { return((ContainerReader.PageHeader)null); } ContainerReader.PageHeader pageHeader = new ContainerReader.PageHeader(); pageHeader.Flags = (PageFlags)buffer[5]; pageHeader.GranulePosition = BitConverter.ToInt64(buffer, 6); pageHeader.StreamSerial = BitConverter.ToInt32(buffer, 14); pageHeader.SequenceNumber = BitConverter.ToInt32(buffer, 18); uint num = BitConverter.ToUInt32(buffer, 22); uint crc = 0U; for (int index = 0; index < 22; ++index) { this.UpdateCRC((int)buffer[index], ref crc); } this.UpdateCRC(0, ref crc); this.UpdateCRC(0, ref crc); this.UpdateCRC(0, ref crc); this.UpdateCRC(0, ref crc); this.UpdateCRC((int)buffer[26], ref crc); int length1 = (int)buffer[26]; int[] numArray1 = new int[length1]; int count = 0; int length2 = 0; for (int index = 0; index < length1; ++index) { int nextVal = this._stream.ReadByte(); this.UpdateCRC(nextVal, ref crc); numArray1[length2] += nextVal; if (nextVal < (int)byte.MaxValue) { ++length2; pageHeader.LastPacketContinues = false; } else { pageHeader.LastPacketContinues = true; } count += nextVal; } if (pageHeader.LastPacketContinues) { ++length2; } if (length2 < numArray1.Length) { int[] numArray2 = new int[length2]; for (int index = 0; index < length2; ++index) { numArray2[index] = numArray1[index]; } numArray1 = numArray2; } pageHeader.PacketSizes = numArray1; pageHeader.DataOffset = position + 27L + (long)length1; pageHeader.SavedBuffer = new byte[count]; if (this._stream.Read(pageHeader.SavedBuffer, 0, count) != count) { return((ContainerReader.PageHeader)null); } int index1 = -1; while (++index1 < count) { this.UpdateCRC((int)pageHeader.SavedBuffer[index1], ref crc); } if ((int)crc != (int)num) { return((ContainerReader.PageHeader)null); } this._containerBits += (long)(8 * (27 + length1)); ++this._pageCount; return(pageHeader); }