📄 imapparser.hpp
字号:
theEncoder = new utility::encoder::b64Encoder(); } if (theEncoder) { utility::inputStreamStringAdapter in(theText->value()); utility::outputStreamStringAdapter out(m_value); theEncoder->decode(in, out); delete (theEncoder); } // No decoder available else { m_value = theText->value(); } delete (theEncoding); delete (theText); *currentPos = pos; } private: vmime::charset m_charset; string m_value; public: const vmime::charset& charset() const { return (m_charset); } const string& value() const { return (m_value); } }; // // flag ::= "\Answered" / "\Flagged" / "\Deleted" / // "\Seen" / "\Draft" / flag_keyword / flag_extension // // flag_extension ::= "\" atom // ;; Future expansion. Client implementations // ;; MUST accept flag_extension flags. Server // ;; implementations MUST NOT generate // ;; flag_extension flags except as defined by // ;; future standard or standards-track // ;; revisions of this specification. // // flag_keyword ::= atom // class flag : public component { public: flag() : m_type(UNKNOWN), m_flag_keyword(NULL) { } ~flag() { delete (m_flag_keyword); } void go(IMAPParser& parser, string& line, string::size_type* currentPos) { DEBUG_ENTER_COMPONENT("flag_keyword"); string::size_type pos = *currentPos; if (parser.check <one_char <'\\'> >(line, &pos, true)) { if (parser.check <one_char <'*'> >(line, &pos, true)) { m_type = STAR; } else { atom* at = parser.get <atom>(line, &pos); const string name = utility::stringUtils::toLower(at->value()); delete (at); if (name == "answered") m_type = ANSWERED; else if (name == "flagged") m_type = FLAGGED; else if (name == "deleted") m_type = DELETED; else if (name == "seen") m_type = SEEN; else if (name == "draft") m_type = DRAFT; else { m_type = UNKNOWN; m_name = name; } } } else { m_type = KEYWORD_OR_EXTENSION; m_flag_keyword = parser.get <atom>(line, &pos); } *currentPos = pos; } enum Type { UNKNOWN, ANSWERED, FLAGGED, DELETED, SEEN, DRAFT, KEYWORD_OR_EXTENSION, STAR // * = custom flags allowed }; private: Type m_type; string m_name; IMAPParser::atom* m_flag_keyword; public: Type type() const { return (m_type); } const string& name() const { return (m_name); } const IMAPParser::atom* flag_keyword() const { return (m_flag_keyword); } }; // // flag_list ::= "(" #flag ")" // class flag_list : public component { public: ~flag_list() { for (std::vector <flag*>::iterator it = m_flags.begin() ; it != m_flags.end() ; ++it) { delete (*it); } } void go(IMAPParser& parser, string& line, string::size_type* currentPos) { DEBUG_ENTER_COMPONENT("flag_list"); string::size_type pos = *currentPos; parser.check <one_char <'('> >(line, &pos); while (!parser.check <one_char <')'> >(line, &pos, true)) { m_flags.push_back(parser.get <flag>(line, &pos)); parser.check <SPACE>(line, &pos, true); } *currentPos = pos; } private: std::vector <flag*> m_flags; public: const std::vector <flag*>& flags() const { return (m_flags); } }; // // mailbox ::= "INBOX" / astring // ;; INBOX is case-insensitive. All case variants of // ;; INBOX (e.g. "iNbOx") MUST be interpreted as INBOX // ;; not as an astring. Refer to section 5.1 for // ;; further semantic details of mailbox names. // class mailbox : public component { public: void go(IMAPParser& parser, string& line, string::size_type* currentPos) { DEBUG_ENTER_COMPONENT("mailbox"); string::size_type pos = *currentPos; if (parser.checkWithArg <special_atom>(line, &pos, "inbox", true)) { m_type = INBOX; m_name = "INBOX"; } else { m_type = OTHER; astring* astr = parser.get <astring>(line, &pos); m_name = astr->value(); delete (astr); } *currentPos = pos; } enum Type { INBOX, OTHER }; private: Type m_type; string m_name; public: Type type() const { return (m_type); } const string& name() const { return (m_name); } }; // // mailbox_flag := "\Marked" / "\Noinferiors" / // "\Noselect" / "\Unmarked" / flag_extension // class mailbox_flag : public component { public: void go(IMAPParser& parser, string& line, string::size_type* currentPos) { DEBUG_ENTER_COMPONENT("mailbox_flag"); string::size_type pos = *currentPos; if (parser.check <one_char <'\\'> >(line, &pos, true)) { atom* at = parser.get <atom>(line, &pos); const string name = utility::stringUtils::toLower(at->value()); delete (at); if (name == "marked") m_type = MARKED; else if (name == "noinferiors") m_type = NOINFERIORS; else if (name == "noselect") m_type = NOSELECT; else if (name == "unmarked") m_type = UNMARKED; else { m_type = UNKNOWN; m_name = "\\" + name; } } else { atom* at = parser.get <atom>(line, &pos); const string name = utility::stringUtils::toLower(at->value()); delete (at); m_type = UNKNOWN; m_name = name; } *currentPos = pos; } enum Type { UNKNOWN, MARKED, NOINFERIORS, NOSELECT, UNMARKED }; private: Type m_type; string m_name; public: Type type() const { return (m_type); } const string& name() const { return (m_name); } }; // // mailbox_flag_list ::= "(" #(mailbox_flag) ")" // class mailbox_flag_list : public component { public: ~mailbox_flag_list() { for (std::vector <mailbox_flag*>::iterator it = m_flags.begin() ; it != m_flags.end() ; ++it) { delete (*it); } } void go(IMAPParser& parser, string& line, string::size_type* currentPos) { DEBUG_ENTER_COMPONENT("mailbox_flag_list"); string::size_type pos = *currentPos; parser.check <one_char <'('> >(line, &pos); while (!parser.check <one_char <')'> >(line, &pos, true)) { m_flags.push_back(parser.get <mailbox_flag>(line, &pos)); parser.check <SPACE>(line, &pos, true); } *currentPos = pos; } private: std::vector <mailbox_flag*> m_flags; public: const std::vector <mailbox_flag*>& flags() const { return (m_flags); } }; // // mailbox_list ::= mailbox_flag_list SPACE // (<"> QUOTED_CHAR <"> / nil) SPACE mailbox // class mailbox_list : public component { public: mailbox_list() : m_mailbox_flag_list(NULL), m_mailbox(NULL), m_quoted_char('\0') { } ~mailbox_list() { delete (m_mailbox_flag_list); delete (m_mailbox); } void go(IMAPParser& parser, string& line, string::size_type* currentPos) { DEBUG_ENTER_COMPONENT("mailbox_list"); string::size_type pos = *currentPos; m_mailbox_flag_list = parser.get <IMAPParser::mailbox_flag_list>(line, &pos); parser.check <SPACE>(line, &pos); if (!parser.check <NIL>(line, &pos, true)) { parser.check <one_char <'"'> >(line, &pos); QUOTED_CHAR* qc = parser.get <QUOTED_CHAR>(line, &pos); m_quoted_char = qc->value(); delete (qc); parser.check <one_char <'"'> >(line, &pos); } parser.check <SPACE>(line, &pos); m_mailbox = parser.get <IMAPParser::mailbox>(line, &pos); *currentPos = pos; } private: IMAPParser::mailbox_flag_list* m_mailbox_flag_list; IMAPParser::mailbox* m_mailbox; char m_quoted_char; public: const IMAPParser::mailbox_flag_list* mailbox_flag_list() const { return (m_mailbox_flag_list); } const IMAPParser::mailbox* mailbox() const { return (m_mailbox); } char quoted_char() const { return (m_quoted_char); } }; // // resp_text_code ::= "ALERT" / "PARSE" / // "PERMANENTFLAGS" SPACE "(" #(flag / "\*") ")" / // "READ-ONLY" / "READ-WRITE" / "TRYCREATE" / // "UIDVALIDITY" SPACE nz_number / // "UNSEEN" SPACE nz_number / // atom [SPACE 1*<any TEXT_CHAR except "]">] class resp_text_code : public component { public: resp_text_code() : m_nz_number(NULL), m_atom(NULL), m_flag_list(NULL), m_text(NULL) { } ~resp_text_code() { delete (m_nz_number); delete (m_atom); delete (m_flag_list); delete (m_text); } void go(IMAPParser& parser, string& line, string::size_type* currentPos) { DEBUG_ENTER_COMPONENT("resp_text_code"); string::size_type pos = *currentPos; // "ALERT" if (parser.checkWithArg <special_atom>(line, &pos, "alert", true)) { m_type = ALERT; } // "PARSE" else if (parser.checkWithArg <special_atom>(line, &pos, "parse", true)) { m_type = PARSE; } // "PERMANENTFLAGS" SPACE flag_list else if (parser.checkWithArg <special_atom>(line, &pos, "permanentflags", true)) { m_type = PERMANENTFLAGS; parser.check <SPACE>(line, &pos); m_flag_list = parser.get <IMAPParser::flag_list>(line, &pos); } // "READ-ONLY" else if (parser.checkWithArg <special_atom>(line, &pos, "read-only", true)) { m_type = READ_ONLY; } // "READ-WRITE" else if (parser.checkWithArg <special_atom>(line, &pos, "read-write", true)) { m_type = READ_WRITE; } // "TRYCREATE" else if (parser.checkWithArg <special_atom>(line, &pos, "trycreate", true)) { m_type = TRYCREATE; } // "UIDVALIDITY" SPACE nz_number else if (parser.checkWithArg <special_atom>(line, &pos, "uidvalidity", true)) { m_type = UIDVALIDITY; parser.check <SPACE>(line, &pos); m_nz_number = parser.get <IMAPParser::nz_number>(line, &pos); } // "UNSEEN" SPACE nz_number else if (parser.checkWithArg <special_atom>(line, &pos, "unseen", true)) { m_type = UNSEEN; parser.check <SPACE>(line, &pos); m_nz_number = parser.get <IMAPParser::nz_number>(line, &pos); } // atom [SPACE 1*<any TEXT_CHAR except "]">] else { m_type = OTHER; m_atom = parser.get <IMAPParser::atom>(line, &pos); if (parser.check <SPACE>(line, &pos, true)) m_text = parser.get <text_except <']'> >(line, &pos); } *currentPos = pos; } enum Type { ALERT, PARSE, PERMANENTFLAGS, READ_ONLY, READ_WRITE, TRYCREATE, UIDVALIDITY, UNSEEN, OTHER }; private: Type m_type; IMAPParser::nz_number* m_nz_number; IMAPParser::atom* m_atom; IMAPParser::flag_list* m_flag_list; IMAPParser::text* m_text; public: Type type() const { return (m_type); } const IMAPParser::nz_number* nz_number() const { return (m_nz_number); } const IMAPParser::atom* atom() const { return (m_atom); } const IMAPParser::flag_list* flag_list() const { return (m_flag_list); } const IMAPParser::text* text() const { return (m_text); } }; // // resp_text ::= ["[" resp_text_code "]" SPACE] (text_mime2 / text) // ;; text SHOULD NOT begin with "[" or "=" class resp_text : public component { public: resp_text() : m_resp_text_code(NULL) { } ~resp_text() { delete (m_resp_text_code); } void go(IMAPParser& parser, string& line, string::size_type* currentPos) { DEBUG_ENTER_COMPONENT("resp_text"); string::size_type pos = *currentPos; if (parser.check <one_char <'['> >(line, &pos, true)) { m_resp_text_code = parser.get <IMAPParser::resp_text_code>(line, &pos); parser.check <one_char <']'> >(line, &pos); parser.check <SPACE>(line, &pos, true); } text_mime2* text1 = parser.get <text_mime2>(line, &pos, true); if (text1 != NULL) { m_text = text1->value(); delete (text1); } else { IMAPParser::text* text2 = parser.get <IMAPParser::text>(line, &pos, true); if (text2 != NULL) { m_text = text2->value(); delete (text2); } else { // Empty response text } } *currentPos = pos; } private: IMAPParser::resp_text_code* m_resp_text_code; string m_text; public: const IMAPParser::resp_text_code* resp_text_code() const { return (m_resp_text_code); } const string& text() const { return (m_text); } }; // // continue_req ::= "+" SPACE (resp_text / base64) // class continue_req : public component { public: continue_req() : m_resp_text(NULL) { }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -