summaryrefslogtreecommitdiffstats
path: root/libmail/generic.H
diff options
context:
space:
mode:
Diffstat (limited to 'libmail/generic.H')
-rw-r--r--libmail/generic.H243
1 files changed, 243 insertions, 0 deletions
diff --git a/libmail/generic.H b/libmail/generic.H
new file mode 100644
index 0000000..a1cf2c4
--- /dev/null
+++ b/libmail/generic.H
@@ -0,0 +1,243 @@
+/*
+** Copyright 2002, Double Precision Inc.
+**
+** See COPYING for distribution information.
+*/
+#ifndef libmail_generic_H
+#define libmail_generic_H
+
+#include "libmail_config.h"
+
+///////////////////////////////////////////////////////////////////////
+//
+// A primitive set of message access APIs, used by dumb drivers
+// to implement the mail::account/IMAP-like message access.
+//
+// A driver may not have a direct implementation for some of the advanced
+// methods (such as the MIME section version of readMessageContent, or
+// the MIMESTRUCTURE request of readMessageAttributes).
+//
+// The alternative, used by the dumb drivers, is to implement the
+// mail::generic interface:
+//
+// genericMessageRead() - read the header, or the body, or both portions of
+// the message.
+//
+// genericMessageSize() - return just the size of the message.
+//
+// genericGetMessageFd(), genericGetMessageStruct(),
+// genericGetMessageFdStruct() - return a descriptor of a temporary file
+// with the message's contents, and/or the rfc2045 parse of the message.
+// The dumb driver is expected to cache this data. The likelyhood of
+// multiple calls to these functions, for the same message, is rather high,
+// so the driver should act accordingly.
+// The dumb driver does not need to implement genericGetMessageFdStruct,
+// if not mail::generic will provide a default, PROVIDED THAT the file
+// descriptor is guaranteed to remain valid after genericGetMessageFd()
+// if genericGetMessageStruct() is immediately called for the same msg. TODO
+//
+// genericReadMessageContent()/genericReadMessageContentDecode() - a dumb
+// driver can optionally implement these method. If not, mail::generic
+// will use the previous three functions to do the job.
+//
+// genericCachedUid(std::string uid) - return true if the generics subclass
+// has message UID cached (used by generics to optimize implementation).
+//
+// genericAttributes() - implemented entirely by mail::generic.
+//
+// --
+//
+// fixMessageNumber() - to handle any concurrency issues, the generic
+// functions also keep track of the message's UID. fixMessageNumber()
+// updates the message number, based on its uid, in the event that the
+// folder's contents were changed in progress.
+
+#include "mail.H"
+#include "maildir/maildirkeywords.h"
+
+struct rfc2045;
+
+LIBMAIL_START
+
+class generic {
+
+ class Attributes;
+
+public:
+ generic();
+ virtual ~generic();
+
+ virtual void genericMessageRead(std::string uid,
+ size_t messageNumber,
+ bool peek,
+ mail::readMode
+ readType,
+ mail::callback::message &callback)=0;
+
+ virtual void genericMessageSize(std::string uid,
+ size_t messageNumber,
+ mail::callback::message &callback)=0;
+
+ virtual void genericGetMessageFd(std::string uid,
+ size_t messageNumber,
+ bool peek,
+ int &fdRet,
+ mail::callback &callback)=0;
+ // NOTE: fdRet gets initialized, then the callback function is invoked.
+ // The file descriptor remains valid ONLY UNTIL the callback function
+ // terminates, at which point the file descriptor may be closed.
+ // The callback function must dup the descriptor, if it needs to.
+
+ virtual void genericGetMessageStruct(std::string uid,
+ size_t messageNumber,
+ struct rfc2045 *&structRet,
+ mail::callback &callback)=0;
+ // NOTE: structRet gets initialized, then the callback function is
+ // invoked. structRet remains valid ONLY UNTIL the callback function
+ // terminates, at which point the structure may get deleted.
+
+ virtual void genericGetMessageFdStruct(std::string uid,
+ size_t messageNumber,
+ bool peek,
+ int &fdRet,
+ struct rfc2045 *&structret,
+
+ mail::callback &callback);
+
+ virtual bool genericCachedUid(std::string uid)=0;
+
+ virtual void genericMarkRead(size_t messageNumber)=0;
+ // Mark this msg as read, invoking a callback, if needed.
+
+ // See above.
+
+ static void genericReadMessageContent(mail::account *account,
+ generic *generic,
+ const std::vector<size_t>
+ &messages,
+ bool peek,
+ enum mail::readMode readType,
+ mail::callback::message
+ &callback);
+
+ static void genericReadMessageContent(mail::account *account,
+ generic *generic,
+ size_t messageNum,
+ bool peek,
+ const mimestruct &msginfo,
+ enum mail::readMode readType,
+ mail::callback::message
+ &callback);
+
+ static void genericReadMessageContentDecoded(mail::account *account,
+ generic *generic,
+ size_t messageNum,
+ bool peek,
+ const mimestruct
+ &info,
+ mail::callback::message
+ &callback);
+
+
+ static void genericMoveMessages(mail::account *account,
+ const std::vector<size_t> &messages,
+ mail::folder *copyTo,
+ mail::callback &callback);
+
+ //
+ // Generic keyword update for drivers that implement temporary
+ // keywords only (keywords are not saved, and are lost when the
+ // mail account is closed).
+ //
+ // genericUpdateKeywords() is intended to be invoked directly by
+ // updateKeywords(). It will dutifully iterate over the supplied
+ // message set, and update each message's keywords, one by one.
+ //
+ // The interface between the generic implementation, and the
+ // implementing driver is a bit tricky.
+ // The driver needs to implement the genericProcessKeyword() method.
+ // In the method, the driver needs to find the mail::keywords::Message
+ // object for message #n, and invoke the doUpdateKeyword() method,
+ // passing the reference to the mail::keywords::Message object as
+ // the sole argument. if the driver cannot locate the
+ // mail::keywords::Message object (can happen in the mbox driver, if
+ // the message was removed by another process, but the application
+ // hasn't noop-ed or expunged the folder).
+
+ class updateKeywordHelper {
+ public:
+ const std::set<std::string> &keywords;
+ bool setOrChange;
+ bool changeTo;
+
+ updateKeywordHelper(const std::set<std::string> &keywordsArg,
+ bool setOrChangeArg,
+ bool changeToArg);
+ ~updateKeywordHelper();
+
+ bool doUpdateKeyword(mail::keywords::Message &,
+ mail::keywords::Hashtable &);
+ };
+
+ virtual bool genericProcessKeyword(size_t messageNumber,
+ updateKeywordHelper &helper);
+
+ static void genericUpdateKeywords(const std::vector<size_t> &messages,
+ const std::set<std::string> &keywords,
+ bool setOrChange,
+ // false: set, true: see changeTo
+ bool changeTo,
+ mail::callback::folder
+ *folderCallback,
+ generic *generic,
+ callback &cb);
+
+
+
+private:
+ class Move;
+
+ class GetMessageFdStruct;
+ class ReadMultiple;
+ class ReadMimePart;
+
+ class CopyMimePart;
+
+ static void genericMakeMimeStructure(mimestruct &s,
+ int fd, struct rfc2045 *rfcp,
+ std::string mimeId,
+ envelope *saveEnvelope);
+ //
+ // Create a mimestruct, (and a envelope, if necessary)
+ // from a rfc2045 parse of a MIME section
+
+public:
+ static void genericBuildEnvelope(std::string header, std::string value,
+ envelope &envelope);
+
+ class Decode;
+
+ static void genericAttributes(mail::account *account,
+ generic *genericInterface,
+ const std::vector<size_t> &msgs,
+ mail::account::MessageAttributes attributes,
+ mail::callback::message &callback);
+
+ static bool fixMessageNumber(mail::account *account,
+ std::string uid,
+ size_t &msgNum);
+
+ static void genericRemoveMessages(mail::account *account,
+ const std::vector<size_t> &messages,
+ callback &cb);
+
+
+private:
+ class Remove;
+
+};
+
+LIBMAIL_END
+
+#endif
+