summaryrefslogtreecommitdiff
path: root/src/maildir-expunge.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/maildir-expunge.cc')
-rw-r--r--src/maildir-expunge.cc61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/maildir-expunge.cc b/src/maildir-expunge.cc
new file mode 100644
index 0000000..3091d7f
--- /dev/null
+++ b/src/maildir-expunge.cc
@@ -0,0 +1,61 @@
+/** --------------------------------------------------------------------
+ * @file maildir-expunge.cc
+ * @brief Implementation of the Maildir class.
+ * @author Andreas Aardal Hanssen
+ * @date 2002-2005
+ * ----------------------------------------------------------------- **/
+#include <unistd.h>
+#include <errno.h>
+
+#include "iodevice.h"
+#include "iofactory.h"
+#include "maildir.h"
+#include "maildirmessage.h"
+
+using namespace ::std;
+using namespace Binc;
+
+//------------------------------------------------------------------------
+void Maildir::expungeMailbox(void)
+{
+ if (readOnly) return;
+
+ Mailbox::iterator i = begin(SequenceSet::all(), SQNR_MODE|INCLUDE_EXPUNGED);
+
+ bool success = true;
+ for (; success && i != end(); ++i) {
+ MaildirMessage &message = reinterpret_cast<MaildirMessage &>(*i);
+
+ if ((message.getStdFlags() & Message::F_DELETED) == 0)
+ continue;
+
+ message.setExpunged();
+
+ const string &id = message.getUnique();
+
+ // The message might be gone already
+ MaildirIndexItem *item = index.find(id);
+ if (!item)
+ continue;
+
+ string fpath = path + "/cur/" + item->fileName;
+
+ while (unlink(fpath.c_str()) != 0) {
+ if (errno != ENOENT) {
+ bincWarning << "unable to remove " << fpath << ": "
+ << strerror(errno) << endl;
+ break;
+ }
+
+ if (!scanFileNames()) {
+ success = false;
+ break;
+ }
+
+ if ((item = index.find(id)))
+ break;
+ else
+ fpath = path + "/cur/" + item->fileName;
+ }
+ }
+}