aboutsummaryrefslogtreecommitdiffstats
path: root/src/messaging
diff options
context:
space:
mode:
Diffstat (limited to 'src/messaging')
-rw-r--r--src/messaging/authenticationInfos.cpp2
-rw-r--r--src/messaging/defaultAuthenticator.cpp8
-rw-r--r--src/messaging/events.cpp13
-rw-r--r--src/messaging/imap/IMAPConnection.cpp27
-rw-r--r--src/messaging/imap/IMAPFolder.cpp196
-rw-r--r--src/messaging/imap/IMAPMessage.cpp83
-rw-r--r--src/messaging/imap/IMAPStore.cpp35
-rw-r--r--src/messaging/imap/IMAPTag.cpp2
-rw-r--r--src/messaging/maildir/maildirFolder.cpp223
-rw-r--r--src/messaging/maildir/maildirMessage.cpp72
-rw-r--r--src/messaging/maildir/maildirStore.cpp19
-rw-r--r--src/messaging/maildir/maildirUtils.cpp2
-rw-r--r--src/messaging/pop3/POP3Folder.cpp99
-rw-r--r--src/messaging/pop3/POP3Store.cpp17
-rw-r--r--src/messaging/sendmail/sendmailTransport.cpp4
-rw-r--r--src/messaging/service.cpp20
-rw-r--r--src/messaging/serviceFactory.cpp27
-rw-r--r--src/messaging/serviceInfos.cpp2
-rw-r--r--src/messaging/session.cpp50
-rw-r--r--src/messaging/smtp/SMTPTransport.cpp5
-rw-r--r--src/messaging/transport.cpp6
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;