diff options
Diffstat (limited to 'libmail/imap.H')
| -rw-r--r-- | libmail/imap.H | 526 | 
1 files changed, 0 insertions, 526 deletions
| diff --git a/libmail/imap.H b/libmail/imap.H deleted file mode 100644 index 29423b4..0000000 --- a/libmail/imap.H +++ /dev/null @@ -1,526 +0,0 @@ -/* -** Copyright 2002-2008, Double Precision Inc. -** -** See COPYING for distribution information. -*/ -#ifndef libmail_imap_H -#define libmail_imap_H - -#include "libmail_config.h" -#if HAVE_FCNTL_H -#include <fcntl.h> -#endif -#include "mail.H" -#include	<sys/types.h> -#include	<time.h> -#include	<map> -#include	<set> -#include	<queue> - -#include "imapfolders.H" -#include "unicode/courier-unicode.h" -#include "maildir/maildirkeywords.h" -#include "fd.H" - -/////////////////////////////////////////////////////////////////////////// -// -// An IMAP implementation.  Probably the most sophisticated libmail driver, -// primarily because it directly implements every request, instead of -// fobbing off the task to libgeneric. -// - -#define IMAP_UWIMAP	"uwimap" -#define IMAP_COURIER	"courier" -#define	IMAP_CYRUS	"cyrus"   // TODO - -LIBMAIL_START - -class imapSYNCHRONIZE; - -class smapHandler; -class smapAddMessage; - -class imap : public fd { - -private: - -	bool orderlyShutdown; // true - orderly shutdown in progress - -public: -	time_t timeoutSetting; -	time_t noopSetting; -	bool noIdle;		// Manual override - do not use IMAP IDLE - -	const imapFolder *sameServerFolderPtr; -	// helper fld to detect folders linked -	// to this server - -	bool smap; - -	int (smapHandler::*smapProtocolHandlerFunc)(imap &, std::string &); -	unsigned long smapBinaryCount; - -private: - -	int socketRead(const std::string &readbuffer); - -	struct ltstr { -		bool operator()(const char *a, const char *b) const -		{ -			return (strcmp(a,b) < 0); -		} -	}; - -public: -	bool ready(mail::callback &callback); - -	void serverError(const char *errmsg) -	{ -		disconnect_callback.servererror(errmsg); -	} - -	// A number of "handlers" are active at any time, ready to process -	// server responses.  Each handler is identified by a unique name, -	// and all handlers are saved in the following map. - -	typedef std::map<const char*, class imapHandler *, ltstr> -		handlerMapType; - -	handlerMapType handlers; - -	friend class imapFOLDER_COUNT; -	friend class imapSELECT_FLAGS; -	friend class imapSELECT_OK; -	friend class imapSELECT; -private: - -	std::set<std::string> capabilities; // Server capabilities -	std::set<std::string> folderFlags;  // Current folder's available flags - -	std::set<std::string> permanentFlags; -	void setPermanentFlags(std::string::iterator flagb, -			       std::string::iterator flage); - -	class imapHandler *current_handler; -	// Handler the last processed server output. - - -public: -	void fatalError(std::string errmsg); // server connection failed -private: -	size_t cmdcounter; // Counter to generate unique IMAP cmd tags. - -	// An IMAP cmdtag consists of a unique counter portion, followed by -	// handler's name, so when we receive a server response we know which -	// handler is responsible. - -public: - -	// INTERNAL FUNCTIONS - -	mail::keywords::Hashtable keywordHashtable; // Keyword support - -	bool keywordAllowed(std::string); - -	class imapFOLDERinfo *currentFolder; // Currently open folder -	imapSYNCHRONIZE *currentSYNCHRONIZE; // Current synchronization - -	class imapFetchHandler *currentFetch; -	// Current fetch reply in progress. - -	bool wantIdleMode; // True if we want to be in IDLE mode, now - -	void updateNotify(callback *callbackArg); - -	std::queue<imapHandler *> task_queue; -	// Waiting handlers that will be added to the active handler map -	// as soon as all the existing handlers are gone. - -	void installBackgroundTask(imapHandler *handler); -	// Install a new handler unconditionally.  Typically, the handler -	// understands server messages not particular to any command -	// (* EXPUNGE, et al...) - -	void installForegroundTask(imapHandler *handler); -	// Install a pending task, typically a command.  The handler -	// is placed on the task_queue if any other foreground handler is -	// already present.  When the foreground handler is done, the first -	// task is popped off the task_queue, to replace it. - -	void uninstallHandler(imapHandler *handler); -	// The handler's probably done its job. - -	void removeAllHandlers(bool timedOutFlag, const char *errmsg); -	// Possibly a fatal error. -	// timedOutFlag - handlers are removed due to server timeout -	// (all handler's timedOut() method is invoked).  timedOutFlag -	// is false is set when removeAllHandlers() is invoked from the -	// destructor, where we want to clean up only, and we better not -	// trigger any more activity. - -	void remove(imapHandler *handler); -	// Remove a specific handler from the handler map. - -private: -	void insertHandler(imapHandler *handler); -	// Add a handler to the handler map - -public: -	imapHandler *hasForegroundTask(); -	// Indicate whether any foreground tasks are running - -	void imapcmd(std::string cmd, std::string arg); -	// Write a command to the server. - -	void disconnect() -	{ -		disconnect(NULL); -	} - -private: -	void timeoutdisconnect(); -public: -	void disconnect(const char *errmsg); - -	void setCapability(std::string capability); -	void clearCapabilities() { capabilities.clear(); } -	// Utility functions - -	static std::string get_word(std::string::iterator *b, std::string::iterator *e); -	static std::string get_cmdreply(std::string::iterator *b, std::string::iterator *e); - -	static std::string quoteSimple(std::string s); -	static std::string quoteSMAP(std::string s); - -	static inline bool ok(std::string w) -	{ -		return (w == "OK"); -	} - -	void readSubFolders(std::string path, -			    mail::callback::folderList &callback1, -			    mail::callback &callback2); - -	mail::addMessage *addMessage(std::string path, -				     mail::callback &callback); - -	void folderStatus(std::string path, -			  mail::callback::folderInfo &callback1, -			  mail::callback &callback2); - -	void openFolder(std::string path, mail::snapshot *restoreSnapshot, -			mail::callback &openCallback, -			mail::callback::folder &folderCallback); - -	//////////// PUBLIC INTERFACE FUNCTIONS ////////////// - -	// The constructors begins the login process. - -	imap(std::string url, std::string passwd, -	     std::vector<std::string> &certificates, -	     mail::loginCallback *loginCallbackFunc, -	     mail::callback &callback, -	     mail::callback::disconnect &disconnectCallback); - -	imap(const imap &);  // UNDEFINED -	imap &operator=(const imap &); // UNDEFINED -	~imap(); - -	void resumed(); - -	void handler(std::vector<pollfd> &fds, int &timeout); -	// Event loop processing - -	bool hasCapability(std::string capability); -	std::string getCapability(std::string capability); - -	std::string servertype; -	std::string serverdescr; - -	void logout(mail::callback &callback); -	void checkNewMail(mail::callback &callback); - -	std::string messageFlagStr(const mail::messageInfo &indexInfo, -			      mail::messageInfo *oldIndexInfo=NULL, -			      bool *flagsUpdated=NULL); - -	std::vector <imapFolder> namespaces; - -	std::vector <std::string> serverMsgs; // * NO, * OK ALERT... - -private: - -	mail::folder *folderFromString(std::string); -	void readTopLevelFolders(mail::callback::folderList &callback1, -				 mail::callback &callback2); -	void findFolder(std::string folder, -			class mail::callback::folderList &callback1, -			class mail::callback &callback2); -	std::string translatePath(std::string path); - -	folder *getSendFolder(const smtpInfo &info, -			      const mail::folder *folder, -			      std::string &errmsg); - -	size_t getFolderIndexSize(); -	class mail::messageInfo getFolderIndexInfo(size_t); -	void getFolderKeywordInfo(size_t, std::set<std::string> &); - -public: -	// NOT public interface, for friends only: - -	static void addSmapFolderCmd(mail::smapAddMessage *, std::string); - -	void messagecmd(const std::vector<size_t> &messages, std::string parameters, -			std::string operation, -			std::string name, -			mail::callback::message &callback); -	// Message data retrieval function. -	//    messages - which messages to retrieve -	//    parameters - which attributes to retrieve. -	//    operation - the IMAP command name -	// -	// The typical command that the server received would be -	// "name operation [msgset] parameters" (name is the imap tag). - -	class msgSet; - -	void messagecmd(msgSet &messages, std::string parameters, -			std::string operation, -			std::string name, -			mail::callback::message &callback); - -	// Like the above, except that 'messages' is an abstract superclass -	// that's defined as follows: - -	class msgSet { -	public: -		msgSet(); -		virtual ~msgSet(); - -		virtual bool getNextRange(size_t &first, size_t &last)=0; -		// -		// Each time getNextRange is invoked, it should initialize -		// first/last to the starting/ending affected message number, -		// and returns true; or false if no more messages - -	}; - -	// Construct a msgSet from UIDs of indicated messages. -	// -	// UIDs are used in order to handle situations where something -	// got expunged in the middle of multiple fetches (yes, servers -	// shouldn't really do this, but we can handle it). - -	class msgSetRange : public msgSet { - -		std::vector<size_t> msglist; - -		std::vector<size_t>::iterator nextMsg; - -		imap *p; - -		static size_t uidNum(imap *, size_t); - -	public: -		msgSetRange(imap *pArg, const std::vector<size_t> &messages); -		~msgSetRange(); - -		bool getNextRange(size_t &first, size_t &last); -	}; - - -private: - -	// mail::account implementations: - -	void readMessageAttributes(const std::vector<size_t> &messages, -				   MessageAttributes attributes, -				   class mail::callback::message -				   &callback); - -	void readMessageContent(const std::vector<size_t> &messages, -				bool peek, -				enum mail::readMode readType, -				mail::callback::message &callback); - -	void readMessageContent(size_t messageNum, -				bool peek, -				const mimestruct &msginfo, -				enum mail::readMode readType, -				mail::callback::message &callback); - -	void readMessageContentDecoded(size_t messageNum, -				       bool peek, -				       const mimestruct &msginfo, -				       mail::callback::message &callback); - -	void doReadMessageContent(const std::vector<size_t> &messages, -				  bool peek, -				  const class mimestruct *msginfo, -				  mail::readMode getType, -				  mail::callback::message &callback); - -	void saveFolderIndexInfo(size_t messageNum, -				 const mail::messageInfo &indexInfo, -				 mail::callback &callback); - -	void updateFolderIndexFlags(const std::vector<size_t> &messages, -				    bool doFlip, -				    bool enableDisable, -				    const mail::messageInfo &flags, -				    mail::callback &callback); - -	void updateFolderIndexFlags(const std::vector<size_t> &messages, -				    bool enableDisable, -				    const mail::messageInfo &flags, -				    mail::callback &callback); - -	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); -	void updateImapKeywords(const std::vector<size_t> &messages, -				const std::set<std::string> &keywords, -				bool changeTo, -				callback &cb); -	class updateImapKeywordHelper; -public: -	friend class updateImapKeywordHelper; -private: - -	void updateNotify(bool enableDisable, callback &callbackArg); - -	void updateFolderIndexInfo(mail::callback &callback); -	void removeMessages(const std::vector<size_t> &messages, -			    callback &cb); - -	void copyMessagesTo(const std::vector<size_t> &messages, -			    mail::folder *copyTo, -			    mail::callback &callback); - -	void moveMessagesTo(const std::vector<size_t> &messages, -			    mail::folder *copyTo, -			    mail::callback &callback); - -	void searchMessages(const class mail::searchParams &searchInfo, -			    class mail::searchCallback &callback); - -}; - -////////////////////////////////////////////////////////////////////////// -// -// A handler for a server response.  Each time something is read from the -// server, all available handlers' process() method is invoked.  A handler -// should return a non-zero count of consumed bytes from the readbuffer. -// A handler should return zero if readbuffer does not contain a response -// it understands.  If imap finds a handler that consumes some read -// data, it is removed from the readbuffer, and imap tries again -// (in the event the server sent multiple responses). -// -// imap reports a fatal error if no handler claims newline-terminated -// data. -// -// A handler must wait until imap tells it that it can proceed to do -// whatever it needs to do.  imap invokes the installed() method when -// the handler has the floor to itself. -// - -class imapHandler { - -protected: -	imap *myimap; -public: -	bool installedFlag;	// true if this handler is active. - -	bool isBackgroundTask;	// true if this is a background handler - -	int handlerTimeoutVal;		// When this handler times out. - -protected: -	time_t timeoutAt;		// The actual system timestamp. - - public: -	friend class imap; - -	imapHandler(int timeoutValArg=0); -	virtual ~imapHandler(); - -	virtual void installed(imap &)=0; -	virtual void anotherHandlerInstalled(mail::imap &); - -	virtual bool getTimeout(imap &, int &); -	virtual int getTimeout(imap &); -	virtual void setTimeout(); -	virtual void setTimeout(int timeoutVal); -	virtual int process(imap &imapAccount, std::string &buffer)=0; -	virtual const char *getName()=0; - -	virtual void setBackgroundTask(bool flag) { isBackgroundTask=flag; } -	virtual bool getBackgroundTask() const { return isBackgroundTask; } - -	virtual void timedOut(const char *errmsg)=0; - -protected: -	static void callbackTimedOut(mail::callback &callback, -				     const char *errmsg); -}; - -////////////////////////////////////////////////////////////////////////// -// -// A helper class that separates untagged and tagged replies.  The class -// provides an implementation for process().  Subclasses should implement -// untaggedMessage() and/or taggedMessage(). -// - -class imapCommandHandler : public imapHandler { - -public: -	imapCommandHandler(int timeout=0); -	~imapCommandHandler(); - -protected: -	int process(imap &imapAccount, std::string &buffer); - -private: -	// Callback: process an untagged message -	// -	// name: the name of the untagged reply (the first word after '*', -	// uppercase).  If return true, '* name' is removed from the input -	// buffer, and the subclass is expected to have installed its own -	// handler, now. - -	virtual bool untaggedMessage(imap &imapAccount, std::string name)=0; - -	// Callback: process a tagged message -	// -	// name: the tag -	// -	// message: the rest of the message -	// -	// okfail: true if the first word of message is status -	// -	// errmsg: everything following the first word of the message -	// -	// A true return removes the line from the input buffer - -	virtual bool taggedMessage(imap &imapAccount, std::string name, -				   std::string message, -				   bool okfail, std::string errmsg)=0; - -	// -	// Continuation request received. -	// -	// A true return indicates that the continuation request has been -	// processed. -	// - -	virtual bool continuationRequest(imap &imapAccount, -					 std::string request); -}; - -LIBMAIL_END - -#endif | 
