// ------------------------- ParseValue_ContentType ----------------------- private Scanner.WordCursor ParseValue_ContentType( Scanner.WordCursor InCsr) { Scanner.WordCursor csr = InCsr; while (true) { csr = Scanner.ScanNextWord(mLine, csr, mTraits); if (csr.IsEndOfString) { break; } if (csr.Delim == "/") { mContentType = csr.Word.ToString( ); } else if (csr.Delim == ";") { if (mContentType == null) { mContentType = csr.Word.ToString( ); } else { mContentSubType = csr.Word.ToString( ); } break; } } return(csr); }
// ------------------------------ Parse ---------------------------- private void Parse( ) { Scanner.WordCursor csr = Scanner.PositionBeginWord( ); while (true) { csr = Scanner.ScanNextWord(mLine, csr, mTraits); if (csr.IsEndOfString) { break; } // content-type: type/subtype; if ((csr.Word.ToString( ).ToLower( ) == "content-type") && (csr.Delim == ":")) { csr = ParseValue_ContentType(csr); } // boundary="value" else if ((csr.Word.ToString( ).ToLower( ) == "boundary") && (csr.Delim == "=")) { csr = ParseValue_Boundary(csr); } // charset=us-ascii else if ((csr.Word.ToString( ).ToLower( ) == "charset") && (csr.Delim == "=")) { csr = ParseValue_CharSet(csr); } } }
/// <summary> /// Split the string of mail addresses on the "," that separates them. /// </summary> /// <param name="InString"></param> /// <returns></returns> public static ArrayList SplitStringOfMailAddresses(string InString) { ArrayList addrList = new ArrayList( ); Scanner.WordCursor word = Scanner.PositionBeginWord( ); while (true) { ObjectPair pair = ScanNextAddress(InString, word); word = (Scanner.WordCursor)pair.b; // got nothing. end of string. if (pair.a == null) { break; } // isolate the mail address string. string mailAddr = PullMailAddress(InString, pair); // add the address string to list of such strings. addrList.Add(mailAddr); } // return the split list of address strings. return(addrList); }
// ------------------------- ParseContentType ---------------------------- public static PartProperty.ContentType ParseContentType(string InString) { TextTraits traits = new TextTraits( ) .SetDelimChars("/:; \t=") .SetWhitespaceChars(" \t") .SetQuoteEncapsulation(QuoteEncapsulation.Escape); PartProperty.ContentType results = new PartProperty.ContentType( ); Scanner.WordCursor csr = Scanner.PositionBeginWord( ); while (true) { csr = Scanner.ScanNextWord(InString, csr, traits); if (csr.IsEndOfString) { break; } // content type if (csr.Delim == "/") { results.Type = csr.Word.ToString( ).ToLower( ); } // content sub type. else if (csr.Delim == ";") { results.SubType = csr.Word.ToString( ).ToLower( ); } // a kwd else if (csr.Delim == "=") { Scanner.WordCursor nxCsr = csr.NextWord( ); if ((nxCsr.DelimClass == DelimClassification.End) || (nxCsr.DelimClass == DelimClassification.Whitespace)) { string kwd = csr.Word.ToString( ).ToLower( ); csr = nxCsr; if (kwd == "charset") { results.CharSet = csr.Word.NonQuotedWord; } else if (kwd == "boundary") { results.Boundary = csr.Word.NonQuotedWord; } else if (kwd == "name") { results.Name = csr.Word.NonQuotedWord; } } } } return(results); }
// ------------------------- Crack ------------------------------------ // crack the mail drop LIST line into its message number and size components. public MailDropMessage Crack(string InLine) { mRawLine = InLine; Scanner.WordCursor csr = new Scanner.WordCursor( ) .SetString(InLine); csr = csr.NextWord( ); MessageNx = csr.Word.ToString( ); csr = csr.NextWord( ); MessageSx = csr.Word.ToString( ); return(this); }
// --------------------------- PullMailAddress ------------------------------ private static string PullMailAddress(string InString, ObjectPair InPair) { Scanner.WordCursor bgnAddrWord = (Scanner.WordCursor)InPair.a; Scanner.WordCursor endAddrWord = (Scanner.WordCursor)InPair.b; int Bx = bgnAddrWord.WordBx; int Ex = endAddrWord.WordEx; if ((Bx == -1) || (Ex == -1)) { throw(new ApplicationException( "email address not properly formed: " + InString)); } return(InString.Substring(Bx, Ex - Bx + 1)); }
ParseContentDisposition(string InString) { TextTraits traits = new TextTraits( ) .SetDelimChars("; \t=") .SetWhitespaceChars(" \t") .SetQuoteEncapsulation(QuoteEncapsulation.Escape); PartProperty.ContentDisposition results = new PartProperty.ContentDisposition( ); Scanner.WordCursor csr = Scanner.PositionBeginWord( ); while (true) { csr = Scanner.ScanNextWord(InString, csr, traits); if (csr.IsEndOfString) { break; } // content disposition if (csr.Delim == ";") { results.Disposition = csr.Word.ToString( ).ToLower( ); } // a kwd else if (csr.Delim == "=") { Scanner.WordCursor nxCsr = csr.NextWord( ); if ((nxCsr.DelimClass == DelimClassification.End) || (nxCsr.DelimClass == DelimClassification.Whitespace)) { string kwd = csr.Word.ToString( ).ToLower( ); csr = nxCsr; if (kwd == "filename") { results.FileName = csr.Word.NonQuotedWord; } } } } return(results); }
// ------------------------------ ScanNextAddress --------------------------- private static ObjectPair ScanNextAddress( string InString, Scanner.WordCursor InWord) { TextTraits traits; traits = new TextTraits( ) .SetDelimChars(", \t") .SetWhitespaceChars(" \t") .SetQuoteEncapsulation(QuoteEncapsulation.Escape); Scanner.WordCursor bgnAddrWord = null; Scanner.WordCursor endAddrWord = null; // advance from word to word in the string until the comma between addresses // or the end of the string. Scanner.WordCursor word = InWord; while (true) { word = Scanner.ScanNextWord(InString, word, traits); if (word.IsEndOfString) { break; } // expand the word range of the current mail address string. if (bgnAddrWord == null) { bgnAddrWord = word; } endAddrWord = word; if (word.Delim == ",") // end of this address. { break; } if (word.Delim == "") // end of the string. { break; } } return(new ObjectPair(bgnAddrWord, endAddrWord)); }
// ------------------------- ParseValue_CharSet ----------------------- private Scanner.WordCursor ParseValue_CharSet( Scanner.WordCursor InWordCsr) { Scanner.WordCursor csr = null; // advance to the value after the charset= kwd. csr = Scanner.ScanNextWord(mLine, InWordCsr, mTraits); if (csr.IsAtWord) { if (csr.Word.WordIsQuoted == true) { mCharSet = csr.Word.DequotedWord; } else { mCharSet = csr.Word.ToString( ); } } return(csr); }
// ------------------------- ParseAddressString ------------------------ public static EmailAddress ParseAddressString(string InString) { TextTraits traits; traits = new TextTraits( ) .SetDelimChars(" \t") .SetWhitespaceChars(" \t") .SetQuoteEncapsulation(QuoteEncapsulation.Escape); Scanner.WordCursor bgnFriendly = null; Scanner.WordCursor endFriendly = null; EmailAddress results = new EmailAddress( ); Scanner.WordCursor csr = Scanner.PositionBeginWord( ); while (true) { // advance to the next word in the address string. csr = Scanner.ScanNextWord(InString, csr, traits); if (csr.IsEndOfString) { break; } // the email address itself is <braced>. else if ((csr.Word.Class == WordClassification.Braced) && (csr.Word.BraceChar == '<')) { results.Address = csr.Word.BracedValue.ToString( ); } // comment in the email address string. else if ((csr.Word.Class == WordClassification.Braced) && (csr.Word.BraceChar == '(')) { results.Comment = csr.Word.BracedValue.ToString( ); results.Comment = MimeCommon.DecodeHeaderString_EncodedOnly(results.Comment); } // word part of the friendly name in the address. extend the word range of // the friendly string. else { if (bgnFriendly == null) { bgnFriendly = csr; } endFriendly = csr; } } // working from the word range, isolate the full friendly name string. string fullFriendly = null; if ((bgnFriendly != null) && (bgnFriendly == endFriendly)) { fullFriendly = bgnFriendly.Word.ToString( ); } else if (bgnFriendly != null) { int Bx = bgnFriendly.WordBx; int Ex = endFriendly.WordEx; fullFriendly = InString.Substring(Bx, Ex - Bx + 1); } // final decode of the friendly name. name could be quoted, could contain // encoded-words. if (fullFriendly != null) { fullFriendly = MimeCommon.DecodeHeaderString_QuotedEncodedEither(fullFriendly); } // the friendly name could actually be the email address. if (results.Address == null) { results.Address = fullFriendly; } else { results.FriendlyName = fullFriendly; } return(results); }