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

📄 pop3folder.cpp

📁 MIME解析的代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//// VMime library (http://www.vmime.org)// Copyright (C) 2002-2008 Vincent Richard <vincent@vincent-richard.net>//// This program is free software; you can redistribute it and/or// modify it under the terms of the GNU General Public License as// published by the Free Software Foundation; either version 2 of// the License, or (at your option) any later version.//// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU// General Public License for more details.//// You should have received a copy of the GNU General Public License along// with this program; if not, write to the Free Software Foundation, Inc.,// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.//// Linking this library statically or dynamically with other modules is making// a combined work based on this library.  Thus, the terms and conditions of// the GNU General Public License cover the whole combination.//#include "vmime/net/pop3/POP3Folder.hpp"#include "vmime/net/pop3/POP3Store.hpp"#include "vmime/net/pop3/POP3Message.hpp"#include "vmime/net/pop3/POP3Utils.hpp"#include "vmime/exception.hpp"namespace vmime {namespace net {namespace pop3 {POP3Folder::POP3Folder(const folder::path& path, ref <POP3Store> store)	: m_store(store), m_path(path),	  m_name(path.isEmpty() ? folder::path::component("") : path.getLastComponent()),	  m_mode(-1), m_open(false){	store->registerFolder(this);}POP3Folder::~POP3Folder(){	ref <POP3Store> store = m_store.acquire();	if (store)	{		if (m_open)			close(false);		store->unregisterFolder(this);	}	else if (m_open)	{		onClose();	}}int POP3Folder::getMode() const{	if (!isOpen())		throw exceptions::illegal_state("Folder not open");	return (m_mode);}int POP3Folder::getType(){	if (!isOpen())		throw exceptions::illegal_state("Folder not open");	if (m_path.isEmpty())		return (TYPE_CONTAINS_FOLDERS);	else if (m_path.getSize() == 1 && m_path[0].getBuffer() == "INBOX")		return (TYPE_CONTAINS_MESSAGES);	else		throw exceptions::folder_not_found();}int POP3Folder::getFlags(){	return (0);}const folder::path::component POP3Folder::getName() const{	return (m_name);}const folder::path POP3Folder::getFullPath() const{	return (m_path);}void POP3Folder::open(const int mode, bool failIfModeIsNotAvailable){	ref <POP3Store> store = m_store.acquire();	if (!store)		throw exceptions::illegal_state("Store disconnected");	if (m_path.isEmpty())	{		if (mode != MODE_READ_ONLY && failIfModeIsNotAvailable)			throw exceptions::operation_not_supported();		m_open = true;		m_mode = mode;		m_messageCount = 0;	}	else if (m_path.getSize() == 1 && m_path[0].getBuffer() == "INBOX")	{		store->sendRequest("STAT");		string response;		store->readResponse(response, false);		if (!store->isSuccessResponse(response))			throw exceptions::command_error("STAT", response);		store->stripResponseCode(response, response);		std::istringstream iss(response);		iss >> m_messageCount;		if (iss.fail())			throw exceptions::invalid_response("STAT", response);		m_open = true;		m_mode = mode;	}	else	{		throw exceptions::folder_not_found();	}}void POP3Folder::close(const bool expunge){	ref <POP3Store> store = m_store.acquire();	if (!store)		throw exceptions::illegal_state("Store disconnected");	if (!isOpen())		throw exceptions::illegal_state("Folder not open");	if (!expunge)	{		store->sendRequest("RSET");		string response;		store->readResponse(response, false);	}	m_open = false;	m_mode = -1;	onClose();}void POP3Folder::onClose(){	for (MessageMap::iterator it = m_messages.begin() ; it != m_messages.end() ; ++it)		(*it).first->onFolderClosed();	m_messages.clear();}void POP3Folder::create(const int /* type */){	throw exceptions::operation_not_supported();}void POP3Folder::destroy(){	throw exceptions::operation_not_supported();}bool POP3Folder::exists(){	ref <POP3Store> store = m_store.acquire();	if (!store)		throw exceptions::illegal_state("Store disconnected");	return (m_path.isEmpty() || (m_path.getSize() == 1 && m_path[0].getBuffer() == "INBOX"));}bool POP3Folder::isOpen() const{	return (m_open);}ref <message> POP3Folder::getMessage(const int num){	ref <POP3Store> store = m_store.acquire();	if (!store)		throw exceptions::illegal_state("Store disconnected");	else if (!isOpen())		throw exceptions::illegal_state("Folder not open");	else if (num < 1 || num > m_messageCount)		throw exceptions::message_not_found();	return vmime::create <POP3Message>(thisRef().dynamicCast <POP3Folder>(), num);}std::vector <ref <message> > POP3Folder::getMessages(const int from, const int to){	ref <POP3Store> store = m_store.acquire();	const int to2 = (to == -1 ? m_messageCount : to);	if (!store)		throw exceptions::illegal_state("Store disconnected");	else if (!isOpen())		throw exceptions::illegal_state("Folder not open");	else if (to2 < from || from < 1 || to2 < 1 || from > m_messageCount || to2 > m_messageCount)		throw exceptions::message_not_found();	std::vector <ref <message> > v;	ref <POP3Folder> thisFolder = thisRef().dynamicCast <POP3Folder>();	for (int i = from ; i <= to2 ; ++i)		v.push_back(vmime::create <POP3Message>(thisFolder, i));	return (v);}std::vector <ref <message> > POP3Folder::getMessages(const std::vector <int>& nums){	ref <POP3Store> store = m_store.acquire();	if (!store)		throw exceptions::illegal_state("Store disconnected");	else if (!isOpen())		throw exceptions::illegal_state("Folder not open");	std::vector <ref <message> > v;	ref <POP3Folder> thisFolder = thisRef().dynamicCast <POP3Folder>();	for (std::vector <int>::const_iterator it = nums.begin() ; it != nums.end() ; ++it)	{		if (*it < 1|| *it > m_messageCount)			throw exceptions::message_not_found();		v.push_back(vmime::create <POP3Message>(thisFolder, *it));	}	return (v);}int POP3Folder::getMessageCount(){	ref <POP3Store> store = m_store.acquire();	if (!store)		throw exceptions::illegal_state("Store disconnected");	else if (!isOpen())		throw exceptions::illegal_state("Folder not open");	return (m_messageCount);}ref <folder> POP3Folder::getFolder(const folder::path::component& name){	ref <POP3Store> store = m_store.acquire();	if (!store)		throw exceptions::illegal_state("Store disconnected");	return vmime::create <POP3Folder>(m_path / name, store);}std::vector <ref <folder> > POP3Folder::getFolders(const bool /* recursive */){	ref <POP3Store> store = m_store.acquire();	if (!store)		throw exceptions::illegal_state("Store disconnected");	if (m_path.isEmpty())	{		std::vector <ref <folder> > v;		v.push_back(vmime::create <POP3Folder>(folder::path::component("INBOX"), store));		return (v);	}	else	{		std::vector <ref <folder> > v;		return (v);	}}void POP3Folder::fetchMessages(std::vector <ref <message> >& msg, const int options,                               utility::progressListener* progress){	ref <POP3Store> store = m_store.acquire();	if (!store)		throw exceptions::illegal_state("Store disconnected");	else if (!isOpen())		throw exceptions::illegal_state("Folder not open");	const int total = msg.size();	int current = 0;	if (progress)		progress->start(total);	for (std::vector <ref <message> >::iterator it = msg.begin() ;	     it != msg.end() ; ++it)	{		(*it).dynamicCast <POP3Message>()->fetch			(thisRef().dynamicCast <POP3Folder>(), options);		if (progress)			progress->progress(++current, total);	}	if (options & FETCH_SIZE)	{		// Send the "LIST" command		std::ostringstream command;		command << "LIST";		store->sendRequest(command.str());		// Get the response		string response;		store->readResponse(response, true, NULL);		if (store->isSuccessResponse(response))		{			store->stripFirstLine(response, response, NULL);			// C: LIST			// S: +OK			// S: 1 47548			// S: 2 12653			// S: .			std::map <int, string> result;			POP3Utils::parseMultiListOrUidlResponse(response, result);			for (std::vector <ref <message> >::iterator it = msg.begin() ;			     it != msg.end() ; ++it)			{				ref <POP3Message> m = (*it).dynamicCast <POP3Message>();				std::map <int, string>::const_iterator x = result.find(m->m_num);				if (x != result.end())				{					int size = 0;					std::istringstream iss((*x).second);					iss >> size;					m->m_size = size;				}			}		}	}	if (options & FETCH_UID)	{		// Send the "UIDL" command		std::ostringstream command;		command << "UIDL";		store->sendRequest(command.str());		// Get the response		string response;		store->readResponse(response, true, NULL);		if (store->isSuccessResponse(response))		{			store->stripFirstLine(response, response, NULL);			// C: UIDL			// S: +OK			// S: 1 whqtswO00WBw418f9t5JxYwZ			// S: 2 QhdPYR:00WBw1Ph7x7			// S: .			std::map <int, string> result;			POP3Utils::parseMultiListOrUidlResponse(response, result);			for (std::vector <ref <message> >::iterator it = msg.begin() ;			     it != msg.end() ; ++it)			{				ref <POP3Message> m = (*it).dynamicCast <POP3Message>();				std::map <int, string>::const_iterator x = result.find(m->m_num);				if (x != result.end())					m->m_uid = (*x).second;			}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -