private void InternalParse(byte[] buffer, IMailboxSignatureSectionProcessor sectionProcessor) { int i = 0; while (i < buffer.Length) { MailboxSignatureSectionMetadata mailboxSignatureSectionMetadata = MailboxSignatureSectionMetadata.Parse(buffer, ref i); if (mailboxSignatureSectionMetadata.Length > buffer.Length - i) { throw new ArgumentException("Metadata declares length past our buffer end."); } int num = i; bool flag = sectionProcessor.Process(mailboxSignatureSectionMetadata, buffer, ref i); if (i - num != mailboxSignatureSectionMetadata.Length) { throw new ArgumentException("Parsed more data than declared in metadata."); } if (flag) { if ((from section in this.sections select section.Metadata.Type).Contains(mailboxSignatureSectionMetadata.Type)) { throw new ArgumentException("Same section appears more than once."); } this.sections.Add(new MailboxSignatureSectionsContainer.SignatureSection(mailboxSignatureSectionMetadata, new ArraySegment <byte>(buffer, num, mailboxSignatureSectionMetadata.Length))); } } }
public static MailboxSignatureSectionsContainer Parse(byte[] buffer, IMailboxSignatureSectionProcessor sectionProcessor) { MailboxSignatureSectionsContainer mailboxSignatureSectionsContainer = new MailboxSignatureSectionsContainer(); mailboxSignatureSectionsContainer.InternalParse(buffer, sectionProcessor); return(mailboxSignatureSectionsContainer); }