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