1/*
2 * Copyright 2010-2011, Haiku Inc. All Rights Reserved.
3 * Copyright 2010 Clemens Zeidler. All rights reserved.
4 *
5 * Distributed under the terms of the MIT License.
6 */
7#ifndef IMAP_HANDLER_H
8#define IMAP_HANDLER_H
9
10
11#include <vector>
12
13#include <DataIO.h>
14#include <String.h>
15
16
17class ConnectionReader;
18class IMAPMailbox;
19class IMAPStorage;
20
21
22class IMAPCommand {
23public:
24	virtual						~IMAPCommand();
25
26	virtual	BString				Command();
27	virtual bool				Handle(const BString& response) = 0;
28};
29
30
31class IMAPMailboxCommand  : public IMAPCommand{
32public:
33								IMAPMailboxCommand(IMAPMailbox& mailbox);
34	virtual						~IMAPMailboxCommand();
35
36protected:
37			IMAPMailbox&		fIMAPMailbox;
38			IMAPStorage&		fStorage;
39			ConnectionReader&	fConnectionReader;
40};
41
42
43class MailboxSelectHandler : public IMAPMailboxCommand {
44public:
45								MailboxSelectHandler(IMAPMailbox& mailbox);
46
47			BString				Command();
48			bool				Handle(const BString& response);
49
50			void				SetTo(const char* mailboxName)
51									{ fMailboxName = mailboxName; }
52			int32				NextUID() { return fNextUID; }
53			int32				UIDValidity() { return fUIDValidity; }
54
55private:
56			BString				fMailboxName;
57			int32				fNextUID;
58			int32				fUIDValidity;
59};
60
61
62class CapabilityHandler : public IMAPCommand {
63public:
64								CapabilityHandler();
65
66			BString				Command();
67			bool				Handle(const BString& response);
68
69			BString&			Capabilities();
70
71private:
72			BString				fCapabilities;
73};
74
75
76struct MinMessage {
77	MinMessage();
78
79	int32	uid;
80	int32	flags;
81};
82
83
84typedef std::vector<MinMessage>	MinMessageList;
85
86
87class FetchMinMessageCommand : public IMAPMailboxCommand {
88public:
89								FetchMinMessageCommand(IMAPMailbox& mailbox,
90									int32 message, MinMessageList* list,
91									BPositionIO** data);
92								FetchMinMessageCommand(IMAPMailbox& mailbox,
93									int32 firstMessage, int32 lastMessage,
94									MinMessageList* list, BPositionIO** data);
95
96			BString				Command();
97			bool				Handle(const BString& response);
98
99	static	bool				ParseMinMessage(const BString& response,
100									MinMessage& minMessage);
101	static	int32				ExtractFlags(const BString& response);
102
103private:
104			int32				fMessage;
105			int32				fEndMessage;
106			MinMessageList*		fMinMessageList;
107			BPositionIO**		fData;
108};
109
110
111class FetchMessageListCommand : public IMAPMailboxCommand {
112public:
113								FetchMessageListCommand(IMAPMailbox& mailbox,
114									MinMessageList* list, int32 nextId);
115
116			BString				Command();
117			bool				Handle(const BString& response);
118
119private:
120			MinMessageList*		fMinMessageList;
121			int32				fNextId;
122};
123
124
125class FetchMessageCommand : public IMAPMailboxCommand {
126public:
127								FetchMessageCommand(IMAPMailbox& mailbox,
128									int32 message, BPositionIO* data,
129									int32 fetchBodyLimit = -1);
130			/*! Fetch multiple message within a range. */
131								FetchMessageCommand(IMAPMailbox& mailbox,
132									int32 firstMessage, int32 lastMessage,
133									int32 fetchBodyLimit = -1);
134								~FetchMessageCommand();
135
136			BString				Command();
137			bool				Handle(const BString& response);
138
139private:
140			int32				fMessage;
141			int32				fEndMessage;
142			BPositionIO*		fOutData;
143			int32				fFetchBodyLimit;
144			int32				fUnhandled;
145};
146
147
148class FetchBodyCommand : public IMAPMailboxCommand {
149public:
150								/*! takes ownership of the data */
151								FetchBodyCommand(IMAPMailbox& mailbox,
152									int32 message, BPositionIO* data);
153								~FetchBodyCommand();
154
155			BString				Command();
156			bool				Handle(const BString& response);
157
158private:
159			int32				fMessage;
160			BPositionIO*		fOutData;
161};
162
163
164class SetFlagsCommand : public IMAPMailboxCommand {
165public:
166								SetFlagsCommand(IMAPMailbox& mailbox,
167									int32 message, int32 flags);
168
169			BString				Command();
170			bool				Handle(const BString& response);
171
172	static	BString				GenerateFlagList(int32 flags);
173
174private:
175			int32				fMessage;
176			int32				fFlags;
177};
178
179
180class AppendCommand : public IMAPMailboxCommand {
181public:
182								AppendCommand(IMAPMailbox& mailbox,
183									BPositionIO& message, off_t size,
184									int32 flags, time_t time);
185
186			BString				Command();
187			bool				Handle(const BString& response);
188
189private:
190			BPositionIO&		fMessageData;
191			off_t				fDataSize;
192			int32				fFlags;
193			time_t				fTime;
194};
195
196
197class ExistsHandler : public IMAPMailboxCommand {
198public:
199								ExistsHandler(IMAPMailbox& mailbox);
200
201			bool				Handle(const BString& response);
202};
203
204
205/*! Just send a expunge command to delete kDeleted flagged messages. The
206response is handled by the unsolicited ExpungeHandler which is installed all
207the time. */
208class ExpungeCommmand : public IMAPMailboxCommand {
209public:
210								ExpungeCommmand(IMAPMailbox& mailbox);
211
212			BString				Command();
213			bool				Handle(const BString& response);
214};
215
216
217class ExpungeHandler : public IMAPMailboxCommand {
218public:
219								ExpungeHandler(IMAPMailbox& mailbox);
220
221			bool				Handle(const BString& response);
222};
223
224
225class FlagsHandler : public IMAPMailboxCommand {
226public:
227								FlagsHandler(IMAPMailbox& mailbox);
228
229			bool				Handle(const BString& response);
230};
231
232
233typedef std::vector<BString> StringList;
234
235
236class ListCommand : public IMAPCommand {
237public:
238			BString				Command();
239			bool				Handle(const BString& response);
240
241	const	StringList&			FolderList();
242
243	static	bool				ParseList(const char* command,
244									const BString& response, StringList& list);
245private:
246			StringList			fFolders;
247};
248
249
250class ListSubscribedCommand : public IMAPCommand {
251public:
252			BString				Command();
253			bool				Handle(const BString& response);
254
255	const	StringList&			FolderList();
256
257private:
258			StringList			fFolders;
259};
260
261
262class SubscribeCommand : public IMAPCommand {
263public:
264								SubscribeCommand(const char* mailboxName);
265
266			BString				Command();
267			bool				Handle(const BString& response);
268
269private:
270			BString				fMailboxName;
271};
272
273
274class UnsubscribeCommand : public IMAPCommand {
275public:
276								UnsubscribeCommand(const char* mailboxName);
277
278			BString				Command();
279			bool				Handle(const BString& response);
280
281private:
282			BString				fMailboxName;
283};
284
285
286class GetQuotaCommand : public IMAPCommand {
287public:
288								GetQuotaCommand(const char* mailboxName = "");
289
290			BString				Command();
291			bool				Handle(const BString& response);
292
293			uint64				UsedStorage();
294			uint64				TotalStorage();
295private:
296			BString				fMailboxName;
297
298			uint64				fUsedStorage;
299			uint64				fTotalStorage;
300};
301
302
303#endif // IMAP_HANDLER_H
304