diff options
Diffstat (limited to 'src/messaging')
-rw-r--r-- | src/messaging/authenticationInfos.cpp | 2 | ||||
-rw-r--r-- | src/messaging/defaultAuthenticator.cpp | 8 | ||||
-rw-r--r-- | src/messaging/events.cpp | 13 | ||||
-rw-r--r-- | src/messaging/imap/IMAPConnection.cpp | 27 | ||||
-rw-r--r-- | src/messaging/imap/IMAPFolder.cpp | 196 | ||||
-rw-r--r-- | src/messaging/imap/IMAPMessage.cpp | 83 | ||||
-rw-r--r-- | src/messaging/imap/IMAPStore.cpp | 35 | ||||
-rw-r--r-- | src/messaging/imap/IMAPTag.cpp | 2 | ||||
-rw-r--r-- | src/messaging/maildir/maildirFolder.cpp | 223 | ||||
-rw-r--r-- | src/messaging/maildir/maildirMessage.cpp | 72 | ||||
-rw-r--r-- | src/messaging/maildir/maildirStore.cpp | 19 | ||||
-rw-r--r-- | src/messaging/maildir/maildirUtils.cpp | 2 | ||||
-rw-r--r-- | src/messaging/pop3/POP3Folder.cpp | 99 | ||||
-rw-r--r-- | src/messaging/pop3/POP3Store.cpp | 17 | ||||
-rw-r--r-- | src/messaging/sendmail/sendmailTransport.cpp | 4 | ||||
-rw-r--r-- | src/messaging/service.cpp | 20 | ||||
-rw-r--r-- | src/messaging/serviceFactory.cpp | 27 | ||||
-rw-r--r-- | src/messaging/serviceInfos.cpp | 2 | ||||
-rw-r--r-- | src/messaging/session.cpp | 50 | ||||
-rw-r--r-- | src/messaging/smtp/SMTPTransport.cpp | 5 | ||||
-rw-r--r-- | src/messaging/transport.cpp | 6 |
21 files changed, 468 insertions, 444 deletions
diff --git a/src/messaging/authenticationInfos.cpp b/src/messaging/authenticationInfos.cpp index 99044f2f..0a7c3433 100644 --- a/src/messaging/authenticationInfos.cpp +++ b/src/messaging/authenticationInfos.cpp @@ -31,7 +31,7 @@ authenticationInfos::authenticationInfos(const string& username, const string& p authenticationInfos::authenticationInfos(const authenticationInfos& infos) - : m_username(infos.m_username), m_password(infos.m_password) + : object(), m_username(infos.m_username), m_password(infos.m_password) { } diff --git a/src/messaging/defaultAuthenticator.cpp b/src/messaging/defaultAuthenticator.cpp index db027339..373d3c1d 100644 --- a/src/messaging/defaultAuthenticator.cpp +++ b/src/messaging/defaultAuthenticator.cpp @@ -18,14 +18,15 @@ // #include "vmime/messaging/defaultAuthenticator.hpp" +#include "vmime/messaging/session.hpp" namespace vmime { namespace messaging { -defaultAuthenticator::defaultAuthenticator(const propertySet& props, const string& prefix) - : m_props(props), m_prefix(prefix) +defaultAuthenticator::defaultAuthenticator(weak_ref <session> sess, const string& prefix) + : m_session(sess), m_prefix(prefix) { } @@ -33,7 +34,8 @@ defaultAuthenticator::defaultAuthenticator(const propertySet& props, const strin const authenticationInfos defaultAuthenticator::requestAuthInfos() const { return (authenticationInfos - (m_props[m_prefix + "auth.username"], m_props[m_prefix + "auth.password"])); + (m_session->getProperties()[m_prefix + "auth.username"], + m_session->getProperties()[m_prefix + "auth.password"])); } diff --git a/src/messaging/events.cpp b/src/messaging/events.cpp index edc736c1..13171832 100644 --- a/src/messaging/events.cpp +++ b/src/messaging/events.cpp @@ -18,6 +18,7 @@ // #include "vmime/messaging/events.hpp" +#include "vmime/messaging/folder.hpp" #include <algorithm> @@ -32,7 +33,7 @@ namespace events { // messageCountEvent::messageCountEvent - (folder* folder, const Types type, const std::vector <int>& nums) + (ref <folder> folder, const Types type, const std::vector <int>& nums) : m_folder(folder), m_type(type) { m_nums.resize(nums.size()); @@ -40,7 +41,7 @@ messageCountEvent::messageCountEvent } -const folder* messageCountEvent::getFolder() const { return (const_cast <folder*>(m_folder)); } +ref <const folder> messageCountEvent::getFolder() const { return (m_folder); } const messageCountEvent::Types messageCountEvent::getType() const { return (m_type); } const std::vector <int>& messageCountEvent::getNumbers() const { return (m_nums); } @@ -59,7 +60,7 @@ void messageCountEvent::dispatch(messageCountListener* listener) const // messageChangedEvent::messageChangedEvent - (folder* folder, const Types type, const std::vector <int>& nums) + (ref <folder> folder, const Types type, const std::vector <int>& nums) : m_folder(folder), m_type(type) { m_nums.resize(nums.size()); @@ -67,7 +68,7 @@ messageChangedEvent::messageChangedEvent } -const folder* messageChangedEvent::getFolder() const { return (const_cast <folder*>(m_folder)); } +ref <const folder> messageChangedEvent::getFolder() const { return (m_folder); } const messageChangedEvent::Types messageChangedEvent::getType() const { return (m_type); } const std::vector <int>& messageChangedEvent::getNumbers() const { return (m_nums); } @@ -83,14 +84,14 @@ void messageChangedEvent::dispatch(messageChangedListener* listener) const // folderEvent::folderEvent - (folder* folder, const Types type, + (ref <folder> folder, const Types type, const utility::path& oldPath, const utility::path& newPath) : m_folder(folder), m_type(type), m_oldPath(oldPath), m_newPath(newPath) { } -const folder* folderEvent::getFolder() const { return (m_folder); } +ref <const folder> folderEvent::getFolder() const { return (m_folder); } const folderEvent::Types folderEvent::getType() const { return (m_type); } diff --git a/src/messaging/imap/IMAPConnection.cpp b/src/messaging/imap/IMAPConnection.cpp index 37a132de..586a1716 100644 --- a/src/messaging/imap/IMAPConnection.cpp +++ b/src/messaging/imap/IMAPConnection.cpp @@ -42,7 +42,7 @@ namespace messaging { namespace imap { -IMAPConnection::IMAPConnection(IMAPStore* store, authenticator* auth) +IMAPConnection::IMAPConnection(weak_ref <IMAPStore> store, ref <authenticator> auth) : m_store(store), m_auth(auth), m_socket(NULL), m_parser(NULL), m_tag(NULL), m_hierarchySeparator('\0'), m_state(STATE_NONE), m_timeoutHandler(NULL) { @@ -55,9 +55,6 @@ IMAPConnection::~IMAPConnection() disconnect(); else if (m_socket) internalDisconnect(); - - delete (m_tag); - delete (m_parser); } @@ -89,11 +86,8 @@ void IMAPConnection::connect() m_socket->connect(address, port); - delete (m_tag); - m_tag = new IMAPTag(); - - delete (m_parser); - m_parser = new IMAPParser(m_tag, m_socket, m_timeoutHandler); + m_tag = vmime::create <IMAPTag>(); + m_parser = vmime::create <IMAPParser>(m_tag, m_socket, m_timeoutHandler); setState(STATE_NON_AUTHENTICATED); @@ -164,11 +158,8 @@ void IMAPConnection::internalDisconnect() send(true, "LOGOUT", true); m_socket->disconnect(); - - delete (m_socket); m_socket = NULL; - delete (m_timeoutHandler); m_timeoutHandler = NULL; m_state = STATE_LOGOUT; @@ -179,7 +170,7 @@ void IMAPConnection::initHierarchySeparator() { send(true, "LIST \"\" \"\"", true); - utility::auto_ptr <IMAPParser::response> resp(m_parser->readResponse()); + vmime::utility::auto_ptr <IMAPParser::response> resp(m_parser->readResponse()); if (resp->isBad() || resp->response_done()->response_tagged()-> resp_cond_state()->status() != IMAPParser::resp_cond_state::OK) @@ -284,31 +275,31 @@ const char IMAPConnection::hierarchySeparator() const } -const IMAPTag* IMAPConnection::getTag() const +ref <const IMAPTag> IMAPConnection::getTag() const { return (m_tag); } -const IMAPParser* IMAPConnection::getParser() const +ref <const IMAPParser> IMAPConnection::getParser() const { return (m_parser); } -const IMAPStore* IMAPConnection::getStore() const +weak_ref <const IMAPStore> IMAPConnection::getStore() const { return (m_store); } -IMAPStore* IMAPConnection::getStore() +weak_ref <IMAPStore> IMAPConnection::getStore() { return (m_store); } -session* IMAPConnection::getSession() +ref <session> IMAPConnection::getSession() { return (m_store->getSession()); } diff --git a/src/messaging/imap/IMAPFolder.cpp b/src/messaging/imap/IMAPFolder.cpp index 35f3509b..c567c590 100644 --- a/src/messaging/imap/IMAPFolder.cpp +++ b/src/messaging/imap/IMAPFolder.cpp @@ -59,7 +59,7 @@ IMAPFolder::~IMAPFolder() } else if (m_open) { - delete (m_connection); + m_connection = NULL; onClose(); } } @@ -132,8 +132,8 @@ void IMAPFolder::open(const int mode, bool failIfModeIsNotAvailable) throw exceptions::illegal_state("Store disconnected"); // Open a connection for this folder - IMAPConnection* connection = - new IMAPConnection(m_store, m_store->oneTimeAuthenticator()); + ref <IMAPConnection> connection = + vmime::create <IMAPConnection>(m_store, m_store->oneTimeAuthenticator()); try { @@ -263,7 +263,6 @@ void IMAPFolder::open(const int mode, bool failIfModeIsNotAvailable) } catch (std::exception&) { - delete (connection); throw; } } @@ -277,7 +276,7 @@ void IMAPFolder::close(const bool expunge) if (!isOpen()) throw exceptions::illegal_state("Folder not open"); - IMAPConnection* oldConnection = m_connection; + ref <IMAPConnection> oldConnection = m_connection; // Emit the "CLOSE" command to expunge messages marked // as deleted (this is fastest than "EXPUNGE") @@ -301,8 +300,6 @@ void IMAPFolder::close(const bool expunge) m_uidValidity = 0; onClose(); - - delete (oldConnection); } @@ -358,7 +355,10 @@ void IMAPFolder::create(const int type) } // Notify folder created - events::folderEvent event(this, events::folderEvent::TYPE_CREATED, m_path, m_path); + events::folderEvent event + (thisRef().dynamicCast <folder>(), + events::folderEvent::TYPE_CREATED, m_path, m_path); + notifyFolder(event); } @@ -450,7 +450,7 @@ const bool IMAPFolder::isOpen() const } -message* IMAPFolder::getMessage(const int num) +ref <message> IMAPFolder::getMessage(const int num) { if (!isOpen()) throw exceptions::illegal_state("Folder not open"); @@ -458,33 +458,33 @@ message* IMAPFolder::getMessage(const int num) if (num < 1 || num > m_messageCount) throw exceptions::message_not_found(); - return new IMAPMessage(this, num); + return vmime::create <IMAPMessage>(this, num); } -std::vector <message*> IMAPFolder::getMessages(const int from, const int to) +std::vector <ref <message> > IMAPFolder::getMessages(const int from, const int to) { if (!isOpen()) throw exceptions::illegal_state("Folder not open"); - std::vector <message*> v; + std::vector <ref <message> > v; for (int i = from ; i <= to ; ++i) - v.push_back(new IMAPMessage(this, i)); + v.push_back(vmime::create <IMAPMessage>(this, i)); return (v); } -std::vector <message*> IMAPFolder::getMessages(const std::vector <int>& nums) +std::vector <ref <message> > IMAPFolder::getMessages(const std::vector <int>& nums) { if (!isOpen()) throw exceptions::illegal_state("Folder not open"); - std::vector <message*> v; + std::vector <ref <message> > v; for (std::vector <int>::const_iterator it = nums.begin() ; it != nums.end() ; ++it) - v.push_back(new IMAPMessage(this, *it)); + v.push_back(vmime::create <IMAPMessage>(this, *it)); return (v); } @@ -499,16 +499,16 @@ const int IMAPFolder::getMessageCount() } -folder* IMAPFolder::getFolder(const folder::path::component& name) +ref <folder> IMAPFolder::getFolder(const folder::path::component& name) { if (!m_store) throw exceptions::illegal_state("Store disconnected"); - return new IMAPFolder(m_path / name, m_store); + return vmime::create <IMAPFolder>(m_path / name, m_store); } -std::vector <folder*> IMAPFolder::getFolders(const bool recursive) +std::vector <ref <folder> > IMAPFolder::getFolders(const bool recursive) { if (!isOpen() && !m_store) throw exceptions::illegal_state("Store disconnected"); @@ -556,57 +556,47 @@ std::vector <folder*> IMAPFolder::getFolders(const bool recursive) resp->continue_req_or_response_data(); - std::vector <folder*> v; + std::vector <ref <folder> > v; - try + for (std::vector <IMAPParser::continue_req_or_response_data*>::const_iterator + it = respDataList.begin() ; it != respDataList.end() ; ++it) { - for (std::vector <IMAPParser::continue_req_or_response_data*>::const_iterator - it = respDataList.begin() ; it != respDataList.end() ; ++it) + if ((*it)->response_data() == NULL) { - if ((*it)->response_data() == NULL) - { - throw exceptions::command_error("LIST", - m_connection->getParser()->lastLine(), "invalid response"); - } + throw exceptions::command_error("LIST", + m_connection->getParser()->lastLine(), "invalid response"); + } - const IMAPParser::mailbox_data* mailboxData = - (*it)->response_data()->mailbox_data(); + const IMAPParser::mailbox_data* mailboxData = + (*it)->response_data()->mailbox_data(); - if (mailboxData == NULL || mailboxData->type() != IMAPParser::mailbox_data::LIST) - continue; + if (mailboxData == NULL || mailboxData->type() != IMAPParser::mailbox_data::LIST) + continue; - // Get folder path - const class IMAPParser::mailbox* mailbox = - mailboxData->mailbox_list()->mailbox(); + // Get folder path + const class IMAPParser::mailbox* mailbox = + mailboxData->mailbox_list()->mailbox(); - folder::path path = IMAPUtils::stringToPath - (mailboxData->mailbox_list()->quoted_char(), mailbox->name()); + folder::path path = IMAPUtils::stringToPath + (mailboxData->mailbox_list()->quoted_char(), mailbox->name()); - if (recursive || m_path.isDirectParentOf(path)) - { - // Append folder to list - const class IMAPParser::mailbox_flag_list* mailbox_flag_list = - mailboxData->mailbox_list()->mailbox_flag_list(); + if (recursive || m_path.isDirectParentOf(path)) + { + // Append folder to list + const class IMAPParser::mailbox_flag_list* mailbox_flag_list = + mailboxData->mailbox_list()->mailbox_flag_list(); - v.push_back(new IMAPFolder(path, m_store, - IMAPUtils::folderTypeFromFlags(mailbox_flag_list), - IMAPUtils::folderFlagsFromFlags(mailbox_flag_list))); - } + v.push_back(vmime::create <IMAPFolder>(path, m_store, + IMAPUtils::folderTypeFromFlags(mailbox_flag_list), + IMAPUtils::folderFlagsFromFlags(mailbox_flag_list))); } } - catch (std::exception&) - { - for (std::vector <folder*>::iterator it = v.begin() ; it != v.end() ; ++it) - delete (*it); - - throw; - } return (v); } -void IMAPFolder::fetchMessages(std::vector <message*>& msg, const int options, +void IMAPFolder::fetchMessages(std::vector <ref <message> >& msg, const int options, utility::progressionListener* progress) { if (!m_store) @@ -620,10 +610,10 @@ void IMAPFolder::fetchMessages(std::vector <message*>& msg, const int options, if (progress) progress->start(total); - for (std::vector <message*>::iterator it = msg.begin() ; + for (std::vector <ref <message> >::iterator it = msg.begin() ; it != msg.end() ; ++it) { - dynamic_cast <IMAPMessage*>(*it)->fetch(this, options); + (*it).dynamicCast <IMAPMessage>()->fetch(this, options); if (progress) progress->progress(++current, total); @@ -634,14 +624,14 @@ void IMAPFolder::fetchMessages(std::vector <message*>& msg, const int options, } -void IMAPFolder::fetchMessage(message* msg, const int options) +void IMAPFolder::fetchMessage(ref <message> msg, const int options) { if (!m_store) throw exceptions::illegal_state("Store disconnected"); else if (!isOpen()) throw exceptions::illegal_state("Folder not open"); - dynamic_cast <IMAPMessage*>(msg)->fetch(this, options); + msg.dynamicCast <IMAPMessage>()->fetch(this, options); } @@ -652,19 +642,22 @@ const int IMAPFolder::getFetchCapabilities() const } -folder* IMAPFolder::getParent() +ref <folder> IMAPFolder::getParent() { - return (m_path.isEmpty() ? NULL : new IMAPFolder(m_path.getParent(), m_store)); + if (m_path.isEmpty()) + return NULL; + else + return vmime::create <IMAPFolder>(m_path.getParent(), m_store); } -const store* IMAPFolder::getStore() const +weak_ref <const store> IMAPFolder::getStore() const { return (m_store); } -store* IMAPFolder::getStore() +weak_ref <store> IMAPFolder::getStore() { return (m_store); } @@ -733,7 +726,9 @@ void IMAPFolder::deleteMessage(const int num) std::vector <int> nums; nums.push_back(num); - events::messageChangedEvent event(this, events::messageChangedEvent::TYPE_FLAGS, nums); + events::messageChangedEvent event + (thisRef().dynamicCast <folder>(), + events::messageChangedEvent::TYPE_FLAGS, nums); notifyMessageChanged(event); } @@ -794,7 +789,9 @@ void IMAPFolder::deleteMessages(const int from, const int to) for (int i = from, j = 0 ; i <= to2 ; ++i, ++j) nums[j] = i; - events::messageChangedEvent event(this, events::messageChangedEvent::TYPE_FLAGS, nums); + events::messageChangedEvent event + (thisRef().dynamicCast <folder>(), + events::messageChangedEvent::TYPE_FLAGS, nums); notifyMessageChanged(event); } @@ -851,7 +848,9 @@ void IMAPFolder::deleteMessages(const std::vector <int>& nums) } // Notify message flags changed - events::messageChangedEvent event(this, events::messageChangedEvent::TYPE_FLAGS, list); + events::messageChangedEvent event + (thisRef().dynamicCast <folder>(), + events::messageChangedEvent::TYPE_FLAGS, list); notifyMessageChanged(event); } @@ -937,7 +936,9 @@ void IMAPFolder::setMessageFlags(const int from, const int to, const int flags, for (int i = from, j = 0 ; i <= to2 ; ++i, ++j) nums[j] = i; - events::messageChangedEvent event(this, events::messageChangedEvent::TYPE_FLAGS, nums); + events::messageChangedEvent event + (thisRef().dynamicCast <folder>(), + events::messageChangedEvent::TYPE_FLAGS, nums); notifyMessageChanged(event); } @@ -1013,7 +1014,9 @@ void IMAPFolder::setMessageFlags(const std::vector <int>& nums, const int flags, } // Notify message flags changed - events::messageChangedEvent event(this, events::messageChangedEvent::TYPE_FLAGS, nums); + events::messageChangedEvent event + (thisRef().dynamicCast <folder>(), + events::messageChangedEvent::TYPE_FLAGS, nums); notifyMessageChanged(event); } @@ -1055,7 +1058,7 @@ void IMAPFolder::setMessageFlags(const string& set, const int flags, const int m } -void IMAPFolder::addMessage(vmime::message* msg, const int flags, +void IMAPFolder::addMessage(ref <vmime::message> msg, const int flags, vmime::datetime* date, utility::progressionListener* progress) { std::ostringstream oss; @@ -1166,7 +1169,9 @@ void IMAPFolder::addMessage(utility::inputStream& is, const int size, const int std::vector <int> nums; nums.push_back(m_messageCount + 1); - events::messageCountEvent event(this, events::messageCountEvent::TYPE_ADDED, nums); + events::messageCountEvent event + (thisRef().dynamicCast <folder>(), + events::messageCountEvent::TYPE_ADDED, nums); m_messageCount++; notifyMessageCount(event); @@ -1177,7 +1182,9 @@ void IMAPFolder::addMessage(utility::inputStream& is, const int size, const int { if ((*it) != this && (*it)->getFullPath() == m_path) { - events::messageCountEvent event(*it, events::messageCountEvent::TYPE_ADDED, nums); + events::messageCountEvent event + ((*it)->thisRef().dynamicCast <folder>(), + events::messageCountEvent::TYPE_ADDED, nums); (*it)->m_messageCount++; (*it)->notifyMessageCount(event); @@ -1250,7 +1257,9 @@ void IMAPFolder::expunge() m_messageCount -= nums.size(); // Notify message expunged - events::messageCountEvent event(this, events::messageCountEvent::TYPE_REMOVED, nums); + events::messageCountEvent event + (thisRef().dynamicCast <folder>(), + events::messageCountEvent::TYPE_REMOVED, nums); notifyMessageCount(event); @@ -1262,7 +1271,9 @@ void IMAPFolder::expunge() { (*it)->m_messageCount = m_messageCount; - events::messageCountEvent event(*it, events::messageCountEvent::TYPE_REMOVED, nums); + events::messageCountEvent event + ((*it)->thisRef().dynamicCast <folder>(), + events::messageCountEvent::TYPE_REMOVED, nums); (*it)->notifyMessageCount(event); } @@ -1308,7 +1319,10 @@ void IMAPFolder::rename(const folder::path& newPath) m_path = newPath; m_name = newPath.getLastComponent(); - events::folderEvent event(this, events::folderEvent::TYPE_RENAMED, oldPath, newPath); + events::folderEvent event + (thisRef().dynamicCast <folder>(), + events::folderEvent::TYPE_RENAMED, oldPath, newPath); + notifyFolder(event); // Notify folders with the same path and sub-folders @@ -1320,7 +1334,10 @@ void IMAPFolder::rename(const folder::path& newPath) (*it)->m_path = newPath; (*it)->m_name = newPath.getLastComponent(); - events::folderEvent event(*it, events::folderEvent::TYPE_RENAMED, oldPath, newPath); + events::folderEvent event + ((*it)->thisRef().dynamicCast <folder>(), + events::folderEvent::TYPE_RENAMED, oldPath, newPath); + (*it)->notifyFolder(event); } else if ((*it) != this && oldPath.isParentOf((*it)->getFullPath())) @@ -1329,7 +1346,10 @@ void IMAPFolder::rename(const folder::path& newPath) (*it)->m_path.renameParent(oldPath, newPath); - events::folderEvent event(*it, events::folderEvent::TYPE_RENAMED, oldPath, (*it)->m_path); + events::folderEvent event + ((*it)->thisRef().dynamicCast <folder>(), + events::folderEvent::TYPE_RENAMED, oldPath, (*it)->m_path); + (*it)->notifyFolder(event); } } @@ -1354,13 +1374,15 @@ void IMAPFolder::copyMessage(const folder::path& dest, const int num) std::vector <int> nums; nums.push_back(num); - events::messageCountEvent event(this, events::messageCountEvent::TYPE_ADDED, nums); - for (std::list <IMAPFolder*>::iterator it = m_store->m_folders.begin() ; it != m_store->m_folders.end() ; ++it) { if ((*it)->getFullPath() == dest) { + events::messageCountEvent event + ((*it)->thisRef().dynamicCast <folder>(), + events::messageCountEvent::TYPE_ADDED, nums); + (*it)->m_messageCount++; (*it)->notifyMessageCount(event); } @@ -1398,13 +1420,15 @@ void IMAPFolder::copyMessages(const folder::path& dest, const int from, const in for (int i = from, j = 0 ; i <= to2 ; ++i, ++j) nums[j] = i; - events::messageCountEvent event(this, events::messageCountEvent::TYPE_ADDED, nums); - for (std::list <IMAPFolder*>::iterator it = m_store->m_folders.begin() ; it != m_store->m_folders.end() ; ++it) { if ((*it)->getFullPath() == dest) { + events::messageCountEvent event + ((*it)->thisRef().dynamicCast <folder>(), + events::messageCountEvent::TYPE_ADDED, nums); + (*it)->m_messageCount += count; (*it)->notifyMessageCount(event); } @@ -1425,13 +1449,15 @@ void IMAPFolder::copyMessages(const folder::path& dest, const std::vector <int>& // Notify message count changed const int count = nums.size(); - events::messageCountEvent event(this, events::messageCountEvent::TYPE_ADDED, nums); - for (std::list <IMAPFolder*>::iterator it = m_store->m_folders.begin() ; it != m_store->m_folders.end() ; ++it) { if ((*it)->getFullPath() == dest) { + events::messageCountEvent event + ((*it)->thisRef().dynamicCast <folder>(), + events::messageCountEvent::TYPE_ADDED, nums); + (*it)->m_messageCount += count; (*it)->notifyMessageCount(event); } @@ -1545,7 +1571,9 @@ void IMAPFolder::status(int& count, int& unseen) for (int i = oldCount + 1, j = 0 ; i <= count ; ++i, ++j) nums[j] = i; - events::messageCountEvent event(this, events::messageCountEvent::TYPE_ADDED, nums); + events::messageCountEvent event + (thisRef().dynamicCast <folder>(), + events::messageCountEvent::TYPE_ADDED, nums); notifyMessageCount(event); @@ -1557,7 +1585,9 @@ void IMAPFolder::status(int& count, int& unseen) { (*it)->m_messageCount = count; - events::messageCountEvent event(*it, events::messageCountEvent::TYPE_ADDED, nums); + events::messageCountEvent event + ((*it)->thisRef().dynamicCast <folder>(), + events::messageCountEvent::TYPE_ADDED, nums); (*it)->notifyMessageCount(event); } diff --git a/src/messaging/imap/IMAPMessage.cpp b/src/messaging/imap/IMAPMessage.cpp index 03af67c6..97aa2d28 100644 --- a/src/messaging/imap/IMAPMessage.cpp +++ b/src/messaging/imap/IMAPMessage.cpp @@ -43,17 +43,17 @@ class IMAPpart : public part { private: - IMAPpart(IMAPpart* parent, const int number, const IMAPParser::body_type_mpart* mpart); - IMAPpart(IMAPpart* parent, const int number, const IMAPParser::body_type_1part* part); + friend class vmime::creator; -public: + IMAPpart(weak_ref <IMAPpart> parent, const int number, const IMAPParser::body_type_mpart* mpart); + IMAPpart(weak_ref <IMAPpart> parent, const int number, const IMAPParser::body_type_1part* part); - ~IMAPpart(); +public: const structure& getStructure() const; structure& getStructure(); - const IMAPpart* getParent() const { return (m_parent); } + weak_ref <const IMAPpart> getParent() const { return (m_parent); } const mediaType& getType() const { return (m_mediaType); } const int getSize() const { return (m_size); } @@ -68,12 +68,13 @@ public: } - static IMAPpart* create(IMAPpart* parent, const int number, const IMAPParser::body* body) + static ref <IMAPpart> create + (weak_ref <IMAPpart> parent, const int number, const IMAPParser::body* body) { if (body->body_type_mpart()) - return new IMAPpart(parent, number, body->body_type_mpart()); + return vmime::create <IMAPpart>(parent, number, body->body_type_mpart()); else - return new IMAPpart(parent, number, body->body_type_1part()); + return vmime::create <IMAPpart>(parent, number, body->body_type_1part()); } @@ -82,14 +83,14 @@ public: if (m_header != NULL) return (*m_header); else - return (*(m_header = new header())); + return (*(m_header = vmime::create <header>())); } private: - IMAPstructure* m_structure; - IMAPpart* m_parent; - header* m_header; + ref <IMAPstructure> m_structure; + weak_ref <IMAPpart> m_parent; + ref <header> m_header; int m_number; int m_size; @@ -117,7 +118,7 @@ public: m_parts.push_back(IMAPpart::create(NULL, 1, body)); } - IMAPstructure(IMAPpart* parent, const std::vector <IMAPParser::body*>& list) + IMAPstructure(weak_ref <IMAPpart> parent, const std::vector <IMAPParser::body*>& list) { int number = 1; @@ -128,11 +129,6 @@ public: } } - ~IMAPstructure() - { - free_container(m_parts); - } - const part& operator[](const int x) const { @@ -159,7 +155,7 @@ private: static IMAPstructure m_emptyStructure; - std::vector <IMAPpart*> m_parts; + std::vector <ref <IMAPpart> > m_parts; }; @@ -167,17 +163,18 @@ IMAPstructure IMAPstructure::m_emptyStructure; -IMAPpart::IMAPpart(IMAPpart* parent, const int number, const IMAPParser::body_type_mpart* mpart) +IMAPpart::IMAPpart(weak_ref <IMAPpart> parent, const int number, const IMAPParser::body_type_mpart* mpart) : m_parent(parent), m_header(NULL), m_number(number), m_size(0) { m_mediaType = vmime::mediaType ("multipart", mpart->media_subtype()->value()); - m_structure = new IMAPstructure(this, mpart->list()); + m_structure = vmime::create <IMAPstructure> + (thisWeakRef().dynamicCast <IMAPpart>(), mpart->list()); } -IMAPpart::IMAPpart(IMAPpart* parent, const int number, const IMAPParser::body_type_1part* part) +IMAPpart::IMAPpart(weak_ref <IMAPpart> parent, const int number, const IMAPParser::body_type_1part* part) : m_parent(parent), m_header(NULL), m_number(number), m_size(0) { if (part->body_type_text()) @@ -207,13 +204,6 @@ IMAPpart::IMAPpart(IMAPpart* parent, const int number, const IMAPParser::body_ty } -IMAPpart::~IMAPpart() -{ - delete (m_structure); - delete (m_header); -} - - const class structure& IMAPpart::getStructure() const { if (m_structure != NULL) @@ -292,8 +282,6 @@ IMAPMessage::~IMAPMessage() { if (m_folder) m_folder->unregisterMessage(this); - - delete dynamic_cast <header*>(m_header); } @@ -597,62 +585,61 @@ void IMAPMessage::processFetchResponse vmime::header& hdr = getOrCreateHeader(); // Date - hdr.Date().setValue(env->env_date()->value()); + hdr.Date()->setValue(env->env_date()->value()); // Subject text subject; text::decodeAndUnfold(env->env_subject()->value(), &subject); - hdr.Subject().setValue(subject); + hdr.Subject()->setValue(subject); // From mailboxList from; convertAddressList(*(env->env_from()), from); if (!from.isEmpty()) - hdr.From().setValue(*(from.getMailboxAt(0))); + hdr.From()->setValue(*(from.getMailboxAt(0))); // To mailboxList to; convertAddressList(*(env->env_to()), to); - hdr.To().setValue(to); + hdr.To()->setValue(to); // Sender mailboxList sender; convertAddressList(*(env->env_sender()), sender); if (!sender.isEmpty()) - hdr.Sender().setValue(*(sender.getMailboxAt(0))); + hdr.Sender()->setValue(*(sender.getMailboxAt(0))); // Reply-to mailboxList replyTo; convertAddressList(*(env->env_reply_to()), replyTo); if (!replyTo.isEmpty()) - hdr.ReplyTo().setValue(*(replyTo.getMailboxAt(0))); + hdr.ReplyTo()->setValue(*(replyTo.getMailboxAt(0))); // Cc mailboxList cc; convertAddressList(*(env->env_cc()), cc); if (!cc.isEmpty()) - hdr.Cc().setValue(cc); + hdr.Cc()->setValue(cc); // Bcc mailboxList bcc; convertAddressList(*(env->env_bcc()), bcc); if (!bcc.isEmpty()) - hdr.Bcc().setValue(bcc); + hdr.Bcc()->setValue(bcc); } break; } case IMAPParser::msg_att_item::BODY_STRUCTURE: { - delete (m_structure); - m_structure = new IMAPstructure((*it)->body()); + m_structure = vmime::create <IMAPstructure>((*it)->body()); break; } case IMAPParser::msg_att_item::RFC822_HEADER: @@ -677,12 +664,12 @@ void IMAPMessage::processFetchResponse tempHeader.parse((*it)->nstring()->value()); vmime::header& hdr = getOrCreateHeader(); - std::vector <headerField*> fields = tempHeader.getFieldList(); + std::vector <ref <headerField> > fields = tempHeader.getFieldList(); - for (std::vector <headerField*>::const_iterator jt = fields.begin() ; + for (std::vector <ref <headerField> >::const_iterator jt = fields.begin() ; jt != fields.end() ; ++jt) { - hdr.appendField((*jt)->clone()); + hdr.appendField((*jt)->clone().dynamicCast <headerField>()); } } } @@ -710,7 +697,7 @@ header& IMAPMessage::getOrCreateHeader() if (m_header != NULL) return (*m_header); else - return (*(m_header = new header())); + return (*(m_header = vmime::create <header>())); } @@ -728,7 +715,7 @@ void IMAPMessage::convertAddressList string email = addr.addr_mailbox()->value() + "@" + addr.addr_host()->value(); - dest.appendMailbox(new mailbox(name, email)); + dest.appendMailbox(vmime::create <mailbox>(name, email)); } } @@ -829,7 +816,9 @@ void IMAPMessage::setFlags(const int flags, const int mode) std::vector <int> nums; nums.push_back(m_num); - events::messageChangedEvent event(m_folder, events::messageChangedEvent::TYPE_FLAGS, nums); + events::messageChangedEvent event + (m_folder->thisRef().dynamicCast <folder>(), + events::messageChangedEvent::TYPE_FLAGS, nums); for (std::list <IMAPFolder*>::iterator it = m_folder->m_store->m_folders.begin() ; it != m_folder->m_store->m_folders.end() ; ++it) diff --git a/src/messaging/imap/IMAPStore.cpp b/src/messaging/imap/IMAPStore.cpp index 07b22351..00ef98f2 100644 --- a/src/messaging/imap/IMAPStore.cpp +++ b/src/messaging/imap/IMAPStore.cpp @@ -45,28 +45,27 @@ class IMAPauthenticator : public authenticator { public: - IMAPauthenticator(authenticator* auth) + IMAPauthenticator(ref <authenticator> auth) : m_auth(auth), m_infos(NULL) { } ~IMAPauthenticator() { - delete (m_infos); } const authenticationInfos requestAuthInfos() const { if (m_infos == NULL) - m_infos = new authenticationInfos(m_auth->requestAuthInfos()); + m_infos = vmime::create <authenticationInfos>(m_auth->requestAuthInfos()); return (*m_infos); } private: - authenticator* m_auth; - mutable authenticationInfos* m_infos; + ref <authenticator> m_auth; + mutable ref <authenticationInfos> m_infos; }; #endif // VMIME_BUILDING_DOC @@ -77,7 +76,7 @@ private: // IMAPStore // -IMAPStore::IMAPStore(session* sess, authenticator* auth) +IMAPStore::IMAPStore(ref <session> sess, ref <authenticator> auth) : store(sess, getInfosInstance(), auth), m_connection(NULL), m_oneTimeAuth(NULL) { @@ -91,7 +90,7 @@ IMAPStore::~IMAPStore() } -authenticator* IMAPStore::oneTimeAuthenticator() +ref <authenticator> IMAPStore::oneTimeAuthenticator() { return (m_oneTimeAuth); } @@ -103,30 +102,30 @@ const string IMAPStore::getProtocolName() const } -folder* IMAPStore::getRootFolder() +ref <folder> IMAPStore::getRootFolder() { if (!isConnected()) throw exceptions::illegal_state("Not connected"); - return new IMAPFolder(folder::path(), this); + return vmime::create <IMAPFolder>(folder::path(), this); } -folder* IMAPStore::getDefaultFolder() +ref <folder> IMAPStore::getDefaultFolder() { if (!isConnected()) throw exceptions::illegal_state("Not connected"); - return new IMAPFolder(folder::path::component("INBOX"), this); + return vmime::create <IMAPFolder>(folder::path::component("INBOX"), this); } -folder* IMAPStore::getFolder(const folder::path& path) +ref <folder> IMAPStore::getFolder(const folder::path& path) { if (!isConnected()) throw exceptions::illegal_state("Not connected"); - return new IMAPFolder(path, this); + return vmime::create <IMAPFolder>(path, this); } @@ -141,9 +140,10 @@ void IMAPStore::connect() if (isConnected()) throw exceptions::already_connected(); - m_oneTimeAuth = new IMAPauthenticator(getAuthenticator()); + m_oneTimeAuth = vmime::create <IMAPauthenticator>(getAuthenticator()); - m_connection = new IMAPConnection(this, m_oneTimeAuth); + m_connection = vmime::create <IMAPConnection> + (thisWeakRef().dynamicCast <IMAPStore>(), m_oneTimeAuth); try { @@ -151,7 +151,6 @@ void IMAPStore::connect() } catch (std::exception&) { - delete (m_connection); m_connection = NULL; throw; } @@ -180,10 +179,8 @@ void IMAPStore::disconnect() m_connection->disconnect(); - delete (m_oneTimeAuth); m_oneTimeAuth = NULL; - delete (m_connection); m_connection = NULL; } @@ -205,7 +202,7 @@ void IMAPStore::noop() } -IMAPConnection* IMAPStore::connection() +ref <IMAPConnection> IMAPStore::connection() { return (m_connection); } diff --git a/src/messaging/imap/IMAPTag.cpp b/src/messaging/imap/IMAPTag.cpp index bc6b656d..c1cf659d 100644 --- a/src/messaging/imap/IMAPTag.cpp +++ b/src/messaging/imap/IMAPTag.cpp @@ -36,7 +36,7 @@ IMAPTag::IMAPTag(const int number) IMAPTag::IMAPTag(const IMAPTag& tag) - : m_number(tag.m_number) + : object(), m_number(tag.m_number) { m_tag.resize(4); } diff --git a/src/messaging/maildir/maildirFolder.cpp b/src/messaging/maildir/maildirFolder.cpp index fa337d09..d24ab5e5 100644 --- a/src/messaging/maildir/maildirFolder.cpp +++ b/src/messaging/maildir/maildirFolder.cpp @@ -36,7 +36,7 @@ namespace messaging { namespace maildir { -maildirFolder::maildirFolder(const folder::path& path, maildirStore* store) +maildirFolder::maildirFolder(const folder::path& path, weak_ref <maildirStore> store) : m_store(store), m_path(path), m_name(path.isEmpty() ? folder::path::component("") : path.getLastComponent()), m_mode(-1), m_open(false), m_unreadMessageCount(0), m_messageCount(0) @@ -91,14 +91,14 @@ const int maildirFolder::getFlags() utility::fileSystemFactory* fsf = platformDependant::getHandler()->getFileSystemFactory(); - utility::auto_ptr <utility::file> rootDir = fsf->create + ref <utility::file> rootDir = fsf->create (maildirUtils::getFolderFSPath(m_store, m_path, maildirUtils::FOLDER_PATH_CONTAINER)); - utility::auto_ptr <utility::fileIterator> it = rootDir->getFiles(); + ref <utility::fileIterator> it = rootDir->getFiles(); while (it->hasMoreElements()) { - utility::auto_ptr <utility::file> file = it->nextElement(); + ref <utility::file> file = it->nextElement(); if (maildirUtils::isSubfolderDirectory(*file)) { @@ -204,14 +204,14 @@ void maildirFolder::create(const int /* type */) if (!fsf->isValidPath(maildirUtils::getFolderFSPath(m_store, m_path, maildirUtils::FOLDER_PATH_ROOT))) throw exceptions::invalid_folder_name(); - utility::auto_ptr <utility::file> rootDir = fsf->create + ref <utility::file> rootDir = fsf->create (maildirUtils::getFolderFSPath(m_store, m_path, maildirUtils::FOLDER_PATH_ROOT)); - utility::auto_ptr <utility::file> newDir = fsf->create + ref <utility::file> newDir = fsf->create (maildirUtils::getFolderFSPath(m_store, m_path, maildirUtils::FOLDER_PATH_NEW)); - utility::auto_ptr <utility::file> tmpDir = fsf->create + ref <utility::file> tmpDir = fsf->create (maildirUtils::getFolderFSPath(m_store, m_path, maildirUtils::FOLDER_PATH_TMP)); - utility::auto_ptr <utility::file> curDir = fsf->create + ref <utility::file> curDir = fsf->create (maildirUtils::getFolderFSPath(m_store, m_path, maildirUtils::FOLDER_PATH_CUR)); rootDir->createDirectory(true); @@ -226,7 +226,10 @@ void maildirFolder::create(const int /* type */) } // Notify folder created - events::folderEvent event(this, events::folderEvent::TYPE_CREATED, m_path, m_path); + events::folderEvent event + (thisRef().dynamicCast <folder>(), + events::folderEvent::TYPE_CREATED, m_path, m_path); + notifyFolder(event); } @@ -235,14 +238,14 @@ const bool maildirFolder::exists() { utility::fileSystemFactory* fsf = platformDependant::getHandler()->getFileSystemFactory(); - utility::auto_ptr <utility::file> rootDir = fsf->create + ref <utility::file> rootDir = fsf->create (maildirUtils::getFolderFSPath(m_store, m_path, maildirUtils::FOLDER_PATH_ROOT)); - utility::auto_ptr <utility::file> newDir = fsf->create + ref <utility::file> newDir = fsf->create (maildirUtils::getFolderFSPath(m_store, m_path, maildirUtils::FOLDER_PATH_NEW)); - utility::auto_ptr <utility::file> tmpDir = fsf->create + ref <utility::file> tmpDir = fsf->create (maildirUtils::getFolderFSPath(m_store, m_path, maildirUtils::FOLDER_PATH_TMP)); - utility::auto_ptr <utility::file> curDir = fsf->create + ref <utility::file> curDir = fsf->create (maildirUtils::getFolderFSPath(m_store, m_path, maildirUtils::FOLDER_PATH_CUR)); return (rootDir->exists() && rootDir->isDirectory() && @@ -269,40 +272,36 @@ void maildirFolder::scanFolder() utility::file::path newDirPath = maildirUtils::getFolderFSPath (m_store, m_path, maildirUtils::FOLDER_PATH_NEW); - utility::auto_ptr <utility::file> newDir = fsf->create(newDirPath); + ref <utility::file> newDir = fsf->create(newDirPath); utility::file::path curDirPath = maildirUtils::getFolderFSPath (m_store, m_path, maildirUtils::FOLDER_PATH_CUR); - utility::auto_ptr <utility::file> curDir = fsf->create(curDirPath); + ref <utility::file> curDir = fsf->create(curDirPath); // New received messages (new/) - utility::fileIterator* nit = newDir->getFiles(); + ref <utility::fileIterator> nit = newDir->getFiles(); std::vector <utility::file::path::component> newMessageFilenames; while (nit->hasMoreElements()) { - utility::auto_ptr <utility::file> file = nit->nextElement(); + ref <utility::file> file = nit->nextElement(); if (maildirUtils::isMessageFile(*file)) newMessageFilenames.push_back(file->getFullPath().getLastComponent()); } - delete (nit); // Free directory - // Current messages (cur/) - utility::fileIterator* cit = curDir->getFiles(); + ref <utility::fileIterator> cit = curDir->getFiles(); std::vector <utility::file::path::component> curMessageFilenames; while (cit->hasMoreElements()) { - utility::auto_ptr <utility::file> file = cit->nextElement(); + ref <utility::file> file = cit->nextElement(); if (maildirUtils::isMessageFile(*file)) curMessageFilenames.push_back(file->getFullPath().getLastComponent()); } - delete (cit); // Free directory - // Update/delete existing messages (found in previous scan) for (unsigned int i = 0 ; i < m_messageInfos.size() ; ++i) { @@ -347,7 +346,7 @@ void maildirFolder::scanFolder() maildirUtils::buildFilename(maildirUtils::extractId(*it), 0); // Move messages from 'new' to 'cur' - utility::auto_ptr <utility::file> file = fsf->create(newDirPath / *it); + ref <utility::file> file = fsf->create(newDirPath / *it); file->rename(curDirPath / newFilename); // Append to message list @@ -391,7 +390,7 @@ void maildirFolder::scanFolder() } -message* maildirFolder::getMessage(const int num) +ref <message> maildirFolder::getMessage(const int num) { if (!isOpen()) throw exceptions::illegal_state("Folder not open"); @@ -399,33 +398,40 @@ message* maildirFolder::getMessage(const int num) if (num < 1 || num > m_messageCount) throw exceptions::message_not_found(); - return new maildirMessage(this, num); + return vmime::create <maildirMessage> + (thisWeakRef().dynamicCast <maildirFolder>(), num); } -std::vector <message*> maildirFolder::getMessages(const int from, const int to) +std::vector <ref <message> > maildirFolder::getMessages(const int from, const int to) { if (!isOpen()) throw exceptions::illegal_state("Folder not open"); - std::vector <message*> v; + std::vector <ref <message> > v; for (int i = from ; i <= to ; ++i) - v.push_back(new maildirMessage(this, i)); + { + v.push_back(vmime::create <maildirMessage> + (thisWeakRef().dynamicCast <maildirFolder>(), i)); + } return (v); } -std::vector <message*> maildirFolder::getMessages(const std::vector <int>& nums) +std::vector <ref <message> > maildirFolder::getMessages(const std::vector <int>& nums) { if (!isOpen()) throw exceptions::illegal_state("Folder not open"); - std::vector <message*> v; + std::vector <ref <message> > v; for (std::vector <int>::const_iterator it = nums.begin() ; it != nums.end() ; ++it) - v.push_back(new maildirMessage(this, *it)); + { + v.push_back(vmime::create <maildirMessage> + (thisWeakRef().dynamicCast <maildirFolder>(), *it)); + } return (v); } @@ -437,68 +443,54 @@ const int maildirFolder::getMessageCount() } -folder* maildirFolder::getFolder(const folder::path::component& name) +ref <folder> maildirFolder::getFolder(const folder::path::component& name) { if (!m_store) throw exceptions::illegal_state("Store disconnected"); - return new maildirFolder(m_path / name, m_store); + return vmime::create <maildirFolder>(m_path / name, m_store); } -std::vector <folder*> maildirFolder::getFolders(const bool recursive) +std::vector <ref <folder> > maildirFolder::getFolders(const bool recursive) { if (!isOpen() && !m_store) throw exceptions::illegal_state("Store disconnected"); - std::vector <folder*> list; + std::vector <ref <folder> > list; - try - { - listFolders(list, recursive); - } - catch (std::exception&) - { - for (std::vector <folder*>::iterator it = list.begin() ; it != list.end() ; ++it) - delete (*it); - - throw; - } - catch (vmime::exception&) - { - for (std::vector <folder*>::iterator it = list.begin() ; it != list.end() ; ++it) - delete (*it); - - throw; - } + listFolders(list, recursive); return (list); } -void maildirFolder::listFolders(std::vector <folder*>& list, const bool recursive) +void maildirFolder::listFolders(std::vector <ref <folder> >& list, const bool recursive) { try { utility::fileSystemFactory* fsf = platformDependant::getHandler()->getFileSystemFactory(); - utility::auto_ptr <utility::file> rootDir = fsf->create + ref <utility::file> rootDir = fsf->create (maildirUtils::getFolderFSPath(m_store, m_path, m_path.isEmpty() ? maildirUtils::FOLDER_PATH_ROOT : maildirUtils::FOLDER_PATH_CONTAINER)); if (rootDir->exists()) { - utility::auto_ptr <utility::fileIterator> it = rootDir->getFiles(); + ref <utility::fileIterator> it = rootDir->getFiles(); while (it->hasMoreElements()) { - utility::auto_ptr <utility::file> file = it->nextElement(); + ref <utility::file> file = it->nextElement(); if (maildirUtils::isSubfolderDirectory(*file)) { - const utility::path subPath = m_path / file->getFullPath().getLastComponent(); - maildirFolder* subFolder = new maildirFolder(subPath, m_store); + const utility::path subPath = + m_path / file->getFullPath().getLastComponent(); + + ref <maildirFolder> subFolder = + vmime::create <maildirFolder>(subPath, m_store); list.push_back(subFolder); @@ -531,9 +523,9 @@ void maildirFolder::rename(const folder::path& newPath) // Rename the directory on the file system utility::fileSystemFactory* fsf = platformDependant::getHandler()->getFileSystemFactory(); - utility::auto_ptr <utility::file> rootDir = fsf->create + ref <utility::file> rootDir = fsf->create (maildirUtils::getFolderFSPath(m_store, m_path, maildirUtils::FOLDER_PATH_ROOT)); - utility::auto_ptr <utility::file> contDir = fsf->create + ref <utility::file> contDir = fsf->create (maildirUtils::getFolderFSPath(m_store, m_path, maildirUtils::FOLDER_PATH_CONTAINER)); try @@ -582,7 +574,10 @@ void maildirFolder::rename(const folder::path& newPath) m_path = newPath; m_name = newPath.getLastComponent(); - events::folderEvent event(this, events::folderEvent::TYPE_RENAMED, oldPath, newPath); + events::folderEvent event + (thisRef().dynamicCast <folder>(), + events::folderEvent::TYPE_RENAMED, oldPath, newPath); + notifyFolder(event); // Notify folders with the same path @@ -594,7 +589,10 @@ void maildirFolder::rename(const folder::path& newPath) (*it)->m_path = newPath; (*it)->m_name = newPath.getLastComponent(); - events::folderEvent event(*it, events::folderEvent::TYPE_RENAMED, oldPath, newPath); + events::folderEvent event + ((*it)->thisRef().dynamicCast <folder>(), + events::folderEvent::TYPE_RENAMED, oldPath, newPath); + (*it)->notifyFolder(event); } else if ((*it) != this && oldPath.isParentOf((*it)->getFullPath())) @@ -603,7 +601,10 @@ void maildirFolder::rename(const folder::path& newPath) (*it)->m_path.renameParent(oldPath, newPath); - events::folderEvent event(*it, events::folderEvent::TYPE_RENAMED, oldPath, (*it)->m_path); + events::folderEvent event + ((*it)->thisRef().dynamicCast <folder>(), + events::folderEvent::TYPE_RENAMED, oldPath, (*it)->m_path); + (*it)->notifyFolder(event); } } @@ -707,9 +708,13 @@ void maildirFolder::setMessageFlags } // Notify message flags changed - events::messageChangedEvent event(this, events::messageChangedEvent::TYPE_FLAGS, nums); + events::messageChangedEvent event + (thisRef().dynamicCast <folder>(), + events::messageChangedEvent::TYPE_FLAGS, nums); notifyMessageChanged(event); + + // TODO: notify other folders with the same path } @@ -784,9 +789,13 @@ void maildirFolder::setMessageFlags } // Notify message flags changed - events::messageChangedEvent event(this, events::messageChangedEvent::TYPE_FLAGS, nums); + events::messageChangedEvent event + (thisRef().dynamicCast <folder>(), + events::messageChangedEvent::TYPE_FLAGS, nums); notifyMessageChanged(event); + + // TODO: notify other folders with the same path } @@ -806,7 +815,7 @@ void maildirFolder::setMessageFlagsImpl try { const utility::file::path::component path = m_messageInfos[num].path; - utility::auto_ptr <utility::file> file = fsf->create(curDirPath / path); + ref <utility::file> file = fsf->create(curDirPath / path); int newFlags = maildirUtils::extractFlags(path); @@ -838,7 +847,7 @@ void maildirFolder::setMessageFlagsImpl } -void maildirFolder::addMessage(vmime::message* msg, const int flags, +void maildirFolder::addMessage(ref <vmime::message> msg, const int flags, vmime::datetime* date, utility::progressionListener* progress) { std::ostringstream oss; @@ -876,7 +885,7 @@ void maildirFolder::addMessage(utility::inputStream& is, const int size, try { - utility::auto_ptr <utility::file> tmpDir = fsf->create(tmpDirPath); + ref <utility::file> tmpDir = fsf->create(tmpDirPath); tmpDir->createDirectory(true); } catch (exceptions::filesystem_exception&) @@ -886,7 +895,7 @@ void maildirFolder::addMessage(utility::inputStream& is, const int size, try { - utility::auto_ptr <utility::file> curDir = fsf->create(curDirPath); + ref <utility::file> curDir = fsf->create(curDirPath); curDir->createDirectory(true); } catch (exceptions::filesystem_exception&) @@ -912,7 +921,9 @@ void maildirFolder::addMessage(utility::inputStream& is, const int size, std::vector <int> nums; nums.push_back(m_messageCount); - events::messageCountEvent event(this, events::messageCountEvent::TYPE_ADDED, nums); + events::messageCountEvent event + (thisRef().dynamicCast <folder>(), + events::messageCountEvent::TYPE_ADDED, nums); notifyMessageCount(event); @@ -928,7 +939,9 @@ void maildirFolder::addMessage(utility::inputStream& is, const int size, (*it)->m_messageInfos.resize(m_messageInfos.size()); std::copy(m_messageInfos.begin(), m_messageInfos.end(), (*it)->m_messageInfos.begin()); - events::messageCountEvent event(*it, events::messageCountEvent::TYPE_ADDED, nums); + events::messageCountEvent event + ((*it)->thisRef().dynamicCast <folder>(), + events::messageCountEvent::TYPE_ADDED, nums); (*it)->notifyMessageCount(event); } @@ -943,7 +956,7 @@ void maildirFolder::copyMessageImpl(const utility::file::path& tmpDirPath, { utility::fileSystemFactory* fsf = platformDependant::getHandler()->getFileSystemFactory(); - utility::auto_ptr <utility::file> file = fsf->create(tmpDirPath / filename); + ref <utility::file> file = fsf->create(tmpDirPath / filename); if (progress) progress->start(size); @@ -953,8 +966,8 @@ void maildirFolder::copyMessageImpl(const utility::file::path& tmpDirPath, { file->createFile(); - utility::auto_ptr <utility::fileWriter> fw = file->getFileWriter(); - utility::auto_ptr <utility::outputStream> os = fw->getOutputStream(); + ref <utility::fileWriter> fw = file->getFileWriter(); + ref <utility::outputStream> os = fw->getOutputStream(); utility::stream::value_type buffer[65536]; utility::stream::size_type total = 0; @@ -981,7 +994,7 @@ void maildirFolder::copyMessageImpl(const utility::file::path& tmpDirPath, // Delete temporary file try { - utility::auto_ptr <utility::file> file = fsf->create(tmpDirPath / filename); + ref <utility::file> file = fsf->create(tmpDirPath / filename); file->remove(); } catch (exceptions::filesystem_exception&) @@ -1005,7 +1018,7 @@ void maildirFolder::copyMessageImpl(const utility::file::path& tmpDirPath, // Delete temporary file try { - utility::auto_ptr <utility::file> file = fsf->create(tmpDirPath / filename); + ref <utility::file> file = fsf->create(tmpDirPath / filename); file->remove(); } catch (exceptions::filesystem_exception&) @@ -1083,7 +1096,7 @@ void maildirFolder::copyMessagesImpl(const folder::path& dest, const std::vector // Create destination directories try { - utility::auto_ptr <utility::file> destTmpDir = fsf->create(destTmpDirPath); + ref <utility::file> destTmpDir = fsf->create(destTmpDirPath); destTmpDir->createDirectory(true); } catch (exceptions::filesystem_exception&) @@ -1093,7 +1106,7 @@ void maildirFolder::copyMessagesImpl(const folder::path& dest, const std::vector try { - utility::auto_ptr <utility::file> destCurDir = fsf->create(destCurDirPath); + ref <utility::file> destCurDir = fsf->create(destCurDirPath); destCurDir->createDirectory(true); } catch (exceptions::filesystem_exception&) @@ -1114,9 +1127,9 @@ void maildirFolder::copyMessagesImpl(const folder::path& dest, const std::vector const utility::file::path::component filename = maildirUtils::buildFilename(maildirUtils::generateId(), flags); - utility::auto_ptr <utility::file> file = fsf->create(curDirPath / msg.path); - utility::auto_ptr <utility::fileReader> fr = file->getFileReader(); - utility::auto_ptr <utility::inputStream> is = fr->getInputStream(); + ref <utility::file> file = fsf->create(curDirPath / msg.path); + ref <utility::fileReader> fr = file->getFileReader(); + ref <utility::inputStream> is = fr->getInputStream(); copyMessageImpl(destTmpDirPath, destCurDirPath, filename, *is, file->getLength(), NULL); @@ -1168,7 +1181,9 @@ void maildirFolder::status(int& count, int& unseen) for (int i = oldCount + 1, j = 0 ; i <= count ; ++i, ++j) nums[j] = i; - events::messageCountEvent event(this, events::messageCountEvent::TYPE_ADDED, nums); + events::messageCountEvent event + (thisRef().dynamicCast <folder>(), + events::messageCountEvent::TYPE_ADDED, nums); notifyMessageCount(event); @@ -1184,7 +1199,9 @@ void maildirFolder::status(int& count, int& unseen) (*it)->m_messageInfos.resize(m_messageInfos.size()); std::copy(m_messageInfos.begin(), m_messageInfos.end(), (*it)->m_messageInfos.begin()); - events::messageCountEvent event(*it, events::messageCountEvent::TYPE_ADDED, nums); + events::messageCountEvent event + ((*it)->thisRef().dynamicCast <folder>(), + events::messageCountEvent::TYPE_ADDED, nums); (*it)->notifyMessageCount(event); } @@ -1233,7 +1250,7 @@ void maildirFolder::expunge() // Delete file from file system try { - utility::auto_ptr <utility::file> file = fsf->create(curDirPath / infos.path); + ref <utility::file> file = fsf->create(curDirPath / infos.path); file->remove(); } catch (exceptions::filesystem_exception& e) @@ -1253,7 +1270,9 @@ void maildirFolder::expunge() m_unreadMessageCount -= unreadCount; // Notify message expunged - events::messageCountEvent event(this, events::messageCountEvent::TYPE_REMOVED, nums); + events::messageCountEvent event + (thisRef().dynamicCast <folder>(), + events::messageCountEvent::TYPE_REMOVED, nums); notifyMessageCount(event); @@ -1269,7 +1288,9 @@ void maildirFolder::expunge() (*it)->m_messageInfos.resize(m_messageInfos.size()); std::copy(m_messageInfos.begin(), m_messageInfos.end(), (*it)->m_messageInfos.begin()); - events::messageCountEvent event(*it, events::messageCountEvent::TYPE_REMOVED, nums); + events::messageCountEvent event + ((*it)->thisRef().dynamicCast <folder>(), + events::messageCountEvent::TYPE_REMOVED, nums); (*it)->notifyMessageCount(event); } @@ -1277,25 +1298,28 @@ void maildirFolder::expunge() } -folder* maildirFolder::getParent() +ref <folder> maildirFolder::getParent() { - return (m_path.isEmpty() ? NULL : new maildirFolder(m_path.getParent(), m_store)); + if (m_path.isEmpty()) + return NULL; + else + return vmime::create <maildirFolder>(m_path.getParent(), m_store); } -const store* maildirFolder::getStore() const +weak_ref <const store> maildirFolder::getStore() const { return (m_store); } -store* maildirFolder::getStore() +weak_ref <store> maildirFolder::getStore() { return (m_store); } -void maildirFolder::fetchMessages(std::vector <message*>& msg, +void maildirFolder::fetchMessages(std::vector <ref <message> >& msg, const int options, utility::progressionListener* progress) { if (!m_store) @@ -1309,10 +1333,12 @@ void maildirFolder::fetchMessages(std::vector <message*>& msg, if (progress) progress->start(total); - for (std::vector <message*>::iterator it = msg.begin() ; + weak_ref <maildirFolder> _this = thisWeakRef().dynamicCast <maildirFolder>(); + + for (std::vector <ref <message> >::iterator it = msg.begin() ; it != msg.end() ; ++it) { - dynamic_cast <maildirMessage*>(*it)->fetch(this, options); + (*it).dynamicCast <maildirMessage>()->fetch(_this, options); if (progress) progress->progress(++current, total); @@ -1323,14 +1349,15 @@ void maildirFolder::fetchMessages(std::vector <message*>& msg, } -void maildirFolder::fetchMessage(message* msg, const int options) +void maildirFolder::fetchMessage(ref <message> msg, const int options) { if (!m_store) throw exceptions::illegal_state("Store disconnected"); else if (!isOpen()) throw exceptions::illegal_state("Folder not open"); - dynamic_cast <maildirMessage*>(msg)->fetch(this, options); + msg.dynamicCast <maildirMessage>()->fetch + (thisWeakRef().dynamicCast <maildirFolder>(), options); } @@ -1341,7 +1368,7 @@ const int maildirFolder::getFetchCapabilities() const } -const utility::file::path maildirFolder::getMessageFSPath(const int number) +const utility::file::path maildirFolder::getMessageFSPath(const int number) const { utility::file::path curDirPath = maildirUtils::getFolderFSPath (m_store, m_path, maildirUtils::FOLDER_PATH_CUR); diff --git a/src/messaging/maildir/maildirMessage.cpp b/src/messaging/maildir/maildirMessage.cpp index e9042979..408b27c8 100644 --- a/src/messaging/maildir/maildirMessage.cpp +++ b/src/messaging/maildir/maildirMessage.cpp @@ -20,6 +20,7 @@ #include "vmime/messaging/maildir/maildirMessage.hpp" #include "vmime/messaging/maildir/maildirFolder.hpp" #include "vmime/messaging/maildir/maildirUtils.hpp" +#include "vmime/messaging/maildir/maildirStore.hpp" #include "vmime/message.hpp" @@ -42,14 +43,14 @@ class maildirPart : public part { public: - maildirPart(maildirPart* parent, const int number, const bodyPart& part); + maildirPart(weak_ref <maildirPart> parent, const int number, const bodyPart& part); ~maildirPart(); const structure& getStructure() const; structure& getStructure(); - const maildirPart* getParent() const { return (m_parent); } + weak_ref <const maildirPart> getParent() const { return (m_parent); } const mediaType& getType() const { return (m_mediaType); } const int getSize() const { return (m_size); } @@ -68,7 +69,7 @@ public: if (m_header != NULL) return (*m_header); else - return (*(m_header = new header())); + return (*(m_header = vmime::create <header>())); } const int getHeaderParsedOffset() const { return (m_headerParsedOffset); } @@ -79,9 +80,9 @@ public: private: - maildirStructure* m_structure; - maildirPart* m_parent; - header* m_header; + ref <maildirStructure> m_structure; + weak_ref <maildirPart> m_parent; + ref <header> m_header; int m_number; int m_size; @@ -110,22 +111,17 @@ private: public: - maildirStructure(maildirPart* parent, const bodyPart& part) + maildirStructure(weak_ref <maildirPart> parent, const bodyPart& part) { - m_parts.push_back(new maildirPart(parent, 1, part)); + m_parts.push_back(vmime::create <maildirPart>(parent, 1, part)); } - maildirStructure(maildirPart* parent, const std::vector <const vmime::bodyPart*>& list) + maildirStructure(weak_ref <maildirPart> parent, const std::vector <ref <const vmime::bodyPart> >& list) { int number = 1; for (unsigned int i = 0 ; i < list.size() ; ++i) - m_parts.push_back(new maildirPart(parent, number, *list[i])); - } - - ~maildirStructure() - { - free_container(m_parts); + m_parts.push_back(vmime::create <maildirPart>(parent, number, *list[i])); } @@ -154,7 +150,7 @@ private: static maildirStructure m_emptyStructure; - std::vector <maildirPart*> m_parts; + std::vector <ref <maildirPart> > m_parts; }; @@ -162,13 +158,17 @@ maildirStructure maildirStructure::m_emptyStructure; -maildirPart::maildirPart(maildirPart* parent, const int number, const bodyPart& part) +maildirPart::maildirPart(weak_ref <maildirPart> parent, const int number, const bodyPart& part) : m_parent(parent), m_header(NULL), m_number(number) { if (part.getBody()->getPartList().size() == 0) m_structure = NULL; else - m_structure = new maildirStructure(this, part.getBody()->getPartList()); + { + m_structure = vmime::create <maildirStructure> + (thisWeakRef().dynamicCast <maildirPart>(), + part.getBody()->getPartList()); + } m_headerParsedOffset = part.getHeader()->getParsedOffset(); m_headerParsedLength = part.getHeader()->getParsedLength(); @@ -176,7 +176,7 @@ maildirPart::maildirPart(maildirPart* parent, const int number, const bodyPart& m_bodyParsedOffset = part.getBody()->getParsedOffset(); m_bodyParsedLength = part.getBody()->getParsedLength(); - m_size = part.getBody()->getContents().getLength(); + m_size = part.getBody()->getContents()->getLength(); m_mediaType = part.getBody()->getContentType(); } @@ -184,8 +184,6 @@ maildirPart::maildirPart(maildirPart* parent, const int number, const bodyPart& maildirPart::~maildirPart() { - delete (m_structure); - delete (m_header); } @@ -212,7 +210,7 @@ structure& maildirPart::getStructure() // maildirMessage // -maildirMessage::maildirMessage(maildirFolder* folder, const int num) +maildirMessage::maildirMessage(weak_ref <maildirFolder> folder, const int num) : m_folder(folder), m_num(num), m_size(-1), m_flags(FLAG_UNDEFINED), m_expunged(false), m_header(NULL), m_structure(NULL) { @@ -224,9 +222,6 @@ maildirMessage::~maildirMessage() { if (m_folder) m_folder->unregisterMessage(this); - - delete (m_header); - delete (m_structure); } @@ -334,10 +329,10 @@ void maildirMessage::extractImpl(utility::outputStream& os, utility::progression utility::fileSystemFactory* fsf = platformDependant::getHandler()->getFileSystemFactory(); const utility::file::path path = m_folder->getMessageFSPath(m_num); - utility::auto_ptr <utility::file> file = fsf->create(path); + ref <utility::file> file = fsf->create(path); - utility::auto_ptr <utility::fileReader> reader = file->getFileReader(); - utility::auto_ptr <utility::inputStream> is = reader->getInputStream(); + ref <utility::fileReader> reader = file->getFileReader(); + ref <utility::inputStream> is = reader->getInputStream(); is->skip(start + partialStart); @@ -379,10 +374,10 @@ void maildirMessage::fetchPartHeader(part& p) utility::fileSystemFactory* fsf = platformDependant::getHandler()->getFileSystemFactory(); const utility::file::path path = m_folder->getMessageFSPath(m_num); - utility::auto_ptr <utility::file> file = fsf->create(path); + ref <utility::file> file = fsf->create(path); - utility::auto_ptr <utility::fileReader> reader = file->getFileReader(); - utility::auto_ptr <utility::inputStream> is = reader->getInputStream(); + ref <utility::fileReader> reader = file->getFileReader(); + ref <utility::inputStream> is = reader->getInputStream(); is->skip(mp.getHeaderParsedOffset()); @@ -406,7 +401,7 @@ void maildirMessage::fetchPartHeader(part& p) } -void maildirMessage::fetch(maildirFolder* folder, const int options) +void maildirMessage::fetch(weak_ref <maildirFolder> folder, const int options) { if (m_folder != folder) throw exceptions::folder_not_found(); @@ -414,7 +409,7 @@ void maildirMessage::fetch(maildirFolder* folder, const int options) utility::fileSystemFactory* fsf = platformDependant::getHandler()->getFileSystemFactory(); const utility::file::path path = folder->getMessageFSPath(m_num); - utility::auto_ptr <utility::file> file = fsf->create(path); + ref <utility::file> file = fsf->create(path); if (options & folder::FETCH_FLAGS) m_flags = maildirUtils::extractFlags(path.getLastComponent()); @@ -430,8 +425,8 @@ void maildirMessage::fetch(maildirFolder* folder, const int options) { string contents; - utility::auto_ptr <utility::fileReader> reader = file->getFileReader(); - utility::auto_ptr <utility::inputStream> is = reader->getInputStream(); + ref <utility::fileReader> reader = file->getFileReader(); + ref <utility::inputStream> is = reader->getInputStream(); // Need whole message contents for structure if (options & folder::FETCH_STRUCTURE) @@ -480,10 +475,7 @@ void maildirMessage::fetch(maildirFolder* folder, const int options) // Extract structure if (options & folder::FETCH_STRUCTURE) { - if (m_structure) - delete (m_structure); - - m_structure = new maildirStructure(NULL, msg); + m_structure = vmime::create <maildirStructure>(null, msg); } // Extract some header fields or whole header @@ -502,7 +494,7 @@ header& maildirMessage::getOrCreateHeader() if (m_header != NULL) return (*m_header); else - return (*(m_header = new header())); + return (*(m_header = vmime::create <header>())); } diff --git a/src/messaging/maildir/maildirStore.cpp b/src/messaging/maildir/maildirStore.cpp index 87204299..ccbd35a4 100644 --- a/src/messaging/maildir/maildirStore.cpp +++ b/src/messaging/maildir/maildirStore.cpp @@ -39,7 +39,7 @@ namespace messaging { namespace maildir { -maildirStore::maildirStore(session* sess, authenticator* auth) +maildirStore::maildirStore(ref <session> sess, ref <authenticator> auth) : store(sess, getInfosInstance(), auth), m_connected(false) { } @@ -58,30 +58,33 @@ const string maildirStore::getProtocolName() const } -folder* maildirStore::getRootFolder() +ref <folder> maildirStore::getRootFolder() { if (!isConnected()) throw exceptions::illegal_state("Not connected"); - return new maildirFolder(folder::path(), this); + return vmime::create <maildirFolder>(folder::path(), + thisWeakRef().dynamicCast <maildirStore>()); } -folder* maildirStore::getDefaultFolder() +ref <folder> maildirStore::getDefaultFolder() { if (!isConnected()) throw exceptions::illegal_state("Not connected"); - return new maildirFolder(folder::path::component("inbox"), this); + return vmime::create <maildirFolder>(folder::path::component("inbox"), + thisWeakRef().dynamicCast <maildirStore>()); } -folder* maildirStore::getFolder(const folder::path& path) +ref <folder> maildirStore::getFolder(const folder::path& path) { if (!isConnected()) throw exceptions::illegal_state("Not connected"); - return new maildirFolder(path, this); + return vmime::create <maildirFolder>(path, + thisWeakRef().dynamicCast <maildirStore>()); } @@ -117,7 +120,7 @@ void maildirStore::connect() m_fsPath = fsf->stringToPath(GET_PROPERTY(string, PROPERTY_SERVER_ROOTPATH)); - utility::auto_ptr <utility::file> rootDir = fsf->create(m_fsPath); + ref <utility::file> rootDir = fsf->create(m_fsPath); // Try to create the root directory if it does not exist if (!(rootDir->exists() && rootDir->isDirectory())) diff --git a/src/messaging/maildir/maildirUtils.cpp b/src/messaging/maildir/maildirUtils.cpp index 091fd871..9e411cd6 100644 --- a/src/messaging/maildir/maildirUtils.cpp +++ b/src/messaging/maildir/maildirUtils.cpp @@ -34,7 +34,7 @@ const vmime::word maildirUtils::NEW_DIR("new", vmime::charset(vmime::charsets::U const utility::file::path maildirUtils::getFolderFSPath - (maildirStore* store, const utility::path& folderPath, const FolderFSPathMode mode) + (weak_ref <maildirStore> store, const utility::path& folderPath, const FolderFSPathMode mode) { // Root path utility::file::path path(store->getFileSystemPath()); diff --git a/src/messaging/pop3/POP3Folder.cpp b/src/messaging/pop3/POP3Folder.cpp index 6f4cb237..0f0a5369 100644 --- a/src/messaging/pop3/POP3Folder.cpp +++ b/src/messaging/pop3/POP3Folder.cpp @@ -191,7 +191,7 @@ const bool POP3Folder::isOpen() const } -message* POP3Folder::getMessage(const int num) +ref <message> POP3Folder::getMessage(const int num) { if (!m_store) throw exceptions::illegal_state("Store disconnected"); @@ -200,11 +200,11 @@ message* POP3Folder::getMessage(const int num) else if (num < 1 || num > m_messageCount) throw exceptions::message_not_found(); - return new POP3Message(this, num); + return vmime::create <POP3Message>(this, num); } -std::vector <message*> POP3Folder::getMessages(const int from, const int to) +std::vector <ref <message> > POP3Folder::getMessages(const int from, const int to) { if (!m_store) throw exceptions::illegal_state("Store disconnected"); @@ -213,40 +213,30 @@ std::vector <message*> POP3Folder::getMessages(const int from, const int to) else if (to < from || from < 1 || to < 1 || from > m_messageCount || to > m_messageCount) throw exceptions::message_not_found(); - std::vector <message*> v; + std::vector <ref <message> > v; for (int i = from ; i <= to ; ++i) - v.push_back(new POP3Message(this, i)); + v.push_back(vmime::create <POP3Message>(this, i)); return (v); } -std::vector <message*> POP3Folder::getMessages(const std::vector <int>& nums) +std::vector <ref <message> > POP3Folder::getMessages(const std::vector <int>& nums) { if (!m_store) throw exceptions::illegal_state("Store disconnected"); else if (!isOpen()) throw exceptions::illegal_state("Folder not open"); - std::vector <message*> v; + std::vector <ref <message> > v; - try + for (std::vector <int>::const_iterator it = nums.begin() ; it != nums.end() ; ++it) { - for (std::vector <int>::const_iterator it = nums.begin() ; it != nums.end() ; ++it) - { - if (*it < 1|| *it > m_messageCount) - throw exceptions::message_not_found(); + if (*it < 1|| *it > m_messageCount) + throw exceptions::message_not_found(); - v.push_back(new POP3Message(this, *it)); - } - } - catch (std::exception& e) - { - for (std::vector <message*>::iterator it = v.begin() ; it != v.end() ; ++it) - delete (*it); - - throw; + v.push_back(vmime::create <POP3Message>(this, *it)); } return (v); @@ -264,35 +254,35 @@ const int POP3Folder::getMessageCount() } -folder* POP3Folder::getFolder(const folder::path::component& name) +ref <folder> POP3Folder::getFolder(const folder::path::component& name) { if (!m_store) throw exceptions::illegal_state("Store disconnected"); - return new POP3Folder(m_path / name, m_store); + return vmime::create <POP3Folder>(m_path / name, m_store); } -std::vector <folder*> POP3Folder::getFolders(const bool /* recursive */) +std::vector <ref <folder> > POP3Folder::getFolders(const bool /* recursive */) { if (!m_store) throw exceptions::illegal_state("Store disconnected"); if (m_path.isEmpty()) { - std::vector <folder*> v; - v.push_back(new POP3Folder(folder::path::component("INBOX"), m_store)); + std::vector <ref <folder> > v; + v.push_back(vmime::create <POP3Folder>(folder::path::component("INBOX"), m_store)); return (v); } else { - std::vector <folder*> v; + std::vector <ref <folder> > v; return (v); } } -void POP3Folder::fetchMessages(std::vector <message*>& msg, const int options, +void POP3Folder::fetchMessages(std::vector <ref <message> >& msg, const int options, utility::progressionListener* progress) { if (!m_store) @@ -306,10 +296,10 @@ void POP3Folder::fetchMessages(std::vector <message*>& msg, const int options, if (progress) progress->start(total); - for (std::vector <message*>::iterator it = msg.begin() ; + for (std::vector <ref <message> >::iterator it = msg.begin() ; it != msg.end() ; ++it) { - dynamic_cast <POP3Message*>(*it)->fetch(this, options); + (*it).dynamicCast <POP3Message>()->fetch(this, options); if (progress) progress->progress(++current, total); @@ -339,10 +329,10 @@ void POP3Folder::fetchMessages(std::vector <message*>& msg, const int options, std::map <int, string> result; parseMultiListOrUidlResponse(response, result); - for (std::vector <message*>::iterator it = msg.begin() ; + for (std::vector <ref <message> >::iterator it = msg.begin() ; it != msg.end() ; ++it) { - POP3Message* m = dynamic_cast <POP3Message*>(*it); + ref <POP3Message> m = (*it).dynamicCast <POP3Message>(); std::map <int, string>::const_iterator x = result.find(m->m_num); @@ -384,10 +374,10 @@ void POP3Folder::fetchMessages(std::vector <message*>& msg, const int options, std::map <int, string> result; parseMultiListOrUidlResponse(response, result); - for (std::vector <message*>::iterator it = msg.begin() ; + for (std::vector <ref <message> >::iterator it = msg.begin() ; it != msg.end() ; ++it) { - POP3Message* m = dynamic_cast <POP3Message*>(*it); + ref <POP3Message> m = (*it).dynamicCast <POP3Message>(); std::map <int, string>::const_iterator x = result.find(m->m_num); @@ -402,14 +392,14 @@ void POP3Folder::fetchMessages(std::vector <message*>& msg, const int options, } -void POP3Folder::fetchMessage(message* msg, const int options) +void POP3Folder::fetchMessage(ref <message> msg, const int options) { if (!m_store) throw exceptions::illegal_state("Store disconnected"); else if (!isOpen()) throw exceptions::illegal_state("Folder not open"); - dynamic_cast <POP3Message*>(msg)->fetch(this, options); + msg.dynamicCast <POP3Message>()->fetch(this, options); if (options & FETCH_SIZE) { @@ -442,7 +432,7 @@ void POP3Folder::fetchMessage(message* msg, const int options) std::istringstream iss(string(it, response.end())); iss >> size; - dynamic_cast <POP3Message*>(msg)->m_size = size; + msg.dynamicCast <POP3Message>()->m_size = size; } } } @@ -473,7 +463,7 @@ void POP3Folder::fetchMessage(message* msg, const int options) if (it != response.end()) { - dynamic_cast <POP3Message*>(msg)->m_uid = + msg.dynamicCast <POP3Message>()->m_uid = string(it, response.end()); } } @@ -488,19 +478,22 @@ const int POP3Folder::getFetchCapabilities() const } -folder* POP3Folder::getParent() +ref <folder> POP3Folder::getParent() { - return (m_path.isEmpty() ? NULL : new POP3Folder(m_path.getParent(), m_store)); + if (m_path.isEmpty()) + return NULL; + else + return vmime::create <POP3Folder>(m_path.getParent(), m_store); } -const store* POP3Folder::getStore() const +weak_ref <const store> POP3Folder::getStore() const { return (m_store); } -store* POP3Folder::getStore() +weak_ref <store> POP3Folder::getStore() { return (m_store); } @@ -556,7 +549,9 @@ void POP3Folder::deleteMessage(const int num) std::vector <int> nums; nums.push_back(num); - events::messageChangedEvent event(this, events::messageChangedEvent::TYPE_FLAGS, nums); + events::messageChangedEvent event + (thisRef().dynamicCast <folder>(), + events::messageChangedEvent::TYPE_FLAGS, nums); notifyMessageChanged(event); } @@ -604,7 +599,9 @@ void POP3Folder::deleteMessages(const int from, const int to) for (int i = from ; i <= to2 ; ++i) nums.push_back(i); - events::messageChangedEvent event(this, events::messageChangedEvent::TYPE_FLAGS, nums); + events::messageChangedEvent event + (thisRef().dynamicCast <folder>(), + events::messageChangedEvent::TYPE_FLAGS, nums); notifyMessageChanged(event); } @@ -654,7 +651,9 @@ void POP3Folder::deleteMessages(const std::vector <int>& nums) } // Notify message flags changed - events::messageChangedEvent event(this, events::messageChangedEvent::TYPE_FLAGS, list); + events::messageChangedEvent event + (thisRef().dynamicCast <folder>(), + events::messageChangedEvent::TYPE_FLAGS, list); notifyMessageChanged(event); } @@ -680,7 +679,7 @@ void POP3Folder::rename(const folder::path& /* newPath */) } -void POP3Folder::addMessage(vmime::message* /* msg */, const int /* flags */, +void POP3Folder::addMessage(ref <vmime::message> /* msg */, const int /* flags */, vmime::datetime* /* date */, utility::progressionListener* /* progress */) { throw exceptions::operation_not_supported(); @@ -750,7 +749,9 @@ void POP3Folder::status(int& count, int& unseen) nums[j] = i; // Notify message count changed - events::messageCountEvent event(this, events::messageCountEvent::TYPE_ADDED, nums); + events::messageCountEvent event + (thisRef().dynamicCast <folder>(), + events::messageCountEvent::TYPE_ADDED, nums); notifyMessageCount(event); @@ -762,7 +763,9 @@ void POP3Folder::status(int& count, int& unseen) { (*it)->m_messageCount = count; - events::messageCountEvent event(*it, events::messageCountEvent::TYPE_ADDED, nums); + events::messageCountEvent event + ((*it)->thisRef().dynamicCast <folder>(), + events::messageCountEvent::TYPE_ADDED, nums); (*it)->notifyMessageCount(event); } diff --git a/src/messaging/pop3/POP3Store.cpp b/src/messaging/pop3/POP3Store.cpp index f1a4d45e..1407df35 100644 --- a/src/messaging/pop3/POP3Store.cpp +++ b/src/messaging/pop3/POP3Store.cpp @@ -41,7 +41,7 @@ namespace messaging { namespace pop3 { -POP3Store::POP3Store(session* sess, authenticator* auth) +POP3Store::POP3Store(ref <session> sess, ref <authenticator> auth) : store(sess, getInfosInstance(), auth), m_socket(NULL), m_authentified(false), m_timeoutHandler(NULL) { @@ -63,30 +63,30 @@ const string POP3Store::getProtocolName() const } -folder* POP3Store::getDefaultFolder() +ref <folder> POP3Store::getDefaultFolder() { if (!isConnected()) throw exceptions::illegal_state("Not connected"); - return new POP3Folder(folder::path(folder::path::component("INBOX")), this); + return vmime::create <POP3Folder>(folder::path(folder::path::component("INBOX")), this); } -folder* POP3Store::getRootFolder() +ref <folder> POP3Store::getRootFolder() { if (!isConnected()) throw exceptions::illegal_state("Not connected"); - return new POP3Folder(folder::path(), this); + return vmime::create <POP3Folder>(folder::path(), this); } -folder* POP3Store::getFolder(const folder::path& path) +ref <folder> POP3Store::getFolder(const folder::path& path) { if (!isConnected()) throw exceptions::illegal_state("Not connected"); - return new POP3Folder(path, this); + return vmime::create <POP3Folder>(path, this); } @@ -244,11 +244,8 @@ void POP3Store::internalDisconnect() sendRequest("QUIT"); m_socket->disconnect(); - - delete (m_socket); m_socket = NULL; - delete (m_timeoutHandler); m_timeoutHandler = NULL; m_authentified = false; diff --git a/src/messaging/sendmail/sendmailTransport.cpp b/src/messaging/sendmail/sendmailTransport.cpp index 969cb7ae..e9b8256b 100644 --- a/src/messaging/sendmail/sendmailTransport.cpp +++ b/src/messaging/sendmail/sendmailTransport.cpp @@ -46,7 +46,7 @@ namespace messaging { namespace sendmail { -sendmailTransport::sendmailTransport(session* sess, authenticator* auth) +sendmailTransport::sendmailTransport(ref <session> sess, ref <authenticator> auth) : transport(sess, getInfosInstance(), auth), m_connected(false) { } @@ -145,7 +145,7 @@ void sendmailTransport::internalSend const utility::file::path path = vmime::platformDependant::getHandler()-> getFileSystemFactory()->stringToPath(m_sendmailPath); - utility::auto_ptr <utility::childProcess> proc = + ref <utility::childProcess> proc = vmime::platformDependant::getHandler()-> getChildProcessFactory()->create(path); diff --git a/src/messaging/service.cpp b/src/messaging/service.cpp index c8872758..eab4db8a 100644 --- a/src/messaging/service.cpp +++ b/src/messaging/service.cpp @@ -26,39 +26,41 @@ namespace vmime { namespace messaging { -service::service(session* sess, const serviceInfos& infos, authenticator* auth) - : m_deleteAuth(auth == NULL), m_session(sess), m_auth(auth ? auth : - new defaultAuthenticator(sess->getProperties(), infos.getPropertyPrefix())) +service::service(ref <session> sess, const serviceInfos& infos, ref <authenticator> auth) + : m_session(sess), m_auth(auth) { + if (!auth) + { + m_auth = vmime::create <defaultAuthenticator> + (sess, infos.getPropertyPrefix()); + } } service::~service() { - if (m_deleteAuth) - delete (m_auth); } -const session* service::getSession() const +ref <const session> service::getSession() const { return (m_session); } -session* service::getSession() +ref <session> service::getSession() { return (m_session); } -const authenticator* service::getAuthenticator() const +ref <const authenticator> service::getAuthenticator() const { return (m_auth); } -authenticator* service::getAuthenticator() +ref <authenticator> service::getAuthenticator() { return (m_auth); } diff --git a/src/messaging/serviceFactory.cpp b/src/messaging/serviceFactory.cpp index ea1752dd..a706b0ba 100644 --- a/src/messaging/serviceFactory.cpp +++ b/src/messaging/serviceFactory.cpp @@ -37,11 +37,6 @@ serviceFactory::serviceFactory() serviceFactory::~serviceFactory() { - for (std::vector <registeredService*>::const_iterator it = m_services.begin() ; - it != m_services.end() ; ++it) - { - delete (*it); - } } @@ -52,17 +47,17 @@ serviceFactory* serviceFactory::getInstance() } -service* serviceFactory::create - (session* sess, const string& protocol, authenticator* auth) +ref <service> serviceFactory::create + (ref <session> sess, const string& protocol, ref <authenticator> auth) { return (getServiceByProtocol(protocol)->create(sess, auth)); } -service* serviceFactory::create - (session* sess, const utility::url& u, authenticator* auth) +ref <service> serviceFactory::create + (ref <session> sess, const utility::url& u, ref <authenticator> auth) { - service* serv = create(sess, u.getProtocol(), auth); + ref <service> serv = create(sess, u.getProtocol(), auth); sess->getProperties()[serv->getInfos().getPropertyPrefix() + "server.address"] = u.getHost(); @@ -84,11 +79,11 @@ service* serviceFactory::create } -const serviceFactory::registeredService* serviceFactory::getServiceByProtocol(const string& protocol) const +ref <const serviceFactory::registeredService> serviceFactory::getServiceByProtocol(const string& protocol) const { const string name(utility::stringUtils::toLower(protocol)); - for (std::vector <registeredService*>::const_iterator it = m_services.begin() ; + for (std::vector <ref <registeredService> >::const_iterator it = m_services.begin() ; it != m_services.end() ; ++it) { if ((*it)->getName() == name) @@ -105,17 +100,17 @@ const int serviceFactory::getServiceCount() const } -const serviceFactory::registeredService* serviceFactory::getServiceAt(const int pos) const +ref <const serviceFactory::registeredService> serviceFactory::getServiceAt(const int pos) const { return (m_services[pos]); } -const std::vector <const serviceFactory::registeredService*> serviceFactory::getServiceList() const +const std::vector <ref <const serviceFactory::registeredService> > serviceFactory::getServiceList() const { - std::vector <const registeredService*> res; + std::vector <ref <const registeredService> > res; - for (std::vector <registeredService*>::const_iterator it = m_services.begin() ; + for (std::vector <ref <registeredService> >::const_iterator it = m_services.begin() ; it != m_services.end() ; ++it) { res.push_back(*it); diff --git a/src/messaging/serviceInfos.cpp b/src/messaging/serviceInfos.cpp index 685ccf3e..a8359fd0 100644 --- a/src/messaging/serviceInfos.cpp +++ b/src/messaging/serviceInfos.cpp @@ -71,7 +71,7 @@ serviceInfos::~serviceInfos() } -const bool serviceInfos::hasProperty(session* s, const property& p) const +const bool serviceInfos::hasProperty(ref <session> s, const property& p) const { return s->getProperties().hasProperty(getPropertyPrefix() + p.getName()); } diff --git a/src/messaging/session.cpp b/src/messaging/session.cpp index 35c188a2..12aca36d 100644 --- a/src/messaging/session.cpp +++ b/src/messaging/session.cpp @@ -33,6 +33,12 @@ session::session() } +session::session(const session& sess) + : object(), m_props(sess.m_props) +{ +} + + session::session(const propertySet& props) : m_props(props) { @@ -44,71 +50,63 @@ session::~session() } -transport* session::getTransport(authenticator* auth) +ref <transport> session::getTransport(ref <authenticator> auth) { return (getTransport(m_props["transport.protocol"], auth)); } -transport* session::getTransport(const string& protocol, authenticator* auth) +ref <transport> session::getTransport(const string& protocol, ref <authenticator> auth) { - service* sv = serviceFactory::getInstance()->create(this, protocol, auth); + ref <session> sess = thisRef().dynamicCast <session>(); + ref <service> sv = serviceFactory::getInstance()->create(sess, protocol, auth); if (sv->getType() != service::TYPE_TRANSPORT) - { - delete (sv); throw exceptions::no_service_available(); - } - return static_cast<transport*>(sv); + return sv.staticCast <transport>(); } -transport* session::getTransport(const utility::url& url, authenticator* auth) +ref <transport> session::getTransport(const utility::url& url, ref <authenticator> auth) { - service* sv = serviceFactory::getInstance()->create(this, url, auth); + ref <session> sess = thisRef().dynamicCast <session>(); + ref <service> sv = serviceFactory::getInstance()->create(sess, url, auth); if (sv->getType() != service::TYPE_TRANSPORT) - { - delete (sv); throw exceptions::no_service_available(); - } - return static_cast<transport*>(sv); + return sv.staticCast <transport>(); } -store* session::getStore(authenticator* auth) +ref <store> session::getStore(ref <authenticator> auth) { return (getStore(m_props["store.protocol"], auth)); } -store* session::getStore(const string& protocol, authenticator* auth) +ref <store> session::getStore(const string& protocol, ref <authenticator> auth) { - service* sv = serviceFactory::getInstance()->create(this, protocol, auth); + ref <session> sess = thisRef().dynamicCast <session>(); + ref <service> sv = serviceFactory::getInstance()->create(sess, protocol, auth); if (sv->getType() != service::TYPE_STORE) - { - delete (sv); throw exceptions::no_service_available(); - } - return static_cast<store*>(sv); + return sv.staticCast <store>(); } -store* session::getStore(const utility::url& url, authenticator* auth) +ref <store> session::getStore(const utility::url& url, ref <authenticator> auth) { - service* sv = serviceFactory::getInstance()->create(this, url, auth); + ref <session> sess = thisRef().dynamicCast <session>(); + ref <service> sv = serviceFactory::getInstance()->create(sess, url, auth); if (sv->getType() != service::TYPE_STORE) - { - delete (sv); throw exceptions::no_service_available(); - } - return static_cast<store*>(sv); + return sv.staticCast <store>(); } diff --git a/src/messaging/smtp/SMTPTransport.cpp b/src/messaging/smtp/SMTPTransport.cpp index a32b0c95..5613a47d 100644 --- a/src/messaging/smtp/SMTPTransport.cpp +++ b/src/messaging/smtp/SMTPTransport.cpp @@ -41,7 +41,7 @@ namespace messaging { namespace smtp { -SMTPTransport::SMTPTransport(session* sess, authenticator* auth) +SMTPTransport::SMTPTransport(ref <session> sess, ref <authenticator> auth) : transport(sess, getInfosInstance(), auth), m_socket(NULL), m_authentified(false), m_extendedSMTP(false), m_timeoutHandler(NULL) { @@ -239,11 +239,8 @@ void SMTPTransport::internalDisconnect() sendRequest("QUIT"); m_socket->disconnect(); - - delete (m_socket); m_socket = NULL; - delete (m_timeoutHandler); m_timeoutHandler = NULL; m_authentified = false; diff --git a/src/messaging/transport.cpp b/src/messaging/transport.cpp index 0b52aa39..59a2871c 100644 --- a/src/messaging/transport.cpp +++ b/src/messaging/transport.cpp @@ -28,7 +28,7 @@ namespace vmime { namespace messaging { -transport::transport(session* sess, const serviceInfos& infos, authenticator* auth) +transport::transport(ref <session> sess, const serviceInfos& infos, ref <authenticator> auth) : service(sess, infos, auth) { } @@ -39,7 +39,7 @@ static void extractMailboxes { for (int i = 0 ; i < list.getAddressCount() ; ++i) { - mailbox* mbox = dynamic_cast <mailbox*>(list.getAddressAt(i)->clone()); + ref <mailbox> mbox = list.getAddressAt(i)->clone().dynamicCast <mailbox>(); if (mbox != NULL) recipients.appendMailbox(mbox); @@ -47,7 +47,7 @@ static void extractMailboxes } -void transport::send(vmime::message* msg, utility::progressionListener* progress) +void transport::send(ref <vmime::message> msg, utility::progressionListener* progress) { // Extract expeditor mailbox expeditor; |