1 /*
2 ** Copyright 2003-2004, Double Precision Inc.
3 **
4 ** See COPYING for distribution information.
5 */
6 #ifndef libmail_tmpaccount_H
7 #define libmail_tmpaccount_H
8 
9 #include "libmail_config.h"
10 #include "mail.H"
11 #include "generic.H"
12 #include "addmessage.H"
13 
14 #include "rfc2045/rfc2045.h"
15 #include <stdio.h>
16 
17 LIBMAIL_START
18 
19 //
20 // The tmp: driver - a driver that uses a temporary file that holds exactly
21 // one message.
22 // The driver provides a single folder, INBOX.  Adding a message to the
23 // folder automatically expunges the previous message.
24 //
25 
26 class tmpaccount : public account, public generic {
27 
28 	void resumed();
29 	void handler(std::vector<pollfd> &fds, int &timeout);
30 
31 	callback::disconnect *disconnect_callback;
32 	callback::folder *folder_callback;
33 	FILE *f;
34 	struct rfc2045 *rfc2045p;
35 	messageInfo fInfo;
36 
37 	void disconnect(const char *);
38 
39 	class folder : public mail::folder {
40 
41 		tmpaccount *account;
42 
43 		static void na(callback &);
44 	public:
45 		folder(tmpaccount *);
46 		~folder();
47 
48 		bool isParentOf(std::string path) const;
49 
50 		void hasMessages(bool);
51 		void hasSubFolders(bool);
52 		void readFolderInfo( callback::folderInfo
53 				     &callback1,
54 				     callback &callback2) const;
55 		void getParentFolder(callback::folderList &callback1,
56 				     callback &callback2) const;
57 		void readSubFolders( callback::folderList &callback1,
58 				     callback &callback2) const;
59 
60 		mail::addMessage *addMessage(callback &callback) const;
61 
62 		void createSubFolder(std::string name, bool isDirectory,
63 				     callback::folderList
64 				     &callback1,
65 				     callback &callback2) const;
66 		void create(bool isDirectory,
67 			    callback &callback) const;
68 
69 		void destroy(callback &callback, bool destroyDir) const;
70 
71 		void renameFolder(const mail::folder *newParent,
72 				  std::string newName,
73 				  callback::folderList &callback1,
74 				  callback &callback2) const;
75 
76 		folder *clone() const;
77 
78 		std::string toString() const;
79 
80 		void open(callback &openCallback,
81 			  snapshot *restoreSnapshot,
82 			  callback::folder &folderCallback) const;
83 
84 		void sameServerAsHelperFunc() const;
85 
86 		std::string getName() const;
87 		std::string getPath() const;
88 		bool hasMessages() const;
89 		bool hasSubFolders() const;
90 	};
91 
92 	class add : public addMessage {
93 
94 		FILE *newFile;
95 		struct rfc2045 *rfc2045p;
96 
97 		tmpaccount *account;
98 		mail::callback &cb;
99 	public:
100 		add(tmpaccount *accountArg, mail::callback &cbArg);
101 		~add();
102 		virtual void saveMessageContents(std::string);
103 		virtual void go();
104 		virtual void fail(std::string errmsg);
105 	};
106 
107 public:
108 
109 	friend class mail::tmpaccount::folder;
110 	friend class mail::tmpaccount::add;
111 
112 	tmpaccount(callback::disconnect &disconnect_callbackArg);
113 	virtual ~tmpaccount();
114 
115 	void logout(callback &callback);
116 	void checkNewMail(callback &callback);
117 
118 	bool hasCapability(std::string capability);
119 	std::string getCapability(std::string capability);
120 	mail::folder *folderFromString(std::string);
121 	void readTopLevelFolders(callback::folderList &callback1,
122 				 callback &callback2);
123 	void findFolder(std::string path,
124 			callback::folderList &callback1,
125 			callback &callback2);
126 	std::string translatePath(std::string path);
127 
128 
129 	void readMessageAttributes(const std::vector<size_t> &messages,
130 				   MessageAttributes attributes,
131 				   callback::message &callback);
132 	void readMessageContent(const std::vector<size_t> &messages,
133 				bool peek,
134 				enum mail::readMode readType,
135 				callback::message &callback);
136 
137 	void readMessageContent(size_t messageNum,
138 				bool peek,
139 				const class mimestruct &msginfo,
140 				enum mail::readMode readType,
141 				callback::message &callback);
142 
143 	void readMessageContentDecoded(size_t messageNum,
144 				       bool peek,
145 				       const class mimestruct
146 				       &msginfo,
147 				       callback::message &callback);
148 	size_t getFolderIndexSize();
149 
150 	messageInfo getFolderIndexInfo(size_t);
151 	void saveFolderIndexInfo(size_t messageNum,
152 				 const messageInfo &msgInfo,
153 				 callback &callback);
154 	void updateFolderIndexFlags(const std::vector<size_t> &messages,
155 				    bool doFlip,
156 				    bool enableDisable,
157 				    const messageInfo &flags,
158 				    callback &callback);
159 
160 	void updateFolderIndexInfo(callback &);
161 	void removeMessages(const std::vector<size_t> &messages,
162 			    callback &cb);
163 	void copyMessagesTo(const std::vector<size_t> &messages,
164 			    mail::folder *copyTo,
165 			    callback &callback);
166 	void searchMessages(const searchParams &searchInfo,
167 			    searchCallback &callback);
168 
169 
170 
171 
172 	void genericMessageRead(std::string uid,
173 				size_t messageNumber,
174 				bool peek,
175 				mail::readMode readType,
176 				mail::callback::message &callback);
177 
178 	void genericMessageSize(std::string uid,
179 				size_t messageNumber,
180 				mail::callback::message &callback);
181 
182 	void genericGetMessageFd(std::string uid,
183 				 size_t messageNumber,
184 				 bool peek,
185 				 int &fdRet,
186 				 mail::callback &callback);
187 
188 	void genericGetMessageStruct(std::string uid,
189 				     size_t messageNumber,
190 				     struct rfc2045 *&structRet,
191 				     mail::callback &callback);
192 
193 	void genericGetMessageFdStruct(std::string uid,
194 				       size_t messageNumber,
195 				       bool peek,
196 				       int &fdRet,
197 				       struct rfc2045 *&structret,
198 
199 				       mail::callback &callback);
200 
201 	bool genericCachedUid(std::string uid);
202 
203 	void genericMarkRead(size_t messageNumber);
204 };
205 
206 LIBMAIL_END
207 
208 #endif
209