private void PushLevel(bool inheritMime) { if (parseStack == null || this.Depth == parseStack.Length) { var parseLevelArray = new ParseLevel[parseStack == null ? 4 : parseStack.Length*2]; if (parseStack != null) System.Array.Copy(parseStack, 0, parseLevelArray, 0, this.Depth); for (var index = 0; index < this.Depth; ++index) { parseStack[index] = new ParseLevel(); } parseStack = parseLevelArray; } if (currentLevel.ContentType != MajorContentType.MessageRfc822) currentLevel.PartDepth = this.Depth == 0 ? 1 : parseStack[this.Depth - 1].PartDepth + 1; parseStack[this.Depth++] = currentLevel; currentLevel.Reset(!inheritMime); state = ParseState.Headers; firstHeader = true; }
private MimeToken ProcessEOF() { if (this.InlineFormat != ContentTransferEncoding.Unknown) { this.ComplianceStatus |= MimeComplianceStatus.MissingBoundary; this.InlineFormat = ContentTransferEncoding.Unknown; return new MimeToken(MimeTokenId.InlineEnd, 0); } if (this.Depth != 0) { currentLevel = parseStack[--this.Depth]; currentLevel.Epilogue = true; parseStack[this.Depth].Reset(false); if (currentLevel.ContentType == MajorContentType.MessageRfc822) return new MimeToken(MimeTokenId.EmbeddedEnd, 0); this.ComplianceStatus |= MimeComplianceStatus.MissingBoundary; return new MimeToken(MimeTokenId.NestedEnd, 0); } state = ParseState.EndOfFile; currentLevel.Reset(true); return new MimeToken(MimeTokenId.EndOfFile, 0); }
public OutputViewVM() { _parseLevels = new ParseLevel(); _mainView = new MainView(this); }
private MimeToken ProcessBoundary(int start, int line, int nextNL, int sizeNL) { if (nextBoundaryLevel < 0) { lineOffset = 0; currentOffset = 0; if (!nextBoundaryEnd) { this.InlineFormat = nextBoundaryLevel == -100 ? ContentTransferEncoding.UUEncode : ContentTransferEncoding.BinHex; nextBoundaryLevel = -1; lastTokenLength = nextNL + sizeNL - start; return new MimeToken(MimeTokenId.InlineStart, lastTokenLength); } this.InlineFormat = ContentTransferEncoding.Unknown; nextBoundaryLevel = -1; lastTokenLength = nextNL + sizeNL - start; return new MimeToken(MimeTokenId.InlineEnd, lastTokenLength); } if (nextBoundaryLevel == this.Depth) { lineOffset = 0; currentOffset = 0; nextBoundaryLevel = -1; this.PushLevel(true); lastTokenLength = nextNL + sizeNL - start; return new MimeToken(MimeTokenId.NestedStart, lastTokenLength); } if (nextBoundaryLevel == this.Depth - 1) { if (currentLevel.ContentType == MajorContentType.Multipart && !currentLevel.Epilogue) this.ComplianceStatus |= MimeComplianceStatus.MissingBoundary; lineOffset = 0; currentOffset = 0; nextBoundaryLevel = -1; if (nextBoundaryEnd) { currentLevel = parseStack[--this.Depth]; currentLevel.Epilogue = true; parseStack[this.Depth].Reset(false); lastTokenLength = nextNL + sizeNL - start; return new MimeToken(MimeTokenId.NestedEnd, lastTokenLength); } currentLevel.Reset(false); state = ParseState.Headers; firstHeader = true; lastTokenLength = nextNL + sizeNL - start; return new MimeToken(MimeTokenId.NestedNext, lastTokenLength); } lineOffset = line - start; currentOffset = nextNL - start; if (this.InlineFormat != ContentTransferEncoding.Unknown) { this.ComplianceStatus |= MimeComplianceStatus.MissingBoundary; this.InlineFormat = ContentTransferEncoding.Unknown; return new MimeToken(MimeTokenId.InlineEnd, 0); } currentLevel = parseStack[--this.Depth]; currentLevel.Epilogue = true; parseStack[this.Depth].Reset(false); if (currentLevel.ContentType == MajorContentType.MessageRfc822) return new MimeToken(MimeTokenId.EmbeddedEnd, 0); this.ComplianceStatus |= MimeComplianceStatus.MissingBoundary; return new MimeToken(MimeTokenId.NestedEnd, 0); }
internal void Parse(ParseLevel level, List <IExpression> list) { Parse(_parsers[level], list); }