Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
 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);
 }
Beispiel #3
0
 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;
 }
Beispiel #4
0
        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);
        }