/// <summary>
        /// Returns parsed IMAP SEARCH <b>AND</b> key group.
        /// </summary>
        /// <param name="r">String reader.</param>
        /// <returns>Returns parsed IMAP SEARCH <b>AND</b> key group.</returns>
        /// <exception cref="ArgumentNullException">Is raised when <b>r</b> is null reference.</exception>
        /// <exception cref="ParseException">Is raised when parsing fails.</exception>
        public static IMAP_Search_Key_Group Parse(StringReader r)
        {
            if(r == null){
                throw new ArgumentNullException("r");
            }

            // Remove parenthesis, if any.
            if(r.StartsWith("(")){
                r = new StringReader(r.ReadParenthesized());
            }            

            IMAP_Search_Key_Group retVal = new IMAP_Search_Key_Group();

            r.ReadToFirstChar();
            while(r.Available > 0){
                retVal.m_pKeys.Add(IMAP_Search_Key.ParseKey(r));
            }

            return retVal;
        }
        /// <summary>
        /// Returns parsed IMAP SEARCH <b>AND</b> key group.
        /// </summary>
        /// <param name="r">String reader.</param>
        /// <returns>Returns parsed IMAP SEARCH <b>AND</b> key group.</returns>
        /// <exception cref="ArgumentNullException">Is raised when <b>r</b> is null reference.</exception>
        /// <exception cref="ParseException">Is raised when parsing fails.</exception>
        public static IMAP_Search_Key_Group Parse(StringReader r)
        {
            if (r == null)
            {
                throw new ArgumentNullException("r");
            }

            // Remove parenthesis, if any.
            if (r.StartsWith("("))
            {
                r = new StringReader(r.ReadParenthesized());
            }

            IMAP_Search_Key_Group retVal = new IMAP_Search_Key_Group();

            r.ReadToFirstChar();
            while (r.Available > 0)
            {
                retVal.m_pKeys.Add(IMAP_Search_Key.ParseKey(r));
            }

            return(retVal);
        }
예제 #3
0
        /// <summary>
        /// Parses one search key or search key group.
        /// </summary>
        /// <param name="r">String reader.</param>
        /// <returns>Returns one parsed search key or search key group.</returns>
        /// <exception cref="ArgumentNullException">Is raised when <b>r</b> is null reference.</exception>
        /// <exception cref="ParseException">Is raised when parsing fails.</exception>
        internal static IMAP_Search_Key ParseKey(StringReader r)
        {
            if (r == null)
            {
                throw new ArgumentNullException("r");
            }

            r.ReadToFirstChar();

            // Keys group
            if (r.StartsWith("(", false))
            {
                return(IMAP_Search_Key_Group.Parse(new StringReader(r.ReadParenthesized())));
            }
            // ANSWERED
            else if (r.StartsWith("ANSWERED", false))
            {
                return(IMAP_Search_Key_Answered.Parse(r));
            }
            // BCC
            else if (r.StartsWith("BCC", false))
            {
                return(IMAP_Search_Key_Bcc.Parse(r));
            }
            // BEFORE
            else if (r.StartsWith("BEFORE", false))
            {
                return(IMAP_Search_Key_Before.Parse(r));
            }
            // BODY
            else if (r.StartsWith("BODY", false))
            {
                return(IMAP_Search_Key_Body.Parse(r));
            }
            // CC
            else if (r.StartsWith("CC", false))
            {
                return(IMAP_Search_Key_Cc.Parse(r));
            }
            // DELETED
            else if (r.StartsWith("DELETED", false))
            {
                return(IMAP_Search_Key_Deleted.Parse(r));
            }
            // DRAFT
            else if (r.StartsWith("DRAFT", false))
            {
                return(IMAP_Search_Key_Draft.Parse(r));
            }
            // FLAGGED
            else if (r.StartsWith("FLAGGED", false))
            {
                return(IMAP_Search_Key_Flagged.Parse(r));
            }
            // FROM
            else if (r.StartsWith("FROM", false))
            {
                return(IMAP_Search_Key_From.Parse(r));
            }
            // HEADER
            else if (r.StartsWith("HEADER", false))
            {
                return(IMAP_Search_Key_Header.Parse(r));
            }
            // KEYWORD
            else if (r.StartsWith("KEYWORD", false))
            {
                return(IMAP_Search_Key_Keyword.Parse(r));
            }
            // LARGER
            else if (r.StartsWith("LARGER", false))
            {
                return(IMAP_Search_Key_Larger.Parse(r));
            }
            // NEW
            else if (r.StartsWith("NEW", false))
            {
                return(IMAP_Search_Key_New.Parse(r));
            }
            // NOT
            else if (r.StartsWith("NOT", false))
            {
                return(IMAP_Search_Key_Not.Parse(r));
            }
            // OLD
            else if (r.StartsWith("OLD", false))
            {
                return(IMAP_Search_Key_Old.Parse(r));
            }
            // ON
            else if (r.StartsWith("ON", false))
            {
                return(IMAP_Search_Key_On.Parse(r));
            }
            // OR
            else if (r.StartsWith("OR", false))
            {
                return(IMAP_Search_Key_Or.Parse(r));
            }
            // RECENT
            else if (r.StartsWith("RECENT", false))
            {
                return(IMAP_Search_Key_Recent.Parse(r));
            }
            // SEEN
            else if (r.StartsWith("SEEN", false))
            {
                return(IMAP_Search_Key_Seen.Parse(r));
            }
            // SENTBEFORE
            else if (r.StartsWith("SENTBEFORE", false))
            {
                return(IMAP_Search_Key_SentBefore.Parse(r));
            }
            // SENTON
            else if (r.StartsWith("SENTON", false))
            {
                return(IMAP_Search_Key_SentOn.Parse(r));
            }
            // SENTSINCE
            else if (r.StartsWith("SENTSINCE", false))
            {
                return(IMAP_Search_Key_SentSince.Parse(r));
            }
            // SEQSET
            else if (r.StartsWith("SEQSET", false))
            {
                return(IMAP_Search_Key_SeqSet.Parse(r));
            }
            // SINCE
            else if (r.StartsWith("SINCE", false))
            {
                return(IMAP_Search_Key_Since.Parse(r));
            }
            // SMALLER
            else if (r.StartsWith("SMALLER", false))
            {
                return(IMAP_Search_Key_Smaller.Parse(r));
            }
            // SUBJECT
            else if (r.StartsWith("SUBJECT", false))
            {
                return(IMAP_Search_Key_Subject.Parse(r));
            }
            // TEXT
            else if (r.StartsWith("TEXT", false))
            {
                return(IMAP_Search_Key_Text.Parse(r));
            }
            // TO
            else if (r.StartsWith("TO", false))
            {
                return(IMAP_Search_Key_To.Parse(r));
            }
            // UID
            else if (r.StartsWith("UID", false))
            {
                return(IMAP_Search_Key_Uid.Parse(r));
            }
            // UNANSWERED
            else if (r.StartsWith("UNANSWERED", false))
            {
                return(IMAP_Search_Key_Unanswered.Parse(r));
            }
            // UNDELETED
            else if (r.StartsWith("UNDELETED", false))
            {
                return(IMAP_Search_Key_Undeleted.Parse(r));
            }
            // UNDRAFT
            else if (r.StartsWith("UNDRAFT", false))
            {
                return(IMAP_Search_Key_Undraft.Parse(r));
            }
            // UNFLAGGED
            else if (r.StartsWith("UNFLAGGED", false))
            {
                return(IMAP_Search_Key_Unflagged.Parse(r));
            }
            // UNKEYWORD
            else if (r.StartsWith("UNKEYWORD", false))
            {
                return(IMAP_Search_Key_Unkeyword.Parse(r));
            }
            // UNSEEN
            else if (r.StartsWith("UNSEEN", false))
            {
                return(IMAP_Search_Key_Unseen.Parse(r));
            }
            else
            {
                // Check if we hae sequence-set. Because of IMAP specification sucks a little here, why the hell they didn't
                // do the keyword(SEQSET) for it, like UID. Now we just have to try if it is sequence-set or BAD key.
                try{
                    return(IMAP_Search_Key_SeqSet.Parse(r));
                }
                catch {
                    throw new ParseException("Unknown search key '" + r.ReadToEnd() + "'.");
                }
            }
        }