summaryrefslogtreecommitdiffstats
path: root/libmail/smapmsgrange.C
diff options
context:
space:
mode:
Diffstat (limited to 'libmail/smapmsgrange.C')
-rw-r--r--libmail/smapmsgrange.C140
1 files changed, 140 insertions, 0 deletions
diff --git a/libmail/smapmsgrange.C b/libmail/smapmsgrange.C
new file mode 100644
index 0000000..4417341
--- /dev/null
+++ b/libmail/smapmsgrange.C
@@ -0,0 +1,140 @@
+/*
+** Copyright 2003, Double Precision Inc.
+**
+** See COPYING for distribution information.
+*/
+#include "smapmsgrange.H"
+#include "imap.H"
+
+mail::smapUidSet::smapUidSet( mail::imap &imapAccount,
+ const std::vector<size_t> &v)
+{
+ if (imapAccount.currentFolder == NULL)
+ return;
+
+ std::vector<size_t>::const_iterator b=v.begin(), e=v.end();
+
+ while (b != e)
+ {
+ size_t n= *b++;
+
+ if (n >= imapAccount.currentFolder->exists)
+ continue;
+
+ insert(imapAccount.currentFolder->index[n].uid);
+ }
+}
+
+mail::smapUidSet::~smapUidSet()
+{
+}
+
+bool mail::smapUidSet::getNextRange( mail::imap &imapAccount,
+ std::ostringstream &s)
+{
+ size_t i;
+ size_t n=imapAccount.currentFolder ?
+ imapAccount.currentFolder->exists:0;
+
+ std::list< std::pair<size_t, size_t> > rangeList;
+ size_t rangeCount=0;
+
+ for (i=0; i<n; i++)
+ {
+ std::set< std::string>::iterator pp=
+ find(imapAccount.currentFolder->index[i].uid);
+
+ if (pp == end())
+ continue;
+
+ if (!rangeList.empty())
+ {
+ std::list< std::pair<size_t, size_t> >::iterator
+ p= --rangeList.end();
+
+ if (p->second + 1 == i)
+ {
+ ++p->second;
+ erase(pp);
+ continue;
+ }
+ }
+
+ if (++rangeCount > 100)
+ break;
+
+ erase(pp);
+ rangeList.insert(rangeList.end(), std::make_pair(i, i));
+ }
+
+ if (rangeList.empty())
+ return false;
+
+ while (!rangeList.empty())
+ {
+ std::list< std::pair<size_t, size_t> >::iterator
+ b=rangeList.begin();
+
+ s << " " << (b->first+1) << "-" << (b->second+1);
+ rangeList.pop_front();
+ }
+ return true;
+}
+
+mail::smapMsgRange::smapMsgRange()
+{
+}
+
+void mail::smapMsgRange::init( mail::imap &imapAccount,
+ const mail::smapUidSet &uidSet)
+{
+ size_t i;
+ size_t n=imapAccount.currentFolder ?
+ imapAccount.currentFolder->exists:0;
+
+ for (i=0; i<n; i++)
+ {
+ if (uidSet.count(imapAccount.currentFolder->index[i].uid)
+ == 0)
+ continue;
+
+ if (!empty())
+ {
+ mail::smapMsgRange::iterator p= --end();
+
+ if (p->second + 1 == i)
+ {
+ ++p->second;
+ continue;
+ }
+ }
+
+ insert(end(), std::make_pair(i, i));
+ }
+}
+
+mail::smapMsgRange::~smapMsgRange()
+{
+}
+
+bool mail::smapMsgRange::operator>>( std::ostringstream &s)
+{
+ bool flag=false;
+ int i;
+
+ for (i=0; i<100; i++)
+ {
+ if (empty())
+ break;
+
+ flag=true;
+
+ std::list< std::pair<size_t, size_t> >::iterator b=begin();
+
+ s << " " << (b->first+1) << "-" << (b->second+1);
+
+ pop_front();
+ }
+
+ return flag;
+}