public virtual void Parse(IAsn1TaggedEventHandler handler) { if (_parserCaptureBuffer == null) { RemoveCaptureBuffer(_parserCaptureBuffer); } if (_parserCaptureBuffer == null) { _parserCaptureBuffer = new MemoryStream(0x100); AddCaptureBuffer(_parserCaptureBuffer); } else { _parserCaptureBuffer.Seek(0L, SeekOrigin.Begin); _parserCaptureBuffer.SetLength(0L); } ParseElement(handler, _tagHolder, _lenHolder); }
private void ParsePrim(IAsn1TaggedEventHandler handler, int len) { var buffer = new byte[len]; Read(buffer); handler.Contents(buffer); }
private void ParseCons(IAsn1TaggedEventHandler handler, int len) { var tag2 = new Asn1Tag(); var holder = new IntHolder(); var byteCount = base.ByteCount; while (true) { ParseElement(handler, tag2, holder); if (len == Asn1Status.IndefiniteLength) { if (tag2.IsEoc() && (holder.Value == 0)) { return; } continue; } if ((base.ByteCount - byteCount) >= len) { return; } } }
private void ParseElement(IAsn1TaggedEventHandler handler, Asn1Tag tag, IntHolder len) { _parserCaptureBuffer.Seek(0L, SeekOrigin.Begin); _parserCaptureBuffer.SetLength(0L); len.Value = DecodeTagAndLength(tag); if (!tag.IsEoc() || (len.Value != 0)) { handler.StartElement(tag, len.Value, _parserCaptureBuffer.ToArray()); _parserCaptureBuffer.Seek(0L, SeekOrigin.Begin); _parserCaptureBuffer.SetLength(0L); if ((len.Value > 0) || (len.Value == Asn1Status.IndefiniteLength)) { if (tag.Constructed) { ParseCons(handler, len.Value); } else { ParsePrim(handler, len.Value); } } handler.EndElement(tag); } }