Example #1
0
 protected override void Parse(ref BitStreamReader bsr)
 {
     if ((DemoParseResult & DemoParseResult.DataTooLong) != 0)
     {
         throw new InvalidDataException("data too long");
     }
     // make sure we set the demo settings first
     Header = new DemoHeader(this);
     Header.ParseStream(ref bsr);
     DemoInfo = new DemoInfo(this);
     // it might be worth it to implement updating helper classes with listeners, but it's not a huge deal atm
     StringTablesManager = new StringTablesManager(this);
     ErrorList           = new List <string>();
     DecompressedLookup  = new List <byte[]>();
     Frames    = new List <PacketFrame>();
     StartTick = 0;
     try {
         PacketFrame frame;
         do
         {
             frame = new PacketFrame(this);
             Frames.Add(frame);
             frame.ParseStream(ref bsr);
             _parseProgress?.Report((double)bsr.CurrentBitIndex / bsr.BitLength);
         } while (frame.Type != PacketType.Stop && bsr.BitsRemaining >= 24);                 // would be 32 but the last byte is often cut off
         StartAdjustmentTick ??= 0;
         EndTick = this.FilterForPacket <Packet>().Select(packet => packet.Tick).Where(i => i >= 0).Max();
     }
     catch (Exception e) {
         _exceptionDuringParsing = true;
         Debug.WriteLine($"Exception after parsing {Frames.Count - 1} packets");
         LogError($"Exception after parsing {Frames.Count - 1} packets: {e.Message}");
         throw;
     }
     EndAdjustmentTick ??= EndTick;
     DemoParseResult |= DemoParseResult.Success;
 }