예제 #1
0
 // ------------------------- 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);
 }
예제 #2
0
        // ------------------------------ 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);
                }
            }
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
        // ------------------------- 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);
        }
예제 #5
0
        // ------------------------- 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);
        }
예제 #6
0
        // --------------------------- 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));
        }
예제 #7
0
        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);
        }
예제 #8
0
        // ------------------------------ 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));
        }
예제 #9
0
        // ------------------------- 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);
        }
예제 #10
0
        // ------------------------- 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);
        }