⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imapparser.hpp

📁 MIME解析的代码
💻 HPP
📖 第 1 页 / 共 5 页
字号:
				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 + -