summaryrefslogtreecommitdiffstats
path: root/libmail/search.H
diff options
context:
space:
mode:
Diffstat (limited to 'libmail/search.H')
-rw-r--r--libmail/search.H290
1 files changed, 290 insertions, 0 deletions
diff --git a/libmail/search.H b/libmail/search.H
new file mode 100644
index 0000000..e81326e
--- /dev/null
+++ b/libmail/search.H
@@ -0,0 +1,290 @@
+/*
+** Copyright 2002-2011, Double Precision Inc.
+**
+** See COPYING for distribution information.
+*/
+#ifndef libmail_search_H
+#define libmail_search_H
+
+#include "libmail_config.h"
+
+#if TIME_WITH_SYS_TIME
+#include <sys/time.h>
+#include <time.h>
+#else
+#if HAVE_SYS_TIME_H
+#include <sys/time.h>
+#else
+#include <time.h>
+#endif
+#endif
+
+#include "mail.H"
+#include "structure.H"
+#include "runlater.H"
+
+#include "maildir/maildirsearch.h"
+
+
+#include <vector>
+#include <queue>
+
+#include <time.h>
+
+/////////////////////////////////////////////////////////////////////////
+//
+// Structure that describes the search criteria
+
+#include <string>
+
+LIBMAIL_START
+
+class searchParams {
+
+public:
+ searchParams();
+ ~searchParams();
+
+ bool searchNot; // If set, the following criteria is negated
+
+ enum Criteria {
+
+ // Messages with the following flags set:
+
+ replied,
+ deleted,
+ draft,
+ unread,
+
+ // Header match
+
+ from,
+ to,
+ cc,
+ bcc,
+ subject,
+
+ header,
+ body,
+ text,
+
+ // Internal date:
+
+ before,
+ on,
+ since,
+
+ // Sent date,
+
+ sentbefore,
+ senton,
+ sentsince,
+
+ larger,
+ smaller
+ } criteria;
+
+ std::string param1; // Header name, or date, or byte size
+ std::string param2; // Header or content value
+
+ std::string charset; // Charset for param2
+
+ // All strings use UTF-8
+
+
+ enum Scope {
+ search_all, // Search all messages
+
+ search_marked, // Only those msgs already marked
+
+ search_unmarked, // Only those msgs not already marked
+
+ search_range // Only messages in the following range:
+ } scope;
+
+ size_t rangeLo, rangeHi; // Used for search_range only
+
+ // Serialize/deserialize:
+
+ searchParams(std::string);
+ operator std::string() const;
+
+ // INTERNAL USE:
+
+ static std::string decode(std::string, std::string &);
+ static std::string encode(std::string);
+};
+
+class searchCallback {
+public:
+ searchCallback();
+ virtual ~searchCallback();
+
+ virtual void success(const std::vector<size_t> &found)=0;
+ virtual void fail(std::string)=0;
+
+ virtual void reportProgress(size_t bytesCompleted,
+ size_t bytesEstimatedTotal,
+
+ size_t messagesCompleted,
+ size_t messagesEstimatedTotal)=0;
+
+};
+
+class searchOneMessage {
+
+ searchCallback &callback;
+
+//
+// For searches, mail::callback::success is called with a non-empty string
+// if the message matches, an empty string if it does not.
+//
+
+ searchParams searchInfo;
+ time_t cmpDate;
+
+ mail::ptr<mail::account> ptr;
+ size_t messageNum;
+ size_t alreadyCompleted;
+ std::string uid;
+
+ std::string searchCharset;
+
+ class Callback : public mail::callback::message {
+ public:
+
+ searchOneMessage *me;
+
+ void (searchOneMessage::*nextFunc)();
+
+ Callback();
+ ~Callback();
+ void success(std::string message);
+ void fail(std::string message);
+
+ void messageEnvelopeCallback(size_t messageNumber,
+ const class envelope
+ &envelope);
+
+ void messageArrivalDateCallback(size_t messageNumber,
+ time_t datetime);
+
+ void messageSizeCallback(size_t messageNumber,
+ unsigned long size);
+
+ void messageStructureCallback(size_t messageNumber,
+ const class mimestruct
+ &messageStructure);
+ void messageTextCallback(size_t n, std::string text);
+
+ void reportProgress(size_t bytesCompleted,
+ size_t bytesEstimatedTotal,
+
+ size_t messagesCompleted,
+ size_t messagesEstimatedTotal);
+ };
+
+ Callback my_callback;
+
+ bool searchFlag;
+
+ class Searcher : public mail::Search, public mail::iconvert {
+
+ int converted(const char *str, size_t n);
+
+ public:
+ using mail::Search::operator bool;
+ using mail::Search::operator !;
+ using mail::iconvert::operator();
+ };
+
+ Searcher searchEngine;
+
+ mimestruct structureBuffer;
+ std::queue<mimestruct *> mimeSearch;
+
+ std::string headerSearchBuffer;
+
+ void doDateCmp(time_t);
+
+public:
+
+ searchOneMessage(searchCallback &callbackArg,
+ searchParams &searchInfoArg,
+ mail::account *ptrArg,
+ size_t messageNumArg,
+ size_t alreadyCompletedArg=0);
+
+ ~searchOneMessage();
+
+ void go();
+
+ void search(const envelope &envelope);
+ void search(time_t internaldate);
+ void search(unsigned long messageSize);
+ void search(const mimestruct &structureInfo);
+ void search(std::string text);
+
+ void searchEnvelope(const envelope &envelope);
+ void searchFwdEnvelope(mimestruct &structureInfo);
+
+private:
+ bool sanityCheck();
+ void checkSearch();
+ void checkNextHeader();
+ void checkFwdEnvelope();
+ void success(searchCallback &callback, size_t messageNum,
+ bool result);
+};
+
+class searchMessages : public runLater {
+
+ searchCallback &callback;
+
+ size_t nextMsgNum;
+
+ std::string uid;
+
+ std::vector<std::string> successArray;
+
+ class Callback : public searchCallback {
+ public:
+ searchMessages *me;
+
+ Callback();
+ ~Callback();
+
+ void fail(std::string message);
+ void success(const std::vector<size_t> &found);
+
+ void reportProgress(size_t bytesCompleted,
+ size_t bytesEstimatedTotal,
+
+ size_t messagesCompleted,
+ size_t messagesEstimatedTotal);
+ } search_callback;
+
+ ptr<mail::account> server;
+
+ searchMessages(searchCallback &callbackArg,
+ const searchParams &searchInfoArg,
+ mail::account *ptrArg);
+
+ ~searchMessages();
+
+ searchParams searchInfo, searchInfoCpy;
+
+ void nextSearch();
+ void RunningLater();
+public:
+
+ friend class Callback;
+
+ static void search(searchCallback &callbackArg,
+ const searchParams &searchInfoArg,
+ mail::account *ptrArg);
+};
+
+LIBMAIL_END
+
+#endif