/// <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> /// 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()))); } // ALL else if (r.StartsWith("ALL", false)) { return(IMAP_Search_Key_All.Parse(r)); } // 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() + "'."); } } }