summaryrefslogtreecommitdiffstats
path: root/maildir/maildirkeywords4.cpp
diff options
context:
space:
mode:
authorSam Varshavchik2013-08-19 16:39:41 -0400
committerSam Varshavchik2013-08-25 14:43:51 -0400
commit9c45d9ad13fdf439d44d7443ae75da15ea0223ed (patch)
tree7a81a04cb51efb078ee350859a64be2ebc6b8813 /maildir/maildirkeywords4.cpp
parenta9520698b770168d1f33d6301463bb70a19655ec (diff)
downloadcourier-libs-9c45d9ad13fdf439d44d7443ae75da15ea0223ed.tar.bz2
Initial checkin
Imported from subversion report, converted to git. Updated all paths in scripts and makefiles, reflecting the new directory hierarchy.
Diffstat (limited to 'maildir/maildirkeywords4.cpp')
-rw-r--r--maildir/maildirkeywords4.cpp181
1 files changed, 181 insertions, 0 deletions
diff --git a/maildir/maildirkeywords4.cpp b/maildir/maildirkeywords4.cpp
new file mode 100644
index 0000000..c3a59c3
--- /dev/null
+++ b/maildir/maildirkeywords4.cpp
@@ -0,0 +1,181 @@
+/*
+** Copyright 2003 Double Precision, Inc.
+** See COPYING for distribution information.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include "maildirkeywords.h"
+#include <iostream>
+#include <stdlib.h>
+#include <errno.h>
+#include <stdio.h>
+
+#include <vector>
+
+using namespace std;
+
+mail::keywords::Hashtable::Hashtable()
+{
+ libmail_kwhInit(&kwh);
+}
+
+mail::keywords::Hashtable::~Hashtable()
+{
+ if (libmail_kwhCheck(&kwh))
+ {
+ cerr << "INTERNAL ERROR: "
+ "mail::keywords::Hashtable::~Hashtable: "
+ "dangling references remain." << endl;
+
+ abort();
+ }
+}
+
+mail::keywords::MessageBase::MessageBase()
+ : km(NULL), refCnt(0)
+{
+}
+
+mail::keywords::MessageBase::~MessageBase()
+{
+ if (km)
+ libmail_kwmDestroy(km);
+}
+
+mail::keywords::Message::Message()
+ : b(new MessageBase)
+{
+ if (!b)
+ throw strerror(errno);
+
+ ++b->refCnt;
+}
+
+mail::keywords::Message::~Message()
+{
+ if (b && --b->refCnt == 0)
+ delete b;
+}
+
+mail::keywords::Message::Message(const mail::keywords::Message &m)
+ : b(m.b)
+{
+ ++b->refCnt;
+}
+
+mail::keywords::Message &
+mail::keywords::Message::operator=(const mail::keywords::Message &m)
+{
+ ++m.b->refCnt;
+
+ if (--b->refCnt == 0)
+ delete b;
+
+ b=m.b;
+ return *this;
+}
+
+void mail::keywords::Message::getFlags(std::set<std::string> &kwSet) const
+{
+ kwSet.clear();
+ if (!b->km)
+ return;
+
+ struct libmail_kwMessageEntry *e;
+
+ for (e= b->km->firstEntry; e; e=e->next)
+ kwSet.insert(keywordName(e->libmail_keywordEntryPtr));
+}
+
+bool mail::keywords::Message::copyOnWrite()
+{
+ if (b->refCnt > 1) // Sharing a copy? We want our own.
+ {
+ MessageBase *nb=new MessageBase;
+
+ if (!nb)
+ return false;
+
+ --b->refCnt;
+ b=nb;
+ ++b->refCnt;
+ }
+ return true;
+}
+
+bool mail::keywords::Message::setFlags(mail::keywords::Hashtable &h,
+ const std::set<std::string> &kwSet)
+{
+ if (!copyOnWrite())
+ return false;
+
+ if (b->km)
+ libmail_kwmDestroy(b->km);
+ b->km=NULL;
+
+ if (kwSet.empty())
+ {
+ return true;
+ }
+
+ if ((b->km=libmail_kwmCreate()) == NULL)
+ return false;
+
+ set<string>::const_iterator kb=kwSet.begin(), ke=kwSet.end();
+
+ while (kb != ke)
+ {
+ if (libmail_kwmSetName(&h.kwh, b->km, kb->c_str()))
+ return false;
+
+ ++kb;
+ }
+ return true;
+}
+
+bool mail::keywords::Message::addFlag(Hashtable &h, string flagName)
+{
+ if (!copyOnWrite())
+ return false;
+
+ if (!b->km)
+ if ((b->km=libmail_kwmCreate()) == NULL)
+ return false;
+
+ if (libmail_kwmSetName(&h.kwh, b->km, flagName.c_str()))
+ return false;
+ return true;
+}
+
+bool mail::keywords::Message::remFlag(std::string s)
+{
+ if (!copyOnWrite())
+ return false;
+ if (b->km)
+ libmail_kwmClearName(b->km, s.c_str());
+ return true;
+}
+
+int maildir_kwSave(const char *maildir,
+ const char *filename,
+ set<string> keywords,
+
+ char **tmpname,
+ char **newname,
+
+ int tryAtomic)
+{
+ vector<const char *> keywordArray;
+ set<string>::iterator b, e;
+
+ keywordArray.reserve(keywords.size()+1);
+
+ for (b=keywords.begin(), e=keywords.end(); b != e; ++b)
+ keywordArray.push_back(b->c_str());
+
+ keywordArray.push_back((const char *)NULL);
+ return maildir_kwSaveArray(maildir, filename, &keywordArray[0],
+ tmpname, newname, tryAtomic);
+}