diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/net/imap/IMAPFolder.cpp | 37 | ||||
| -rw-r--r-- | src/net/maildir/maildirFolder.cpp | 36 | ||||
| -rw-r--r-- | src/net/maildir/maildirUtils.cpp | 41 | ||||
| -rw-r--r-- | src/net/pop3/POP3Folder.cpp | 6 |
4 files changed, 120 insertions, 0 deletions
diff --git a/src/net/imap/IMAPFolder.cpp b/src/net/imap/IMAPFolder.cpp index 0179620b..09d33b68 100644 --- a/src/net/imap/IMAPFolder.cpp +++ b/src/net/imap/IMAPFolder.cpp @@ -371,6 +371,43 @@ void IMAPFolder::create(const int type) } +void IMAPFolder::destroy() +{ + ref <IMAPStore> store = m_store.acquire(); + + if (!store) + throw exceptions::illegal_state("Store disconnected"); + + if (isOpen()) + throw exceptions::illegal_state("Folder is open"); + + const string mailbox = IMAPUtils::pathToString + (m_connection->hierarchySeparator(), getFullPath()); + + std::ostringstream oss; + oss << "DELETE " << IMAPUtils::quoteString(mailbox); + + m_connection->send(true, oss.str(), true); + + + utility::auto_ptr <IMAPParser::response> resp(m_connection->readResponse()); + + if (resp->isBad() || resp->response_done()->response_tagged()-> + resp_cond_state()->status() != IMAPParser::resp_cond_state::OK) + { + throw exceptions::command_error("DELETE", + m_connection->getParser()->lastLine(), "bad response"); + } + + // Notify folder deleted + events::folderEvent event + (thisRef().dynamicCast <folder>(), + events::folderEvent::TYPE_DELETED, m_path, m_path); + + notifyFolder(event); +} + + const bool IMAPFolder::exists() { ref <IMAPStore> store = m_store.acquire(); diff --git a/src/net/maildir/maildirFolder.cpp b/src/net/maildir/maildirFolder.cpp index 7e596382..dc89f131 100644 --- a/src/net/maildir/maildirFolder.cpp +++ b/src/net/maildir/maildirFolder.cpp @@ -242,6 +242,42 @@ void maildirFolder::create(const int /* type */) } +void maildirFolder::destroy() +{ + ref <maildirStore> store = m_store.acquire(); + + if (!store) + throw exceptions::illegal_state("Store disconnected"); + else if (isOpen()) + throw exceptions::illegal_state("Folder is open"); + + // Delete 'folder' and '.folder.directory' directories + utility::fileSystemFactory* fsf = platformDependant::getHandler()->getFileSystemFactory(); + + ref <utility::file> rootDir = fsf->create + (maildirUtils::getFolderFSPath(store, m_path, maildirUtils::FOLDER_PATH_ROOT)); + ref <utility::file> contDir = fsf->create + (maildirUtils::getFolderFSPath(store, m_path, maildirUtils::FOLDER_PATH_CONTAINER)); + + try + { + maildirUtils::recursiveFSDelete(rootDir); + maildirUtils::recursiveFSDelete(contDir); + } + catch (std::exception&) + { + // Ignore exception: anyway, we can't recover from this... + } + + // Notify folder deleted + events::folderEvent event + (thisRef().dynamicCast <folder>(), + events::folderEvent::TYPE_DELETED, m_path, m_path); + + notifyFolder(event); +} + + const bool maildirFolder::exists() { ref <maildirStore> store = m_store.acquire(); diff --git a/src/net/maildir/maildirUtils.cpp b/src/net/maildir/maildirUtils.cpp index c0594a31..00a9a7b1 100644 --- a/src/net/maildir/maildirUtils.cpp +++ b/src/net/maildir/maildirUtils.cpp @@ -22,6 +22,9 @@ #include "vmime/utility/random.hpp" +#include "vmime/exception.hpp" +#include "vmime/platformDependant.hpp" + namespace vmime { namespace net { @@ -212,6 +215,44 @@ const utility::file::path::component maildirUtils::generateId() } +void maildirUtils::recursiveFSDelete(ref <utility::file> dir) +{ + ref <utility::fileIterator> files = dir->getFiles(); + + // First, delete files and subdirectories in this directory + while (files->hasMoreElements()) + { + ref <utility::file> file = files->nextElement(); + + if (file->isDirectory()) + { + maildirUtils::recursiveFSDelete(file); + } + else + { + try + { + file->remove(); + } + catch (exceptions::filesystem_exception&) + { + // Ignore + } + } + } + + // Then, delete this (empty) directory + try + { + dir->remove(); + } + catch (exceptions::filesystem_exception&) + { + // Ignore + } +} + + // // messageIdComparator diff --git a/src/net/pop3/POP3Folder.cpp b/src/net/pop3/POP3Folder.cpp index 657e1bdd..7ef4aa12 100644 --- a/src/net/pop3/POP3Folder.cpp +++ b/src/net/pop3/POP3Folder.cpp @@ -184,6 +184,12 @@ void POP3Folder::create(const int /* type */) } +void POP3Folder::destroy() +{ + throw exceptions::operation_not_supported(); +} + + const bool POP3Folder::exists() { ref <POP3Store> store = m_store.acquire(); |
