summaryrefslogtreecommitdiffstats
path: root/libmail/mail.H
diff options
context:
space:
mode:
Diffstat (limited to 'libmail/mail.H')
-rw-r--r--libmail/mail.H1027
1 files changed, 0 insertions, 1027 deletions
diff --git a/libmail/mail.H b/libmail/mail.H
deleted file mode 100644
index 281877e..0000000
--- a/libmail/mail.H
+++ /dev/null
@@ -1,1027 +0,0 @@
-/*
-** Copyright 2003-2008, Double Precision Inc.
-**
-** See COPYING for distribution information.
-*/
-#ifndef libmail_mail_H
-#define libmail_mail_H
-
-#include "libmail_config.h"
-#include <time.h>
-#include <string>
-
-#if HAVE_SYS_SELECT_H
-#include <sys/select.h>
-#endif
-#include <sys/types.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
-#if HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#include <sys/poll.h>
-
-#include <vector>
-#include <list>
-#include <set>
-
-#include "namespace.H"
-#include "objectmonitor.H"
-#include "misc.H"
-
-#if LIBMAIL_THROW_DEBUG
-#define LIBMAIL_THROW(x) do { fprintf(stderr, "Exception at %s(%d)\n", __FILE__, __LINE__); throw x;} while (0)
-#else
-#define LIBMAIL_THROW(x) throw x
-
-#define LIBMAIL_THROW_EMPTY
-
-#endif
-
-LIBMAIL_START
-
-class envelope;
-class xenvelope;
-class mimestruct;
-class addMessage;
-class searchParams;
-class searchCallback;
-class smtpInfo;
-class snapshot;
-class loginInfo;
-
-// Encapsulate poll() structures
-
-typedef struct ::pollfd pollfd;
-
-// i.e. pollfd.fd, pollfd.events,
-
-static const int pollin=POLLIN;
-static const int pollpri=POLLPRI;
-static const int pollout=POLLOUT;
-static const int pollerr=POLLERR;
-static const int pollhup=POLLHUP;
-
-static const int pollread= POLLIN | POLLHUP | POLLERR;
-
-static const int pollwrite= POLLOUT | POLLERR;
-
-
-//
-// libmail.a uses a mail::callback object to notify the application when
-// the requested operation succeeds. libmail.a's API is completely
-// asynchronous. Most operations cannot be completed immediately. Instead,
-// the application passes a mail::callback object (or one of its subclasses)
-// to a function/method call that makes a particular request. The function
-// or a method returns immediately, and the mail::callback's success() or
-// fail() method will be called whenever the requested operation completes.
-// All processing occurs within mail::account::process().
-//
-// It's possible that the requested operation can be completed immediately,
-// without blocking for I/O. In which case the function/method call invokes
-// the success() or the fail() method prior to returning.
-
-class callback {
-public:
- callback() {}
- virtual ~callback() {}
- virtual void success(std::string message)=0;
- virtual void fail(std::string message)=0;
-
- virtual void reportProgress(size_t bytesCompleted,
- size_t bytesEstimatedTotal,
-
- size_t messagesCompleted,
- size_t messagesEstimatedTotal)=0;
-
- class disconnect;
- class folder;
- class folderInfo;
- class folderList;
- class message;
-};
-
-class folder;
-class messageInfo;
-class loginCallback;
-
-#define MAILCHECKINTERVAL 10
-
-///////////////////////////////////////////////////////////////////////////
-//
-// A mail::account object represents a single mail account. A mail account is
-// defined as a collection of related mail folders. A mail folder may
-// contain other mail subfolders, or messages (or both), depending on the
-// mail account.
-//
-// A mail::account object is not instantiated directly, but is instantiated by the
-// mail::account::open() function, which instantiated the appropriate subclass
-// based on the mail account's URL. mail::account::open() returns a new mail::account
-// object. As a rule, the mail::account object is not yet fully initialized; the
-// application must wait until the success() callback method is invoked.
-//
-// Mail folders are arranged into a tree-like hierarchy. The list of folders
-// at the topmost hierarchy level is obtained. by the readTopLevelFolders()
-// method.
-
-#define LIBMAIL_SINGLEFOLDER "*LIBMAIL_SINGLEFOLDER"
-
-#define LIBMAIL_CHEAPSTATUS "*LIBMAIL_CHEAPSTATUS"
-
-#define LIBMAIL_SERVERTYPE "*LIBMAIL_SERVERTYPE"
-
-#define LIBMAIL_SERVERDESCR "*LIBMAIL_SERVERDESCR"
-
-#define LIBMAIL_ACL "ACL"
-
-class account : public obj {
-
- // All instantiated mail::account objects:
-
- static std::list<account *> mailaccount_list;
-
- std::list<account *>::iterator my_mailaccount_p;
-
- virtual void resumed()=0;
-
-public:
- static void resume();
-private:
- // Handle any pending I/O for this mail::account object.
-
- virtual void handler(std::vector<pollfd> &fds, int &timeout)=0;
-
-protected:
-
- // Disconnect callback object that's passed to the constructor.
-
- callback::disconnect &disconnect_callback;
-
-public:
-
- account(callback::disconnect &disconnect_callback);
- //
- // disconnect_callback - a callback object.
- // disconnect_callback.disconnected() gets called from within
- // handler() when the connection to the server is terminated.
- // disconnect_callback.servererror() gets called whenever the
- // server reports a fatal error which does not result in the
- // server connection shutting down.
-
- virtual ~account();
-
- class openInfo {
- public:
- //
- // Information for creating a new mail::account object:
-
- std::string url;
- std::string pwd;
-
- std::vector<std::string> certificates; // Raw SSL certificates
-
- std::string extraString; // newsrc filename, etc...
-
- mail::loginCallback *loginCallbackObj;
-
- openInfo();
- ~openInfo();
- };
-
-
- static account *open(openInfo openInfoArg,
- callback &callback,
- callback::disconnect &disconnectCallback);
- //
- // Create a new mail::account object.
- //
- // url - mail account URL.
- // pwd - mail account password. May be an empty string for mail
- // accounts that do not require passwords (local mail storage).
- // callback - The open() function generally returns immediately.
- // The app must wait until callback.success() is invoked
- // indicating that libmail.a succesfully opened account.
- // callback.fail() is invoked if the login failed (at which
- // point the mail::account object is automatically destroyed).
- // A fatal error within the open function itself,
- // (such as an invalid URL or out of memory) results in
- // an invocation of callback.fail(), followed by open()
- // return a NULL pointer.
- //
- // disconnect_callback -
- // disconnect_callback.disconnected() gets called from
- // within handler() when the connection to the server is
- // terminated. disconnect_callback.servererror() gets
- // called whenever the server reports a fatal error which
- // does not result in the server connection shutting down.
- //
- // The disconnect_callback object may not be destroyed until
- // either callback.fail() calls, or the logout() function
- // completes (the fail() or the success() method of the
- // object passed to mail::account::logout() is invoked).
-
-
- static bool isRemoteUrl(std::string url);
- // Return TRUE if url represents a remote server account
- // (IMAP, POP3, NNTP, or SMTP)
-
- static void process(std::vector<pollfd> &fds, int &timeout);
-
- //
- // The process function is where ALL libmail.a processing takes
- // place. All other methods in all mail::account objects merely
- // initiate a request to perform the given task. The process()
- // function must be called periodically in order to process pending
- // I/O requests.
- //
- // The fds and timeout arguments are intended to be passed directly
- // to the poll(2) function call. Before calling process() initialize
- // fds to an empty vector. 'timeout' should also be initialized
- // to a fairly large timeout value, which should generally be the
- // timeout before any further application activity takes place.
- //
- // After process() terminates, it should not be invoked again until
- // poll(&fds[0], fds.size(), timeout) indicates that I/O requested
- // by the fd array is available, or until the 'tv' timeout expires.
- //
- // Note that the application should check if fds.size() == 0, which
- // indicates that libmail.a does not expect I/O on any file descriptor,
- // instead the application needs to wait for a simple timer to expire.
- //
- // If mail::account::process expects further processing to take place
- // earlier than what's indicated by 'timeout', mail::account::process()
- // will reduce the indicated timeout (the timeout will never be made
- // longer, only shorter).
-
- static int poll(std::vector<pollfd> &fds, int timeout);
-
- virtual void logout(callback &callback)=0;
- //
- // Close the mail account. The application should wait until
- // either callback.success() or callback.fail() is called (not much
- // of a difference, really, in both cases the mail::account object gets
- // automatically destroyed)
-
- virtual void checkNewMail(callback &callback)=0;
- //
- // Explicitly check for any new mail if a folder is currently open.
- // A call to mail::account::checkNewMail() invokes mail::folderCallback's
- // methods to reflect any changes to the currently open folder.
- // mail::folderCallback::newMessages() will be invoked if new messages
- // were added to the folder. mail::folderCallback::messagesRemoved()
- // will be invoked if messages were removed from a folder (perhaps
- // by another application doing updateFolderIndexInfo, and
- // mail::folderCallback::messageChanged() may be invoked to reflect
- // changes to existing messages.
-
- virtual bool hasCapability(std::string capability)=0;
- virtual std::string getCapability(std::string capability)=0;
- //
- // Indicate whether this mail::account object supports the indicated
- // capability.
-
- virtual class folder *folderFromString(std::string)=0;
- //
- // The opposite of mail::folder::toString(). Creates a new
- // mail::folder object. The mail::folder object is linked to this
- // mail::account object, and may only be used as argument to this mail::account
- // object's methods.
- // Note that the returned object does not imply that the actual
- // folder exists, only that if it does exist then the new
- // mail::folder object may be used to refer to it.
-
- virtual void readTopLevelFolders(callback::folderList
- &callback1,
- callback &callback2)=0;
- // Enumerate the topmost mail folders available in this mail account.
- // callback1.success() is invoked to enumerate the folders at the
- // top level of the folder hierarchy.
-
- virtual void findFolder(std::string path,
- callback::folderList &callback1,
- callback &callback2)=0;
- // Recreate a folder object.
- //
- // path - the folder's known path -- can be obtained by invoking
- // mail::folder::getPath().
- //
- // name - the name of this folder, in the application charset.
-
- virtual std::string translatePath(std::string path)=0;
- //
- // Take a "human readable" path, and return its server representation.
- // For example: IMAP accounts translate path from the local charset
- // to modified-UTF7.
- //
- // Returns an empty string if the original path was invalid
- // (setting errno accordingly). A non-empty return does not guarantee
- // an existing folder, merely that the path is valid.
-
-
-
- virtual folder *getSendFolder(const smtpInfo &info,
- const mail::folder *folder,
- std::string &errmsg);
- //
- // Create a folder object to be used for sending outgoing
- // mail.
- //
- // info - parameters for sending mail
- //
- // folder - if not NULL, file a CC of the message into this folder
- //
- // errmsg - if this mail account login cannot be used for sending
- // mail, getSendFolder() returns a null ptr, and sets errmsg
- // accordingly.
-
-
- enum MessageAttributes {
- ARRIVALDATE=1,
- MESSAGESIZE=2,
- ENVELOPE=4,
- MIMESTRUCTURE=8};
-
- virtual void readMessageAttributes(const std::vector<size_t> &messages,
- MessageAttributes attributes,
- callback::message
- &callback)=0;
- //
- // Return metadata about messages in the currently open folder.
- //
- // messages - a list of messages whose metadata should be returned.
- //
- // attributes - which attributes to return. A logical OR of the
- // enumerated constant. Each constant directly translates to a
- // method in the mail::callback::message object. If multiple
- // messages are specified the order of messages for whom the
- // the attributes are returned is arbitrary. If multiple attrs
- // are specified the order in which the attributes are returned is
- // arbitrary.
- // With multiple messages and attributes, any order is possible.
- // It's possible that all attributes for the same message are
- // returned before the attributes for the next message are
- // returned; or the attribute for all messages are returned before
- // returning the next attribute for all messages, etc...
- //
- // ARRIVALDATE - when the message was added to the
- // folder (messageArrivalDateCallback).
- //
- // MESSAGESIZE - approximate message size (may not be
- // exact, may be just a rough estimate --
- // messageSizeCallback).
- //
- // ENVELOPE - message envelope/thread summary
- // (messageEnvelopeCallback, maybe
- // messageReferencesCallback).
- //
- // MIMESTRUCTURE - message's MIME structure
- // (messageStructureCallback).
- //
-
- virtual void readMessageContent(const std::vector<size_t> &messages,
- bool peek,
- enum mail::readMode readType,
- callback::message
- &callback)=0;
-
- //
- // Return the entire header and/or body content of one or more
- // messages.
- //
- // messages - a list of messages whose contents are returned.
- // peek - if true, do not reset the unread flag, if possible.
- // justHeader - return the contents of the header portion of the
- // message.
- // justContents - return the contents of the body portion of each
- // message.
- // mail::callback::message - the messageTextCallback method of
- // this object is invoked for each listed message. The relative
- // order of messages is arbitrary, but the requested contents of
- // each message are returned in their entirety before returning the
- // contents of the next message.
- //
- // Either justHeader or justContents (or both) must be set. If
- // only justHeader is set (justContents is not set), header lines are
- // automatically folded.
-
- virtual void readMessageContent(size_t messageNum,
- bool peek,
- const class mimestruct &msginfo,
- enum mail::readMode readType,
- callback::message
- &callback)=0;
- //
- // Return the contents of a MIME section of a message.
- // messageNum - the message whose contents are returned.
- // peek - do not reset the unread flag, if possible
- // msgInfo - the MIME section whose contents to be returned.
- // justHeader - return the contents of the header portion of the
- // message.
- // justContents - return the contents of the body portion of each
- // message.
- //
- // Either justHeader or justContents (or both) must be set. If
- // only justHeader is set (justContents is not set), header lines are
- // automatically folded.
-
- virtual void readMessageContentDecoded(size_t messageNum,
- bool peek,
- const class mimestruct
- &msginfo,
- callback::message
- &callback)=0;
- //
- // Return the decoded contents of a MIME section. Like
- // readMessageContents, except that base64/quoted-printable content
- // is automatically decoded, and callback.messageTextCallback()
- // gets the raw, decoded, contents.
- //
- // messageNum - the message whose contents are returned.
- // peek - do not reset the unread flag, if possible
- // msgInfo - the MIME section whose contents to be returned.
-
- virtual size_t getFolderIndexSize()=0;
- //
- // Return the number of messages in the currently opened folders.
- // The message number arguments to the previous functions should range
- // should range between 0 and one less than the return value from
- // getFolderIndexSize()
- //
-
- virtual class messageInfo getFolderIndexInfo(size_t)=0;
- //
- // Return the mail::messageInfo structure for an indicated message.
- //
-
- virtual void saveFolderIndexInfo(size_t messageNum,
- const messageInfo &msgInfo,
- callback &callback)=0;
- //
- // Reflect updated message flags.
- //
- // messageNum - update flags of this message
- // msgInfo - new message flags.
-
-
- virtual void updateFolderIndexFlags(const std::vector<size_t> &messages,
- bool doFlip,
- bool enableDisable,
- const messageInfo &flags,
- callback &callback)=0;
- //
- // Update flags of multiple messages.
- //
- // messages - list of messages whose flags are to be updated.
- //
- // doFlip - flip the state of the indicated flags
- //
- // enableDisable - whether the indicated flags should be set, or
- // cleared (ignored if doFlip is set)
- //
- // flags - which flags should be changed. The flags structure is
- // NOT saved for each indicated message, instead the action specified
- // by doFlip/enableDisable is applied to each flag set in the flags
- // object.
-
- virtual void updateFolderIndexInfo(callback &)=0;
- //
- // Remove deleted messages.
-
-
- virtual void removeMessages(const std::vector<size_t> &messages,
- callback &cb)=0;
- // Remove specified messages
-
-
-
- // Update keywords
- virtual void updateKeywords(const std::vector<size_t> &messages,
- const std::set<std::string> &keywords,
- bool setOrChange,
- // false: set, true: see changeTo
- bool changeTo,
- callback &cb);
-
- // Variations of the above. Implemented in the base class.
-
- void updateKeywords(const std::vector<size_t> &messages,
- const std::vector<std::string> &keywords,
- bool setOrChange,
- // false: set, true: see changeTo
- bool changeTo,
- callback &cb);
-
- void updateKeywords(const std::vector<size_t> &messages,
- const std::list<std::string> &keywords,
- bool setOrChange,
- // false: set, true: see changeTo
- bool changeTo,
- callback &cb);
-
- virtual void getFolderKeywordInfo(size_t, std::set<std::string> &);
-
- //
- // Application requests to be notified about folder changes
- // immediately, if possible (IMAP IDLE)
- //
-
- virtual void updateNotify(bool enableDisable, callback &callbackArg);
-
- //
- // Update the folder according to the flags on each message.
- // Generally, each message with the deleted flag is set gets removed
- // from the folder. Additionally, updateFolderIndexInfo() usually
- // results in the applicatio notified regarding any changes to the
- // folder's contents, via mail::folderCallback's methods.
-
- virtual void copyMessagesTo(const std::vector<size_t> &messages,
- folder *copyTo,
- callback &callback)=0;
- //
- // Copy messages to another folder
- //
- // messages - which message to copy
- // copyTo - a folder from the same, or another mail account.
-
-
- virtual void moveMessagesTo(const std::vector<size_t> &messages,
- mail::folder *copyTo,
- mail::callback &callback);
- //
- // Like copyMessagesTo(), except that the messages are moved, not
- // copied (invoking mail::folderCallback::messagesRemoved()
- // appropriate.
- // Subclasses may override. The generic implementation uses
- // copyMessagesTo(), followed by removeMessages
-
-
- virtual void searchMessages(const searchParams &searchInfo,
- searchCallback &callback)=0;
- //
- // Search messages in this folder.
- //
- // searchInfo - specified the search criteria
- //
- // callback - callback object that receives the list of messages
- // that fit the search criteria
-};
-
-// gcc food
-
-inline account::MessageAttributes operator| (account::MessageAttributes a,
- account::MessageAttributes b)
-{
- return (account::MessageAttributes)((int)a | (int)b);
-}
-
-inline account::MessageAttributes operator& (account::MessageAttributes a,
- account::MessageAttributes b)
-{
- return (account::MessageAttributes)((int)a & (int)b);
-}
-
-inline account::MessageAttributes &operator&= (account::MessageAttributes &a,
- account::MessageAttributes b)
-{
- return (a=(account::MessageAttributes)((int)a & (int)b));
-}
-
-inline account::MessageAttributes operator~ (account::MessageAttributes a)
-{
- return (account::MessageAttributes)~(int)a;
-}
-
-//
-// A folder object represents a folder in a mail account. Each mail::folder
-// object is linked to the mail::account object that created it.
-
-class folder : public obj {
-
- ptr<mail::account> myServer;
-
-protected:
- bool isDestroyed(callback &callback) const;
- bool isDestroyed() const;
-
- folder(const folder &); // UNDEFINED
- folder &operator=(const folder &o)
- {
- myServer=o.myServer;
- return *this;
- }
-
-public:
-
- // Applications should not use the constructor directly, but instead
- // should use other methods in the mail::account and mail::folder objects
- // to create instances of mail::folder. Applications can destroy
- // mail::folder objects at any time where the object is not an
- // argument to an uncompleted request.
-
- folder(mail::account *);
- virtual ~folder();
-
- virtual void sameServerAsHelperFunc() const=0;
- //
- // For internal use.
- //
-
- virtual std::string getName() const=0;
- //
- // Return the name of the folder, in the application character set.
-
- virtual std::string getPath() const=0;
- //
- // Return the folder's path. Applications should consider paths to
- // be complete opaque strings, for libmail.a's internal use only.
- // The only officially blessed usage for paths is as arguments for
- // mail::account::findFolder, and mail::folder::isParentOf().
-
- virtual bool hasMessages() const=0;
- //
- // Return an indication whether this folder can contain message.
-
- virtual bool hasSubFolders() const=0;
- //
- // Return an indication whether this folder can contain subfolders.
-
- virtual std::string isNewsgroup() const;
- //
- // Returns a non-empty string if this is a newsgroup, with the
- // string being the newsgroup name.
-
- virtual bool isParentOf(std::string path) const=0;
- // True if this folder would be considered a parent folder in the
- // folder hierarchy.
- //
- // path - the path of another folder.
-
- virtual void hasMessages(bool)=0;
- virtual void hasSubFolders(bool)=0;
- //
- // For internal use only
-
- virtual void readFolderInfo( callback::folderInfo
- &callback1,
- callback &callback2) const=0;
- // Return folder metadata, such as the size of this folder
-
-
- virtual void getParentFolder(callback::folderList &callback1,
- callback &callback2) const=0;
-
- // Return parent folder
-
- virtual void readSubFolders( callback::folderList &callback1,
- callback &callback2)
- const=0;
- // Enumerate any subfolders in this folder
-
- virtual mail::addMessage
- *addMessage(callback &callback) const=0;
- //
- // Add a new message to this folder. Returns a mail::addMessage
- // object.
- //
- // callback - the usual callback object.
- //
- // If addMessage() returns NULL, callback.fail() will be invoked to
- // indicate the reason why. Otherwise, the new message's metadata
- // should be saved in the mail::addMessage's fields.
- // The message's contents must be passed to saveMessageContents()
- // (multiple times, if necessary), followed by
- // saveMessageContents::go(). If it becomes necessary to abort
- // the process, saveMessageContents::fail() will hold the presses,
- // invoke callback.fail(), and destroy the mail::addMessage object.
-
-
- virtual void createSubFolder(std::string name, bool isDirectory,
- callback::folderList
- &callback1,
- callback &callback2) const=0;
-
- // Create a new subfolder.
- //
- // name - the name of the new subfolder.
- // isDirectory - if true, the subfolder is expected to contain
- // subfolders. To create a folder that should contain both subfolders
- // and messages do this twice, first with isDirectory set to false,
- // then with isDirectory set to true. Note that not every mail
- // account supports dual-purpose folders.
- // callback1 - if succesfully, callback1.success() gets invoked with
- // a folder list containing the new folder directory entry.
-
- virtual void create(bool isDirectory,
- callback &callback) const=0;
- //
- // An alternative path to create a new folder is to use
- // mail::account::folderFromString() to create a folder object for a
- // folder that doesn't really exist, then use this method to create
- // the new folder.
-
- virtual void destroy(callback &callback, bool destroyDir)
- const=0;
- //
- // The opposite of create() - deletes this folder. destroyDir should
- // be set to indicate if this folder contains subfolders or messages.
- // For dual-purpose folders, only the folder component represented
- // by destroyDir() gets removed.
-
- virtual void renameFolder(const folder *newParent, std::string newName,
- callback::folderList &callback1,
- callback &callback2) const=0;
- // Rename this folder.
- //
- // newParent - new parent folder, or NULL if folder should be renamed
- // to the top of the hierarcy tree
- // newName - new folder name, in application charset
- //
-
-
- virtual folder *clone() const=0;
- //
- // Create another mail::folder object that refers to the same
- // folder.
-
- virtual std::string toString() const=0;
- //
- // Convert this folder's identity to a single string. Applications
- // should consider the string to be a completely opaque string; with
- // its only documented purpose is that passing the string to
- // mail::account::folderFromString() will create a mail::folder object that
- // refers to the same folder that this object refers to.
-
- virtual void open(callback &openCallback,
- snapshot *restoreSnapshot,
- callback::folder &folderCallback) const=0;
- //
- // Open the messages in this folder. Any existing open folder is
- // automatically closed. If the open fails, whether an existing folder
- // remains open is undefined.
- //
- // openCallback - the standard callback method whose methods will be
- // invoked to indicate whether the operation succeeded or not.
- //
- // If not NULL, a pointer to a snapshot object that holds a previously
- // saved folder index snapshot (see callback::folder::saveSnapshot).
- //
- //
- // folderCallback - the object whose methods will be invoked to notify
- // of any changes to the folder's state while it is opened. This
- // object must not be destroyed, and must continue to exist until
- // either another folder's open request succeeds, or the mail account
- // is closed or disconnected.
-
-
- // --------- Access control list support ---------- //
-
- virtual void getMyRights(callback &getCallback, std::string &rights)
- const;
- virtual void getRights(callback &getCallback,
- std::list<std::pair<std::string, std::string> >
- &rights)
- const;
-
- virtual void setRights(callback &setCallback,
- std::string &errorIdentifier,
- std::vector<std::string> &errorRights,
- std::string identifier,
- std::string rights)
- const;
- virtual void delRights(callback &setCallback,
- std::string &errorIdentifier,
- std::vector<std::string> &errorRights,
- std::string identifier)
- const;
-
-
- // Helper function for sorting folders.
-
- class sort {
-
- bool foldersFirst;
- public:
- sort(bool foldersFirstArg);
- ~sort();
-
- bool operator()(const folder *a, const folder *b);
- };
-};
-
-//
-// A mail::callback::disconnect() object is provided for each request to
-// open a mail account.
-// When the connection to the mail account's server terminates, the object's
-// disconnected() method is invoked. If the connection was abnormally
-// terminated, the errmsg string will be empty.
-// The servererror() method may be invoked at any time to report a critical
-// server error that was not severe enough to force the connection to be
-// terminated.
-
-class callback::disconnect {
-public:
- disconnect() {}
- virtual ~disconnect() {}
- virtual void disconnected(const char *errmsg)=0;
- virtual void servererror(const char *errmsg)=0;
-};
-
-//
-// Callbacks for readMessageContent():
-//
-
-class callback::message : public callback {
-public:
- message();
- virtual ~message();
-
- virtual void messageEnvelopeCallback(size_t messageNumber,
- const envelope
- &envelopeArg);
-
- virtual void messageReferencesCallback(size_t messageNumber,
- const std::vector<std::string>
- &references);
-
- virtual void messageArrivalDateCallback(size_t messageNumber,
- time_t datetime);
-
- virtual void messageSizeCallback(size_t messageNumber,
- unsigned long size);
-
- virtual void messageStructureCallback(size_t messageNumber,
- const mimestruct
- &messageStructure);
- virtual void messageTextCallback(size_t n, std::string text);
-
-};
-
-//
-// A callback for readTopLevelFolders/readSubFolders:
-// This callback object is also used for creating a new folder. A
-// mail::callback::folderList object is provided when creating a new folder.
-// The success() method is invoked with a vector containing exactly one
-// mail::folder object, representing the newly-created folder.
-//
-// NOTE: The mail::folder objects provided to the success() method are valid
-// only until the success method() terminates, and are IMMEDIATELY destroyed
-// afterwards. If the callback function needs to preserve a mail::folder
-// object (perhaps for the application's main code, later, after it checks
-// that this request completed succesfully and needs to do something else to
-// the folder) it should use mail::folder::clone() method to create its own
-// private copy of the mail::folder object.
-
-class callback::folderList {
-public:
- folderList();
- virtual ~folderList();
- virtual void success(const std::vector<const mail::folder *>
- &folders)=0;
-};
-
-/////////////////////////////////////////////////////////////////////
-//
-// Information about a folder
-
-class callback::folderInfo {
-public:
- size_t messageCount;
- size_t unreadCount;
-
- bool fastInfo;
- // Initialize to TRUE to only do this if it can be done fast.
-
- folderInfo();
- virtual ~folderInfo();
-
- virtual void success();
-};
-
-/////////////////////////////////////////////////////////////////////
-//
-// A reference to the following object is saved when a folder is opened
-//
-// The object should be subclassed, and virtual methods implemented.
-//
-// libmail.a uses the object to notify the application about any changes
-// to the contents of the folder. The application should expect any of
-// the following methods to be invoked at any time. However, the methods
-// are usually invoked by mail::account::saveFolderIndexInfo(),
-// mail::account::updateFolderIndexFlags(), mail::account::updateFolderIndexInfo(),
-// and mail::account::checkNewMail(). Additionally, if the 'peek' argument to
-// mail::account::readMessageContents(), and mail::account::readMessageContentsDecoded() is
-// false, mail::folderCallback::messageChanged() will be invoked to indicate
-// that the message's unread flag has been reset.
-//
-// However, the application must be prepared to deal with any method being
-// invoked at any time, in the event that the mail account allows the same
-// folder to be opened by multiple applications, and another applications
-// makes changes to the folder.
-
-class callback::folder {
-public:
- folder();
- virtual ~folder();
-
- virtual void newMessages()=0;
- //
- // New messages have been added to the folder. The application
- // should use mail::account::getFolderIndexSize() to obtain the current
- // folder size, and compare it with the previously known folder
- // size in order to determine newly-added messages.
-
- virtual void messagesRemoved(std::vector< std::pair<size_t, size_t> >
- &)=0;
- //
- // Messages were removed from the folder. messagesRemoved() receives
- // a reference to an array of first-last pairs. Each first-last
- // pair specifies a range of messages removed from the folder index.
- // <3, 5> indicates that messages 3, 4, and 5 were removed,
- // <3, 3> indicates that message #3 was removed.
- //
- // The array is sorted in numerically increasing order.
-
- virtual void messageChanged(size_t n)=0;
- //
- // Message metadata has changed. Use mail::account::getFolderIndexInfo()
- // to obtain the updated set of message flags.
-
- virtual void saveSnapshot(std::string snapshotId);
- // Optionally cache the current folder index (getFolderIndexInfo()),
- // as snapshot "snapshotId"
-
-};
-
-//
-// libmail.a collects the following metadata about each message, when
-// a folder is opened.
-// The application is notified via mail::folderCallback::messageChanged()
-// about any changes to an existing message's metadata.
-// NOTE: this includes changes initiated by the application itself.
-// For example, mail::folderCallback::messageChanged() will usually be
-// invoked before the mail::account::saveFolderIndexInfo() request completes
-// Any changes to the following metadata are
-// The folder index.
-
-class messageInfo {
-public:
-
- std::string uid;
- //
- // A unique ID is assigned to each message in a folder. Applications
- // must consider the uid value to be a completely opaque string.
- // The only assumption that applications may make is that no two
- // messages will ever have the same uid in the same folder.
- // Not all mail accounts support the following flags. Where not,
- // libmail.a will simulate the semantics of the flag while the
- // mail account is opened.
-
- bool draft, // This is a draft message
- replied, // This message has been replied to
- marked, // This message is marked for further processing
- deleted, // Marked for deletion (updateFolderIndexInfo()
- // should end up removing this message
-
- unread, // The contents of this message have not been read.
- recent; // This is the first time the folder has been opened
- // with this message in the folder.
-
-
-#define LIBMAIL_MSGFLAGS \
- do { \
- DOFLAG( FLAG, draft, "\\DRAFT"); \
- DOFLAG( FLAG, replied, "\\ANSWERED"); \
- DOFLAG( FLAG, marked, "\\FLAGGED"); \
- DOFLAG( FLAG, deleted, "\\DELETED"); \
- DOFLAG(NOTFLAG, unread, "\\SEEN"); \
- } while (0)
-
-#define LIBMAIL_SMAPFLAGS \
- do {\
- DOFLAG( FLAG, draft, "DRAFT");\
- DOFLAG( FLAG, replied, "REPLIED");\
- DOFLAG( FLAG, deleted, "DELETED");\
- DOFLAG( FLAG, marked, "MARKED");\
- DOFLAG(NOTFLAG, unread, "SEEN");\
- } while (0)
-
- messageInfo();
-
- ~messageInfo();
-
- operator std::string() const;
- messageInfo(std::string);
-};
-
-LIBMAIL_END
-
-#endif