summaryrefslogtreecommitdiffstats
path: root/libmail/addressbook.C
diff options
context:
space:
mode:
Diffstat (limited to 'libmail/addressbook.C')
-rw-r--r--libmail/addressbook.C296
1 files changed, 296 insertions, 0 deletions
diff --git a/libmail/addressbook.C b/libmail/addressbook.C
new file mode 100644
index 0000000..ca62ffc
--- /dev/null
+++ b/libmail/addressbook.C
@@ -0,0 +1,296 @@
+/*
+** Copyright 2002-2011, Double Precision Inc.
+**
+** See COPYING for distribution information.
+*/
+#include "libmail_config.h"
+#include <cstring>
+
+#include "addressbook.H"
+#include "addressbookadd.H"
+#include "addressbookget.H"
+#include "addressbookopen.H"
+#include "addressbooksearch.H"
+#include "rfc2047decode.H"
+#include "misc.H"
+#include <errno.h>
+
+using namespace std;
+
+mail::addressbook::Entry::Entry()
+{
+}
+
+mail::addressbook::Entry::~Entry()
+{
+}
+
+mail::addressbook::addressbook(mail::account *serverArg,
+ mail::folder *folderArg)
+ : server(serverArg),
+ folder(folderArg)
+{
+}
+
+mail::addressbook::~addressbook()
+{
+}
+
+void mail::addressbook::addEntry(Entry &newEntry, string olduid,
+ mail::callback &callback)
+{
+ vector<Index>::iterator b=index.begin(), e=index.end();
+
+ while (b != e)
+ {
+ Index &i= *b++;
+
+ if (olduid.size() > 0 && i.uid == olduid)
+ continue;
+
+ if (newEntry.nickname == i.nickname)
+ {
+ callback.fail("Address book entry with the same name already exists.");
+ return;
+ }
+ }
+
+ Add *add=new Add(this, newEntry, olduid, callback);
+
+ try {
+ add->go();
+ } catch (...) {
+ delete add;
+ }
+}
+
+void mail::addressbook::importEntries(std::list<Entry> &newEntries,
+ mail::callback &callback)
+{
+ Add *add=new Add(this, newEntries, callback);
+
+ try {
+ add->go();
+ } catch (...) {
+ delete add;
+ }
+}
+
+// Delete an address book entry.
+
+void mail::addressbook::del(std::string uid, mail::callback &callback)
+{
+ vector<Index>::iterator b=index.begin(), e=index.end();
+
+ while (b != e)
+ {
+ if (b->uid == uid)
+ {
+ vector<size_t> msgList;
+
+ msgList.push_back(b - index.begin());
+
+ server->removeMessages(msgList, callback);
+ return;
+ }
+
+ b++;
+ }
+
+ callback.success("OK");
+}
+
+void mail::addressbook::open(mail::callback &callback)
+{
+ Open *o=new Open(this, callback);
+
+ try {
+ o->go();
+ } catch (...) {
+ delete o;
+ }
+}
+
+mail::addressbook::Index::Index() : nickname("(corrupted entry)")
+{
+}
+
+mail::addressbook::Index::~Index()
+{
+}
+
+void mail::addressbook::setIndex(size_t messageNumber,
+ string subject)
+{
+ subject= mail::rfc2047::decoder().decode(subject, "utf-8");
+
+ if (messageNumber < index.size())
+ {
+ Index newEntry;
+
+ size_t i=subject.find('[');
+
+ if (i != std::string::npos)
+ {
+ subject=subject.substr(i+1);
+
+ i=subject.find(']');
+
+ if (i != std::string::npos)
+ {
+ newEntry.nickname=subject.substr(0, i);
+ if (newEntry.nickname.size() == 0)
+ newEntry.nickname="(none)";
+
+ char *p=libmail_u_convert_tobuf(newEntry
+ .nickname
+ .c_str(),
+ "utf-8",
+ unicode_default_chset(),
+ NULL);
+
+ if (!p)
+ LIBMAIL_THROW(strerror(errno));
+
+ try {
+ newEntry.nickname=p;
+ free(p);
+ } catch (...) {
+ free(p);
+ LIBMAIL_THROW(LIBMAIL_THROW_EMPTY);
+ }
+ }
+ }
+
+ newEntry.uid=server->getFolderIndexInfo(messageNumber).uid;
+ index[messageNumber]=newEntry;
+ }
+}
+
+void mail::addressbook::newMessages()
+{
+}
+
+void mail::addressbook::messagesRemoved(vector< pair<size_t, size_t> > &r)
+{
+ vector< pair<size_t, size_t> >::iterator b=r.begin(), e=r.end();
+
+ while (b != e)
+ {
+ --e;
+
+ size_t from=e->first, to=e->second;
+
+ if (from >= index.size())
+ continue;
+
+ if (to > index.size())
+ to=index.size();
+
+ index.erase(index.begin() + from, index.begin() + to + 1);
+ }
+}
+
+void mail::addressbook::messageChanged(size_t n)
+{
+}
+
+void mail::addressbook::getIndex( list< pair<string, std::string> > &listArg,
+ mail::callback &callback)
+{
+ size_t n=index.size();
+ size_t i;
+
+ for (i=0; i<n; i++)
+ {
+ string nickname=index[i].nickname;
+ string uid=index[i].uid;
+
+ if (nickname.size() > 0 && uid.size() > 0)
+ listArg.push_back( make_pair(nickname, uid));
+ }
+
+ callback.success("Address book index retrieved");
+}
+
+template<class T>
+void mail::addressbook::searchNickname( string nickname,
+ vector<T> &addrListArg,
+ mail::callback &callback)
+{
+ Search<T> *s=new Search<T>(this, addrListArg, callback);
+
+ if (!s)
+ {
+ callback.fail(strerror(errno));
+ return;
+ }
+
+ try {
+ size_t n=index.size();
+ size_t i;
+
+ for (i=0; i<n; i++)
+ if (index[i].nickname == nickname)
+ s->uidList.push_back(server->
+ getFolderIndexInfo(i)
+ .uid);
+ s->go();
+ } catch (...) {
+ delete s;
+ LIBMAIL_THROW(LIBMAIL_THROW_EMPTY);
+ }
+}
+
+template
+void mail::addressbook::searchNickname( string nickname,
+ vector<mail::address> &addrListArg,
+ mail::callback &callback);
+template
+void mail::addressbook::searchNickname( string nickname,
+ vector<mail::emailAddress> &addrListArg,
+ mail::callback &callback);
+
+template<class T>
+void mail::addressbook::getEntry( string uid,
+ vector<T> &addrListArg,
+ mail::callback &callback)
+{
+ size_t n=index.size();
+ size_t i;
+
+ for (i=0; i<n; i++)
+ if (server->getFolderIndexInfo(i).uid == uid)
+ {
+ GetAddressList<T> *get=
+ new GetAddressList<T>(this, i,
+ addrListArg,
+ callback);
+
+ if (!get)
+ {
+ callback.fail(strerror(errno));
+ return;
+ }
+
+ try {
+ get->go();
+ } catch (...) {
+ delete get;
+ LIBMAIL_THROW(LIBMAIL_THROW_EMPTY);
+ }
+ return;
+ }
+
+ callback.success("NOT FOUND.");
+}
+
+template
+void mail::addressbook::getEntry( string uid,
+ vector<mail::address> &addrListArg,
+ mail::callback &callback);
+template
+void mail::addressbook::getEntry( string uid,
+ vector<mail::emailAddress>
+ &addrListArg,
+ mail::callback &callback);