diff options
Diffstat (limited to 'src/messaging/maildir')
-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 |
4 files changed, 169 insertions, 147 deletions
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()); |