diff options
Diffstat (limited to 'libmail/nntp.H')
| -rw-r--r-- | libmail/nntp.H | 336 | 
1 files changed, 336 insertions, 0 deletions
| diff --git a/libmail/nntp.H b/libmail/nntp.H new file mode 100644 index 0000000..e644f52 --- /dev/null +++ b/libmail/nntp.H @@ -0,0 +1,336 @@ +/* +** Copyright 2003-2008, Double Precision Inc. +** +** See COPYING for distribution information. +*/ +#ifndef libmail_nntp_H +#define libmail_nntp_H + +#include "libmail_config.h" +#include	"mail.H" +#include	<sys/types.h> + +#include	"maildir/maildirkeywords.h" + +#include	"logininfo.H" +#include	"fd.H" +#include	"generic.H" +#include	"search.H" +#include	<stdio.h> +#include	<time.h> +#include	<string> +#include	<map> +#include	<list> +#include	<vector> + +/////////////////////////////////////////////////////////////////////////// +// +// An NNTP implementation +// + +LIBMAIL_START + +////////////////////////////////////////////////////////////////////////////// + +class nntp : public fd, public generic { + +public: +	class newsrc; +	typedef unsigned long msgnum_t; + +private: + +	time_t timeoutSetting; +	time_t autologoutSetting; + +	loginInfo nntpLoginInfo; + +	loginInfo savedLoginInfo; + +	time_t inactivityTimeout; + +	callback::folder *folderCallback; + +	void resumed(); +	void handler(std::vector<pollfd> &fds, int &timeout); +	int socketRead(const std::string &readbuffer); + +	void disconnect(const char *reason); + +	// Superclass of NNTP tasks.  Methods create subclasses of Task +	// objects, and push them to the tasks queue.  Replies from the +	// NNTP server are routed to the foremost Task on the queue. + +	class Task { + +	protected: +		callback *callbackPtr;	// App callback. +		nntp * volatile myserver; +		// Marked volatile due to destructor monkey business + +	public: +		time_t defaultTimeout; + +		virtual void done(); +		// Task completed, start the next task on the queue, +		// and delete this Task object. + +		void resetTimeout(); + +		virtual void success(std::string); +		virtual void fail(std::string); +		// success/fail for use by subclasses.  Invoke the callback +		// method, then done. + +		Task(callback *callbackArg, +		     nntp &myserverArg); +		virtual ~Task(); + +		virtual int getTimeout(); +		// How long before this task times out. + +		virtual void emptyQueue(); +		// After removing this task, the task queue is now empty + +		virtual void serverResponse(const char *message)=0; +		// Process a line of text from the server + +		virtual void disconnected(const char *reason); +		// Server has disconnected. +		// The default implementation takes this task off the queue, +		// calls the next Task's disconnect method, then deletes +		// itself. + +		virtual void installedTask(); +		// This task is now at the front of the queue +	}; + +	std::list<Task *> tasks; + +	std::vector<std::string> newgroups; +	bool hasNewgroups; + +	std::map<std::string, newsrc> cachedNewsrc; +	bool didCacheNewsrc; + +	void cacheNewsrc(); +	bool updateCachedNewsrc(); +	void discardCachedNewsrc(); +	bool updateOpenedNewsrc(newsrc &); + +	void createNewsrc(newsrc &); + +	class cachedNewsrcSort; + +	class folder; +	class add; +	class LoggedInTask; +	class LoginTask; +	class LogoutTask; +	class ListActiveTask; +	class GroupTask; +	class GroupInfoTask; +	class GroupOpenTask; +	class FetchTask; +	class FetchTaskBase; +	class CacheMessageTask; +	class CacheTask; +	class XoverTask; +	class PostTask; +	class CheckNewTask; + +	class XpatTask; +	class XpatTaskCallback; + +	std::string newsrcFilename;	// .newsrc file + +	std::string openedGroup; // Group we have logically opened + +	// Here's the index of an opened group.  'cause Usenet groups can +	// be fairly large, we try to be extra skimpy on memory usage. + +	class nntpMessageInfo { +	public: +		nntpMessageInfo(); +		~nntpMessageInfo(); +		msgnum_t msgNum; + +		mail::keywords::Message keywords; + +		unsigned char msgFlag; +#define IDX_DELETED 1 +#define IDX_FLAGGED 2 + +#define IDX_SEARCH  128  // Flag used to mark msgs found by search +	}; + +private: +	static bool equalMsgNums(nntpMessageInfo a, +				 nntpMessageInfo b); + +public: +	mail::keywords::Hashtable keywordHashtable; +	std::vector<nntpMessageInfo> index; + +	msgnum_t loWatermark, hiWatermark; // Saved from last GROUP + +	std::string serverGroup; // Group actually open on the server + +	callback::disconnect *disconnectCallback; + +	void installTask(Task *); +public: + +	friend class Task; +	friend class LoggedInTask; +	friend class folder; +	friend class LogoutTask; +	friend class ListActiveTask; +	friend class GroupTask; +	friend class GroupInfoTask; +	friend class GroupOpenTask; +	friend class FetchTask; +	friend class FetchTaskBase; +	friend class CacheMessageTask; +	friend class CacheTask; +	friend class XoverTask; +	friend class add; +	friend class PostTask; +	friend class CheckNewTask; +	friend class XpatTask; +	friend class XpatTaskCallback; + +	nntp(std::string url, std::string passwd, +	     std::vector<std::string> &certificates, +	     std::string newsrcFilename, +	     mail::loginCallback *loginCallbackFunc, +	     callback &callback, +	     callback::disconnect &disconnectCallbackArg); + +	nntp(const nntp &); // UNDEFINED +	nntp &operator=(const nntp &); // UNDEFINED + +	~nntp(); + +	void logout(callback &callback); + +	void checkNewMail(callback &callback); +	bool hasCapability(std::string capability); +	std::string getCapability(std::string capability); + +	mail::folder *folderFromString(std::string); + +	void readTopLevelFolders(callback::folderList &callback1, +				 callback &callback2); +	void findFolder(std::string folder, +			class callback::folderList &callback1, +			class callback &callback2); +	std::string translatePath(std::string path); + +	mail::folder *getSendFolder(const smtpInfo &info, +				    const mail::folder *folder, +				    std::string &errmsg); + +	void readMessageAttributes(const std::vector<size_t> &messages, +				   MessageAttributes attributes, +				   callback::message &callback); + +	void readMessageContent(const std::vector<size_t> &messages, +				bool peek, +				enum mail::readMode readType, +				callback::message &callback); + +	void readMessageContent(size_t messageNum, +				bool peek, +				const mimestruct &msginfo, +				enum mail::readMode readType, +				callback::message &callback); + +	void readMessageContentDecoded(size_t messageNum, +				       bool peek, +				       const mimestruct &msginfo, +				       callback::message &callback); + +	size_t getFolderIndexSize(); +	messageInfo getFolderIndexInfo(size_t); + +	void saveFolderIndexInfo(size_t, +				 const messageInfo &, +				 callback &); + +	void updateFolderIndexFlags(const std::vector<size_t> &messages, +				    bool doFlip, +				    bool enableDisable, +				    const messageInfo &flags, +				    callback &callback); + +	void updateFolderIndexInfo(callback &); + +	void getFolderKeywordInfo(size_t, std::set<std::string> &); + +	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); +private: +	bool genericProcessKeyword(size_t msgNum, +				   updateKeywordHelper &helper); +public: +	void removeMessages(const std::vector<size_t> &messages, +			    callback &cb); + +	void copyMessagesTo(const std::vector<size_t> &messages, +			    mail::folder *copyTo, +			    callback &callback); + +	void searchMessages(const searchParams &searchInfo, +			    searchCallback &callback); + +	void saveSnapshot(); +private: +	void searchMessagesXpat(std::string hdr, std::string srch, +				bool searchNot, +				searchParams::Scope searchScope, +				size_t rangeLo, size_t rangeHi, +				searchCallback &callback); + +	bool fixGenericMessageNumber(std::string uid, size_t &messageNumber); + +	void genericMessageRead(std::string uid, +				size_t messageNumber, +				bool peek, +				mail::readMode readTypeArg, +				callback::message &callback); + +	void genericMessageSize(std::string uid, +				size_t messageNumber, +				callback::message &callback); + +	void genericGetMessageFd(std::string uid, +				 size_t messageNumber, +				 bool peek, +				 int &fdRet, +				 callback &callback); +	void genericMarkRead(size_t messageNumber); + +	void genericGetMessageStruct(std::string uid, +				     size_t messageNumber, +				     struct rfc2045 *&structRet, +				     callback &callback); + +	bool genericCachedUid(std::string uid); + +	// One message is cached to a temp file, and parsed. + +	std::string cachedUid; +	FILE *genericTmpFp; +	struct rfc2045 *genericTmpRfcp; + +	void cleartmp(); +}; + +LIBMAIL_END + +#endif | 
