aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/net/imap/IMAPFolder.cpp37
-rw-r--r--src/net/maildir/maildirFolder.cpp36
-rw-r--r--src/net/maildir/maildirUtils.cpp41
-rw-r--r--src/net/pop3/POP3Folder.cpp6
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();