Пример #1
0
 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;
 }
Пример #2
0
 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);
 }
Пример #3
0
 public OutputViewVM()
 {
     _parseLevels = new ParseLevel();
     _mainView    = new MainView(this);
 }
Пример #4
0
 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);
 }
Пример #5
0
 internal void Parse(ParseLevel level, List <IExpression> list)
 {
     Parse(_parsers[level], list);
 }