summaryrefslogtreecommitdiffstats
path: root/libmail/search.C
diff options
context:
space:
mode:
Diffstat (limited to 'libmail/search.C')
-rw-r--r--libmail/search.C1198
1 files changed, 0 insertions, 1198 deletions
diff --git a/libmail/search.C b/libmail/search.C
deleted file mode 100644
index a22b922..0000000
--- a/libmail/search.C
+++ /dev/null
@@ -1,1198 +0,0 @@
-/*
-** Copyright 2002-2011, Double Precision Inc.
-**
-** See COPYING for distribution information.
-*/
-#include "libmail_config.h"
-
-#include "search.H"
-#include "envelope.H"
-#include "structure.H"
-#include "rfcaddr.H"
-#include "rfc2047decode.H"
-#include "unicode/courier-unicode.h"
-
-#include "rfc822/rfc822.h"
-#include "rfc822/rfc822hdr.h"
-#include "rfc822/rfc2047.h"
-
-#include <sstream>
-#include <iomanip>
-#include <errno.h>
-#include <string.h>
-
-using namespace std;
-
-mail::searchParams::searchParams() : searchNot(false), criteria(replied),
- scope(search_all)
-{
-}
-
-mail::searchParams::~searchParams()
-{
-}
-
-static const struct {
- mail::searchParams::Criteria code;
- const char *name;
-} searchCriteriaTable[] = {
- {mail::searchParams::replied, "replied"},
- {mail::searchParams::deleted, "deleted"},
- {mail::searchParams::draft, "draft"},
- {mail::searchParams::unread, "unread"},
- {mail::searchParams::from, "from"},
- {mail::searchParams::to, "to"},
- {mail::searchParams::cc, "cc"},
- {mail::searchParams::bcc, "bcc"},
- {mail::searchParams::subject, "subject"},
- {mail::searchParams::header, "header"},
- {mail::searchParams::body, "body"},
- {mail::searchParams::text, "text"},
- {mail::searchParams::before, "before"},
- {mail::searchParams::on, "on" },
- {mail::searchParams::since, "since"},
- {mail::searchParams::sentbefore, "sentbefore"},
- {mail::searchParams::senton, "senton"},
- {mail::searchParams::sentsince, "sentsince"},
- {mail::searchParams::larger, "larger"},
- {mail::searchParams::smaller, "smaller"},
- {mail::searchParams::replied, NULL},
-};
-
-mail::searchParams::searchParams(string s)
- : searchNot(false), criteria(replied),
- scope(search_all), rangeLo(0), rangeHi(0)
-{
- string::iterator b=s.begin(), c;
-
- if (b != s.end())
- switch (*b) {
- case 'A':
- scope=search_all;
- break;
- case 'M':
- scope=search_marked;
- break;
- case 'U':
- scope=search_unmarked;
- default:
- {
- istringstream i(s);
- char dummy;
-
- i >> rangeLo >> dummy >> rangeHi;
-
- if (!i.fail() && dummy == '-')
- scope=search_range;
- }
- break;
- }
-
- while (b != s.end() && *b != ' ')
- b++;
-
- while (b != s.end() && *b == ' ')
- b++;
-
- if (b != s.end() && *b == '!')
- {
- searchNot=true;
- ++b;
- }
-
- c=b;
- while (c != s.end() && *c != ' ')
- ++c;
-
- string n(b, c);
-
- size_t i;
-
- for (i=0; searchCriteriaTable[i].name; i++)
- if (n == searchCriteriaTable[i].name)
- {
- criteria=searchCriteriaTable[i].code;
- break;
- }
-
- if (c != s.end())
- ++c;
-
- s=string(c, s.end());
-
- s=decode(s, param1);
- s=decode(s, param2);
- decode(s, charset);
-}
-
-string mail::searchParams::searchParams::decode(string s, string &v)
-{
- ostringstream o;
-
- string::iterator b=s.begin(), e=s.end();
-
- while (b != e)
- {
- if (*b == ' ')
- {
- ++b;
- break;
- }
-
- if (*b != '%')
- {
- o << (char)*b;
- ++b;
- continue;
- }
-
- ++b;
-
- char hx[3];
-
- if (b != e)
- {
- hx[0]=*b++;
- if (b != e)
- {
- hx[1]=*b++;
- hx[2]=0;
-
- istringstream i(hx);
-
- unsigned n;
-
- i >> hex >> n;
-
- if (!i.fail())
- o << (char)n;
- }
- }
- }
-
- v=o.str();
- return string(b, e);
-}
-
-mail::searchParams::operator std::string() const
-{
- string s;
-
- size_t i;
-
- for (i=0; searchCriteriaTable[i].name; i++)
- if (criteria == searchCriteriaTable[i].code)
- {
- s=searchCriteriaTable[i].name;
- break;
- }
-
- if (searchNot)
- s = "!" +s;
-
- switch (scope) {
- case search_all:
- s= "A " + s;
- break;
- case search_marked:
- s= "M " + s;
- break;
- case search_unmarked:
- s = "U " + s;
- break;
- case search_range:
- {
- ostringstream o;
-
- o << rangeLo << '-' << rangeHi << ' ';
-
- s=o.str() + s;
- }
- }
-
- return s + " " + encode(param1) + " " + encode(param2) + " "
- + encode(charset);
-}
-
-
-string mail::searchParams::encode(std::string s)
-{
- ostringstream o;
-
- string::iterator b, e;
-
- b=s.begin();
- e=s.end();
-
- while (b != e)
- {
- if (*b <= ' ' || *b >= 127 || *b == '%')
- {
- o << '%' << hex << setw(2) << setfill('0') <<
- (int)(unsigned char)*b;
- }
- else
- o << (char)*b;
- ++b;
- }
-
- return o.str();
-}
-
-
-///////////////////////////////////////////////////////////////////////////
-
-int mail::searchOneMessage::Searcher::converted(const char *str,
- size_t n)
-{
- const unicode_char *uc=reinterpret_cast<const unicode_char *>(str);
- n /= sizeof(unicode_char);
-
- while (n)
- {
- mail::Search::operator<<(*uc);
- ++uc;
- --n;
- }
- return 0;
-}
-
-mail::searchCallback::searchCallback()
-{
-}
-
-mail::searchCallback::~searchCallback()
-{
-}
-
-mail::searchOneMessage::Callback::Callback()
-{
-}
-
-mail::searchOneMessage::Callback::~Callback()
-{
-}
-
-void mail::searchOneMessage::Callback::success(string message)
-{
- (me->*nextFunc)();
-}
-
-void mail::searchOneMessage::Callback::fail(string message)
-{
- me->callback.fail(message);
- delete me;
-}
-
-void mail::searchOneMessage
-::Callback::reportProgress(size_t bytesCompleted,
- size_t bytesEstimatedTotal,
-
- size_t messagesCompleted,
- size_t messagesEstimatedTotal)
-{
- me->callback.reportProgress(bytesCompleted, bytesEstimatedTotal,
- me->alreadyCompleted,
- me->alreadyCompleted+1);
-}
-
-void mail::searchOneMessage::Callback
-::messageEnvelopeCallback(size_t messageNumber,
- const mail::envelope &envelope)
-{
- me->search(envelope);
-}
-
-void mail::searchOneMessage::Callback
-::messageArrivalDateCallback(size_t messageNumber,
- time_t datetime)
-{
- me->search(datetime);
-}
-
-void mail::searchOneMessage::Callback
-::messageSizeCallback(size_t messageNumber,
- unsigned long size)
-{
- me->search(size);
-}
-
-void mail::searchOneMessage::Callback
-::messageStructureCallback(size_t messageNumber,
- const mail::mimestruct &messageStructure)
-{
- me->search(messageStructure);
-}
-
-void mail::searchOneMessage::Callback
-::messageTextCallback(size_t n, string text)
-{
- me->search(text);
-}
-
-mail::searchOneMessage::searchOneMessage(mail::searchCallback
- &callbackArg,
- mail::searchParams &searchInfoArg,
- mail::account *ptrArg,
- size_t messageNumArg,
- size_t alreadyCompletedArg)
- : callback(callbackArg),
- searchInfo(searchInfoArg),
- ptr(ptrArg),
- messageNum(messageNumArg),
- alreadyCompleted(alreadyCompletedArg)
-{
- my_callback.me=this;
- uid=ptr->getFolderIndexInfo(messageNum).uid;
-}
-
-mail::searchOneMessage::~searchOneMessage()
-{
-}
-
-void mail::searchOneMessage::go()
-{
- char *c=unicode_convert_tocase(searchInfo.param2.c_str(),
- searchInfo.charset.c_str(),
- unicode_uc,
- NULL);
-
- if (c == NULL)
- {
- my_callback.fail("Unknown search charset.");
- return;
- }
-
- try
- {
- searchInfo.param2=c;
- free(c);
- } catch (...) {
- free(c);
- LIBMAIL_THROW(LIBMAIL_THROW_EMPTY);
- }
-
- c=unicode_convert_tocase(searchInfo.param1.c_str(),
- "iso-8859-1",
- unicode_uc,
- NULL);
- if (!c)
- {
- my_callback.fail(strerror(errno));
- return;
- }
-
- try {
- searchInfo.param1=c;
- free(c);
- } catch (...) {
- free(c);
- LIBMAIL_THROW(LIBMAIL_THROW_EMPTY);
- }
-
- searchCharset=searchInfo.charset;
- searchFlag=false;
-
- try {
- vector<size_t> messageNumVector;
-
- messageNumVector.push_back(messageNum);
-
- size_t n;
-
- switch (searchInfo.criteria) {
- case searchParams::larger:
- case searchParams::smaller:
-
- my_callback.nextFunc=
- &mail::searchOneMessage::checkNextHeader;
- ptr->readMessageAttributes(messageNumVector,
- mail::account::MESSAGESIZE,
- my_callback);
- return;
-
- case searchParams::before:
- case searchParams::on:
- case searchParams::since:
- case searchParams::sentbefore:
- case searchParams::senton:
- case searchParams::sentsince:
-
- while (searchInfo.param2.size() > 0 &&
- unicode_isspace((unsigned char)searchInfo
- .param2[0]))
- searchInfo.param2=searchInfo.param2.substr(1);
-
- n=searchInfo.param2.find(' ');
-
- if (n != std::string::npos)
- searchInfo.param2=
- searchInfo.param2.substr(0,n);
-
- for (n=0; n<searchInfo.param2.size(); n++)
- if (searchInfo.param2[n] == '-')
- searchInfo.param2[n]=' ';
-
- searchInfo.param2 += " 00:00:00 -0000";
-
- cmpDate=rfc822_parsedt(searchInfo.param2.c_str());
-
- if (cmpDate == 0)
- {
- my_callback.fail("Invalid date specified");
- return;
- }
-
- my_callback.nextFunc=
- &mail::searchOneMessage::checkFwdEnvelope;
- ptr->readMessageAttributes(messageNumVector,
-
- (searchInfo.criteria ==
- searchInfo.before ||
- searchInfo.criteria ==
- searchInfo.on ||
- searchInfo.criteria ==
- searchInfo.since ?
-
- mail::account::ARRIVALDATE:
- mail::account::ENVELOPE),
- my_callback);
- return;
-
- case searchParams::from:
- case searchParams::to:
- case searchParams::cc:
- case searchParams::bcc:
- case searchParams::subject:
- my_callback.nextFunc=
- &mail::searchOneMessage::checkFwdEnvelope;
- ptr->readMessageAttributes(messageNumVector,
- mail::account::ENVELOPE,
- my_callback);
- return;
-
- case searchParams::header:
- case searchParams::body:
- case searchParams::text:
-
- while (!mimeSearch.empty())
- mimeSearch.pop();
-
- headerSearchBuffer="";
- my_callback.nextFunc=
- &mail::searchOneMessage::checkNextHeader;
- ptr->readMessageAttributes(messageNumVector,
- mail::account::MIMESTRUCTURE,
- my_callback);
- return;
-
- case searchParams::replied:
- case searchParams::deleted:
- case searchParams::draft:
- case searchParams::unread:
- break;
- }
- } catch (...) {
- my_callback.fail("An exception occured in mail::searchOneMessage.");
- return;
- }
-
- checkSearch();
-}
-
-bool mail::searchOneMessage::sanityCheck()
-{
- if (!ptr.isDestroyed() && messageNum < ptr->getFolderIndexSize() &&
- uid == ptr->getFolderIndexInfo(messageNum).uid)
- return true;
- checkSearch();
- return false;
-}
-
-void mail::searchOneMessage::checkFwdEnvelope()
-{
- if (!sanityCheck())
- return;
-
- if (searchFlag)
- {
- checkSearch(); // No need
- return;
- }
-
- try {
- vector<size_t> messageNumVector;
-
- messageNumVector.push_back(messageNum);
-
- my_callback.nextFunc=
- &mail::searchOneMessage::checkSearch;
- ptr->readMessageAttributes(messageNumVector,
- mail::account::MIMESTRUCTURE,
- my_callback);
- } catch (...) {
- my_callback.fail("An exception occured in mail::searchOneMessage.");
- return;
- }
-}
-
-void mail::searchOneMessage::checkNextHeader()
-{
- if (searchInfo.criteria == searchParams::header &&
- headerSearchBuffer.size() > 0)
- search("\n");
-
- searchEngine.end();
-
- if (searchEngine)
- searchFlag=true;
-
- if (!sanityCheck())
- return;
-
- mail::mimestruct *hdrs;
- std::string bodyCharset("iso-8859-1");
-
- for (;;) {
-
- if (searchFlag || mimeSearch.empty())
- {
- checkSearch();
- return;
- }
-
- hdrs=mimeSearch.front();
-
- mimeSearch.pop();
-
- my_callback.nextFunc=&mail::searchOneMessage::checkNextHeader;
- headerSearchBuffer="";
-
- switch (searchInfo.criteria) {
- case searchParams::header:
-
- if (!searchEngine.setString(searchInfo.param2,
- searchCharset))
- {
- my_callback.fail(strerror(errno));
- return;
- }
- bodyCharset="utf-8";
- break;
-
- case searchParams::body:
- case searchParams::text:
-
- if (!searchEngine.setString(searchInfo.param2,
- searchCharset))
- {
- my_callback.fail(strerror(errno));
- return;
- }
-
- if (hdrs->type == "TEXT" &&
- hdrs->type_parameters.exists("CHARSET"))
- {
- bodyCharset=hdrs->type_parameters
- .get("CHARSET");
- }
- break;
- default:
- checkSearch(); // Shouldn't happen.
- return;
- }
-
- if (searchEngine.getSearchLen() == 0) // Empty srch string
- {
- checkSearch();
- return;
- }
- break;
- }
-
- searchEngine.begin(bodyCharset.c_str(),
- unicode_u_ucs4_native);
-
- switch (searchInfo.criteria) {
- case searchParams::header:
- ptr->readMessageContent(messageNum, true, *hdrs,
- mail::readHeadersFolded,
- my_callback);
- break;
- case searchParams::body:
- case searchParams::text:
- ptr->readMessageContentDecoded(messageNum, true, *hdrs,
- my_callback);
- break;
- default:
- break;
- }
-}
-
-void mail::searchOneMessage::checkSearch()
-{
- if (searchInfo.criteria == searchInfo.text && !searchFlag)
- {
- // Not found, look in the headers.
-
- searchInfo.criteria=searchInfo.header;
- searchInfo.param1="";
- headerSearchBuffer="";
- searchFwdEnvelope(structureBuffer);
- checkNextHeader();
- return;
- }
-
- if (searchInfo.searchNot)
- searchFlag= !searchFlag;
-
- success(callback, messageNum, searchFlag);
-}
-
-void mail::searchOneMessage::success(mail::searchCallback &callback,
- size_t n, bool result)
-{
- delete this;
-
- try {
- vector<size_t> msgSet;
-
- if (result)
- msgSet.push_back(n);
-
- callback.success(msgSet);
- } catch (...) {
- my_callback.fail("An exception has occured processing search results.");
- return;
- }
-}
-
-void mail::searchOneMessage::search(const mail::envelope &envelope)
-{
- switch (searchInfo.criteria) {
- case searchParams::from:
- case searchParams::to:
- case searchParams::cc:
- case searchParams::bcc:
- case searchParams::subject:
- case searchParams::sentbefore:
- case searchParams::senton:
- case searchParams::sentsince:
-
- searchEnvelope(envelope);
- break;
- default:
- break;
- }
-}
-
-void mail::searchOneMessage::searchEnvelope(const mail::envelope &envelope)
-{
- string searchStr;
- const char *header="Subject";
-
- switch (searchInfo.criteria) {
- case searchParams::from:
- searchStr= mail::address::toString("", envelope.from);
- header="From";
- break;
- case searchParams::to:
- searchStr= mail::address::toString("", envelope.to);
- header="To";
- break;
- case searchParams::cc:
- searchStr= mail::address::toString("", envelope.cc);
- header="Cc";
- break;
- case searchParams::bcc:
- searchStr= mail::address::toString("", envelope.bcc);
- header="Bcc";
- break;
- case searchParams::subject:
- searchStr=envelope.subject;
- break;
-
- case searchParams::sentbefore:
- case searchParams::senton:
- case searchParams::sentsince:
-
- doDateCmp(envelope.date);
- return;
- default:
- return;
- }
-
- char *q=rfc822_display_hdrvalue_tobuf(header,
- searchStr.c_str(),
- "utf-8",
- NULL, NULL);
-
- if (!q)
- return;
-
- if (!searchEngine.setString(searchInfo.param2, searchCharset))
- {
- free(q);
- return;
- }
-
- if (searchEngine.getSearchLen() == 0)
- {
- free(q);
- return;
- }
-
- std::vector<unicode_char> uc;
-
- if (!mail::iconvert::convert(q, "utf-8", uc))
- {
- free(q);
- return;
- }
- free(q);
-
- for (std::vector<unicode_char>::iterator
- b(uc.begin()), e(uc.end()); b != e; ++b)
- searchEngine << *b;
-
- if (searchEngine)
- searchFlag=true;
-}
-
-static const char spaces[]=" \t\r\n";
-
-void mail::searchOneMessage::search(time_t internaldate)
-{
- switch (searchInfo.criteria) {
- case searchParams::before:
- case searchParams::on:
- case searchParams::since:
- doDateCmp(internaldate);
- break;
- default:
- break;
- }
-}
-
-void mail::searchOneMessage::search(unsigned long messageSize)
-{
- unsigned long b=0;
-
- istringstream i(searchInfo.param2.c_str());
-
- i >> b;
-
- if (!i.fail())
- switch (searchInfo.criteria) {
- case searchParams::larger:
- if (messageSize > b)
- searchFlag=true;
- break;
- case searchParams::smaller:
- if (messageSize < b)
- searchFlag=true;
- break;
- default:
- break;
- }
-}
-
-void mail::searchOneMessage::search(const mail::mimestruct &structureInfo)
-{
- switch (searchInfo.criteria) {
- case searchParams::from:
- case searchParams::to:
- case searchParams::cc:
- case searchParams::bcc:
- case searchParams::subject:
- case searchParams::header:
- case searchParams::body:
- case searchParams::text:
-
- structureBuffer=structureInfo;
-
- searchFwdEnvelope(structureBuffer);
- break;
- default:
- break;
- }
-}
-
-// Search envelopes of attached messages.
-
-void mail::searchOneMessage::searchFwdEnvelope(mail::mimestruct &structureInfo)
-{
- if (searchFlag)
- return;
-
- if (searchInfo.criteria == searchInfo.header)
- mimeSearch.push(&structureInfo); // Queue up header searches
- else if (searchInfo.criteria == searchInfo.body ||
- searchInfo.criteria == searchInfo.text)
- {
- if (structureInfo.getNumChildren() == 0)
- // Only leafs receive the content search.
- mimeSearch.push(&structureInfo);
- }
- else if (structureInfo.messagerfc822())
- searchEnvelope( structureInfo.getEnvelope());
-
- size_t n=structureInfo.getNumChildren();
- size_t i;
-
- for (i=0; i<n; i++)
- searchFwdEnvelope(*structureInfo.getChild(i));
-}
-
-void mail::searchOneMessage::search(string text)
-{
- if (searchFlag)
- return;
-
- if (searchInfo.criteria == searchInfo.header)
- {
- text=headerSearchBuffer + text;
-
- size_t n;
-
- while (!searchFlag && (n=text.find('\n')) != std::string::npos)
- {
- searchEngine.reset();
-
- string s=text.substr(0, n);
-
- text=text.substr(n+1);
-
- std::string headername;
-
- size_t colon=s.find(':');
-
- if (colon != std::string::npos)
- {
- headername=s.substr(0, colon);
- s=s.substr(colon+1);
- }
-
- if (searchInfo.param1.size() > 0 &&
- rfc822hdr_namecmp(headername.c_str(),
- searchInfo.param1.c_str()))
- continue;
-
- char *value=
- rfc822_display_hdrvalue_tobuf(headername
- .c_str(),
- s.c_str(),
- "utf-8",
- NULL,
- NULL);
-
- if (!value)
- continue;
-
-
- unicode_char *uc;
- size_t ucsize;
-
- if (unicode_convert_tou_tobuf(value,
- strlen(value),
- "utf-8",
- &uc,
- &ucsize,
- NULL))
- {
- free(value);
- continue;
- }
- free(value);
-
- size_t n;
-
- for (n=0; n<ucsize; ++n)
- {
- searchEngine << uc[n];
- }
- free(uc);
-
- if (searchEngine)
- searchFlag=true;
- }
- if (!searchFlag)
- headerSearchBuffer=text;
- }
- else if (searchInfo.criteria == searchInfo.body ||
- searchInfo.criteria == searchInfo.text)
- {
- searchEngine(text.c_str(), text.size());
-
- if (searchEngine)
- searchFlag=true;
- }
-}
-
-void mail::searchOneMessage::doDateCmp(time_t t)
-{
- struct tm *tmptr=gmtime(&cmpDate);
-
- if (!tmptr)
- return;
-
- int y=tmptr->tm_year;
- int m=tmptr->tm_mon;
- int d=tmptr->tm_mday;
-
- tmptr=localtime(&t);
-
- int diff=0;
-
- if (tmptr->tm_year > y)
- diff=1;
- else if (tmptr->tm_year < y)
- diff= -1;
- else if (tmptr->tm_mon > m)
- diff=1;
- else if (tmptr->tm_mon < m)
- diff= -1;
- else if (tmptr->tm_mday > d)
- diff=1;
- else if (tmptr->tm_mday < d)
- diff= -1;
-
- switch (searchInfo.criteria) {
- case searchParams::on:
- case searchParams::senton:
- if (diff == 0)
- searchFlag=true;
- break;
-
- case searchParams::before:
- case searchParams::sentbefore:
-
- if (diff < 0)
- searchFlag=true;
- break;
-
- case searchParams::since:
- case searchParams::sentsince:
-
- if (diff >= 0)
- searchFlag=true;
- break;
- default:
- break;
- }
-}
-
-///////////////////////////////////////////////////////////////////////
-
-mail::searchMessages::searchMessages(mail::searchCallback
- &callbackArg,
- const mail::searchParams
- &searchInfoArg,
- mail::account *ptrArg)
- : callback(callbackArg), server(ptrArg), searchInfo(searchInfoArg)
-{
- search_callback.me=this;
-
- nextMsgNum=0;
-}
-
-void mail::searchMessages::nextSearch()
-{
- try {
- RunLater();
- } catch (...) {
- callback.fail("An exception occured in mail::searchMessages.");
- }
-}
-
-void mail::searchMessages::RunningLater()
-{
- if (server.isDestroyed())
- {
- callback.fail("Folder closed while a search was in progress.");
- delete this;
- return;
- }
-
- size_t cnt=server->getFolderIndexSize();
-
- while (nextMsgNum < cnt)
- {
- mail::messageInfo i=server->getFolderIndexInfo(nextMsgNum);
-
- switch (searchInfo.scope) {
- case searchParams::search_all:
- break;
-
- case searchParams::search_unmarked:
- if (i.marked)
- {
- ++nextMsgNum;
- continue;
- }
- break;
-
- case searchParams::search_marked:
- if (!i.marked)
- {
- ++nextMsgNum;
- continue;
- }
- break;
-
- case searchParams::search_range:
- if (nextMsgNum < searchInfo.rangeLo
- || nextMsgNum >= searchInfo.rangeHi)
- {
- ++nextMsgNum;
- continue;
- }
- break;
- }
-
- uid=i.uid;
-
- switch (searchInfo.criteria) {
- case searchParams::replied:
- if (searchInfo.searchNot ? !i.replied:i.replied)
- successArray.push_back(uid);
- ++nextMsgNum;
- continue;
- case searchParams::deleted:
- if (searchInfo.searchNot ? !i.deleted:i.deleted)
- successArray.push_back(uid);
- ++nextMsgNum;
- continue;
- case searchParams::draft:
- if (searchInfo.searchNot ? !i.draft:i.draft)
- successArray.push_back(uid);
- ++nextMsgNum;
- continue;
- case searchParams::unread:
- if (searchInfo.searchNot ? !i.unread:i.unread)
- successArray.push_back(uid);
- ++nextMsgNum;
- continue;
- default:
- break;
- }
- break;
- }
-
- if (nextMsgNum >= cnt)
- {
- vector<size_t> msgNumArray;
-
- size_t n=server->getFolderIndexSize();
-
- size_t i=0;
- size_t j;
-
- for (j=0; j<n && i < successArray.size(); j++)
- if (server->getFolderIndexInfo(j).uid
- == successArray[i])
- {
- msgNumArray.push_back(j);
- i++;
- }
-
- callback.success(msgNumArray);
- delete this;
- return;
- }
-
- searchInfoCpy=searchInfo;
-
- mail::searchOneMessage *m=NULL;
-
- try {
- m=new mail::searchOneMessage(search_callback,
- searchInfoCpy,
- server,
- nextMsgNum,
- nextMsgNum);
- nextMsgNum++;
-
- if (!m)
- {
- callback.fail("Out of memory.");
- delete m;
- return;
- }
-
- m->go();
- } catch (...) {
- delete m;
- LIBMAIL_THROW(LIBMAIL_THROW_EMPTY);
- }
-}
-
-mail::searchMessages::~searchMessages()
-{
-}
-
-mail::searchMessages::Callback::Callback()
-{
-}
-
-mail::searchMessages::Callback::~Callback()
-{
-}
-
-void mail::searchMessages::Callback::fail(string message)
-{
- me->callback.fail(message);
- delete me;
-}
-
-void mail::searchMessages::Callback::success(const vector<size_t> &found)
-{
- try {
- if (found.size() > 0)
- me->successArray.push_back(me->uid);
- me->nextSearch();
- } catch (...) {
- fail("Exception occured during a search.");
- }
-}
-
-void mail::searchMessages
-::Callback::reportProgress(size_t bytesCompleted,
- size_t bytesEstimatedTotal,
-
- size_t messagesCompleted,
- size_t messagesEstimatedTotal)
-{
- me->callback.reportProgress(bytesCompleted, bytesEstimatedTotal,
- messagesCompleted,
- me->server.isDestroyed() ?
- messagesCompleted+1:
- me->server->getFolderIndexSize());
-}
-
-void mail::searchMessages::search(mail::searchCallback
- &callbackArg,
- const mail::searchParams &searchInfoArg,
- mail::account *ptrArg)
-{
- mail::searchMessages *m=NULL;
-
- try {
- m=new mail::searchMessages(callbackArg, searchInfoArg,
- ptrArg);
-
- if (!m)
- {
- callbackArg.fail("Out of memory.");
- return;
- }
-
- m->nextSearch();
- } catch (...) {
- if (m)
- delete m;
- callbackArg.fail("Exception occured trying to start a search.");
- }
-}
-
-