aboutsummaryrefslogtreecommitdiffstats
path: root/src/net/maildir
diff options
context:
space:
mode:
authorVincent Richard <[email protected]>2006-04-23 10:48:19 +0200
committerVincent Richard <[email protected]>2006-04-23 10:48:19 +0200
commit6933fb8a30cf17ae90394fca5114b8e600ef2cfd (patch)
tree7f35e7226f7179993eb0a7cbdb9953a4fa19fa26 /src/net/maildir
parentRenamed 'byte' to 'byte_t'. (diff)
downloadvmime-6933fb8a30cf17ae90394fca5114b8e600ef2cfd.tar.gz
vmime-6933fb8a30cf17ae90394fca5114b8e600ef2cfd.zip
Folder deletion.
Diffstat (limited to 'src/net/maildir')
-rw-r--r--src/net/maildir/maildirFolder.cpp36
-rw-r--r--src/net/maildir/maildirUtils.cpp41
2 files changed, 77 insertions, 0 deletions
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