operators.h (12866B)
1 /* -*- Mode: c++; -*- */ 2 /* -------------------------------------------------------------------- 3 * Filename: 4 * src/operators.h 5 * 6 * Description: 7 * <---> 8 * 9 * Authors: 10 * Andreas Aardal Hanssen <andreas-binc curly bincimap spot org> 11 * 12 * Bugs: 13 * 14 * ChangeLog: 15 * 16 * -------------------------------------------------------------------- 17 * Copyright 2002-2005 Andreas Aardal Hanssen 18 * 19 * This program is free software; you can redistribute it and/or modify 20 * it under the terms of the GNU General Public License as published by 21 * the Free Software Foundation; either version 2 of the License, or 22 * (at your option) any later version. 23 * 24 * This program is distributed in the hope that it will be useful, 25 * but WITHOUT ANY WARRANTY; without even the implied warranty of 26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 27 * GNU General Public License for more details. 28 * 29 * You should have received a copy of the GNU General Public License 30 * along with this program; if not, write to the Free Software 31 * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. 32 * -------------------------------------------------------------------- 33 */ 34 #ifdef HAVE_CONFIG_H 35 #include <config.h> 36 #endif 37 38 #ifndef operators_h_included 39 #define operators_h_included 40 #include <string> 41 #include <vector> 42 43 #include "imapparser.h" 44 #include "depot.h" 45 #include "message.h" 46 47 namespace Binc { 48 49 //-------------------------------------------------------------------- 50 class Operator { 51 public: 52 enum ProcessResult {OK, BAD, NO, NOTHING, ABORT}; 53 enum ParseResult {ACCEPT, REJECT, ERROR, TIMEOUT}; 54 55 virtual ProcessResult process(Depot &, Request &) = 0; 56 virtual ParseResult parse(Request &) const = 0; 57 virtual int getState(void) const = 0; 58 virtual const std::string getName(void) const = 0; 59 60 //-- 61 virtual ~Operator(void) {}; 62 }; 63 64 //-------------------------------------------------------------------- 65 class AppendOperator : public Operator { 66 public: 67 ProcessResult process(Depot &, Request &); 68 virtual ParseResult parse(Request &) const; 69 const std::string getName(void) const; 70 int getState(void) const; 71 72 AppendOperator(void); 73 ~AppendOperator(void); 74 }; 75 76 //-------------------------------------------------------------------- 77 class AuthenticateOperator : public Operator { 78 public: 79 ProcessResult process(Depot &, Request &); 80 virtual ParseResult parse(Request &) const; 81 82 const std::string getName(void) const; 83 int getState(void) const; 84 85 AuthenticateOperator(void); 86 ~AuthenticateOperator(void); 87 }; 88 89 //-------------------------------------------------------------------- 90 class CapabilityOperator : public Operator { 91 std::vector<std::string> capabilities; 92 public: 93 ProcessResult process(Depot &, Request &); 94 virtual ParseResult parse(Request &) const; 95 96 const std::string getName(void) const; 97 int getState(void) const; 98 99 void addCapability(const std::string &cap); 100 101 CapabilityOperator(void); 102 ~CapabilityOperator(void); 103 }; 104 105 //-------------------------------------------------------------------- 106 class CheckOperator : public Operator { 107 public: 108 ProcessResult process(Depot &, Request &); 109 virtual ParseResult parse(Request &) const; 110 111 const std::string getName(void) const; 112 int getState(void) const; 113 114 CheckOperator(void); 115 ~CheckOperator(void); 116 }; 117 118 //-------------------------------------------------------------------- 119 class CreateOperator : public Operator { 120 public: 121 ProcessResult process(Depot &, Request &); 122 virtual ParseResult parse(Request &) const; 123 124 const std::string getName(void) const; 125 int getState(void) const; 126 127 CreateOperator(void); 128 ~CreateOperator(void); 129 }; 130 131 //-------------------------------------------------------------------- 132 class CloseOperator : public Operator { 133 public: 134 ProcessResult process(Depot &, Request &); 135 virtual ParseResult parse(Request &) const; 136 137 const std::string getName(void) const; 138 int getState(void) const; 139 140 CloseOperator(void); 141 ~CloseOperator(void); 142 }; 143 144 //-------------------------------------------------------------------- 145 class CopyOperator : public Operator { 146 public: 147 ProcessResult process(Depot &, Request &); 148 virtual ParseResult parse(Request &) const; 149 150 const std::string getName(void) const; 151 int getState(void) const; 152 153 CopyOperator(void); 154 ~CopyOperator(void); 155 }; 156 157 //-------------------------------------------------------------------- 158 class DeleteOperator : public Operator { 159 public: 160 ProcessResult process(Depot &, Request &); 161 virtual ParseResult parse(Request &) const; 162 163 const std::string getName(void) const; 164 int getState(void) const; 165 166 DeleteOperator(void); 167 ~DeleteOperator(void); 168 }; 169 170 //-------------------------------------------------------------------- 171 class ExpungeOperator : public Operator { 172 public: 173 ProcessResult process(Depot &, Request &); 174 virtual ParseResult parse(Request &) const; 175 176 const std::string getName(void) const; 177 int getState(void) const; 178 179 ExpungeOperator(void); 180 ~ExpungeOperator(void); 181 }; 182 183 //-------------------------------------------------------------------- 184 class FetchOperator : public Operator { 185 protected: 186 ParseResult expectSectionText(BincImapParserFetchAtt &f_in) const; 187 ParseResult expectSection(BincImapParserFetchAtt &f_in) const; 188 ParseResult expectFetchAtt(BincImapParserFetchAtt &f_in) const; 189 ParseResult expectOffset(BincImapParserFetchAtt &f_in) const; 190 ParseResult expectHeaderList(BincImapParserFetchAtt &f_in) const; 191 public: 192 ProcessResult process(Depot &, Request &); 193 virtual ParseResult parse(Request &) const; 194 195 const std::string getName(void) const; 196 int getState(void) const; 197 198 FetchOperator(void); 199 ~FetchOperator(void); 200 }; 201 202 //-------------------------------------------------------------------- 203 class ListOperator : public Operator { 204 protected: 205 enum MailboxFlags { 206 DIR_SELECT = 0x01, 207 DIR_MARKED = 0x02, 208 DIR_NOINFERIORS = 0x04, 209 DIR_LEAF = 0x08 210 }; 211 212 std::map<std::string, unsigned int> cache; 213 time_t cacheTimeout; 214 public: 215 ProcessResult process(Depot &, Request &); 216 virtual ParseResult parse(Request &) const; 217 218 const std::string getName(void) const; 219 int getState(void) const; 220 221 ListOperator(void); 222 ~ListOperator(void); 223 }; 224 225 //-------------------------------------------------------------------- 226 class LoginOperator : public Operator { 227 public: 228 ProcessResult process(Depot &, Request &); 229 virtual ParseResult parse(Request &) const; 230 231 const std::string getName(void) const; 232 int getState(void) const; 233 234 LoginOperator(void); 235 ~LoginOperator(void); 236 }; 237 238 //-------------------------------------------------------------------- 239 class LogoutOperator : public Operator { 240 public: 241 ProcessResult process(Depot &, Request &); 242 virtual ParseResult parse(Request &) const; 243 244 const std::string getName(void) const; 245 int getState(void) const; 246 247 LogoutOperator(void); 248 ~LogoutOperator(void); 249 }; 250 251 //-------------------------------------------------------------------- 252 class LsubOperator : public Operator { 253 public: 254 ProcessResult process(Depot &, Request &); 255 virtual ParseResult parse(Request &) const; 256 257 const std::string getName(void) const; 258 int getState(void) const; 259 260 LsubOperator(void); 261 ~LsubOperator(void); 262 }; 263 264 //-------------------------------------------------------------------- 265 class NoopOperator : public Operator { 266 public: 267 virtual ProcessResult process(Depot &, Request &); 268 virtual ParseResult parse(Request &) const; 269 270 const std::string getName(void) const; 271 int getState(void) const; 272 273 NoopOperator(void); 274 ~NoopOperator(void); 275 }; 276 277 //-------------------------------------------------------------------- 278 class NoopPendingOperator : public NoopOperator { 279 public: 280 ProcessResult process(Depot &, Request &); 281 282 NoopPendingOperator(void); 283 ~NoopPendingOperator(void); 284 }; 285 286 //-------------------------------------------------------------------- 287 class RenameOperator : public Operator { 288 public: 289 ProcessResult process(Depot &, Request &); 290 virtual ParseResult parse(Request &) const; 291 292 const std::string getName(void) const; 293 int getState(void) const; 294 295 RenameOperator(void); 296 ~RenameOperator(void); 297 }; 298 299 //-------------------------------------------------------------------- 300 class SearchOperator : public Operator { 301 protected: 302 ParseResult expectSearchKey(BincImapParserSearchKey &s_in) const; 303 304 //------------------------------------------------------------------ 305 class SearchNode { 306 307 std::string date; 308 std::string astring; 309 std::string bstring; 310 unsigned int number; 311 312 int type; 313 mutable int weight; 314 const SequenceSet *bset; 315 316 std::vector<SearchNode> children; 317 318 public: 319 enum { 320 S_ALL, S_ANSWERED, S_BCC, S_BEFORE, S_BODY, S_CC, S_DELETED, 321 S_FLAGGED, S_FROM, S_KEYWORD, S_NEW, S_OLD, S_ON, S_RECENT, 322 S_SEEN, S_SINCE, S_SUBJECT, S_TEXT, S_TO, S_UNANSWERED, 323 S_UNDELETED, S_UNFLAGGED, S_UNKEYWORD, S_UNSEEN, S_DRAFT, 324 S_HEADER, S_LARGER, S_NOT, S_OR, S_SENTBEFORE, S_SENTON, 325 S_SENTSINCE, S_SMALLER, S_UID, S_UNDRAFT, S_SET, S_AND 326 }; 327 328 static bool convertDate(const std::string &date, time_t &t, const std::string &delim = "-"); 329 static bool convertDateHeader(const std::string &d_in, time_t &t); 330 331 void order(void); 332 333 bool match(Mailbox *, Message *, 334 unsigned seqnr, unsigned int lastmessage, 335 unsigned int lastuid) const; 336 337 int getType(void) const; 338 int getWeight(void) const; 339 void setWeight(int i); 340 341 void init(const BincImapParserSearchKey &a); 342 343 //- 344 static bool compareNodes(const SearchNode &a, 345 const SearchNode &b) 346 { 347 return a.getWeight() < b.getWeight(); 348 } 349 350 SearchNode(void); 351 SearchNode(const BincImapParserSearchKey &a); 352 }; 353 354 public: 355 356 ProcessResult process(Depot &, Request &); 357 virtual ParseResult parse(Request &) const; 358 359 const std::string getName(void) const; 360 int getState(void) const; 361 362 SearchOperator(void); 363 ~SearchOperator(void); 364 }; 365 366 //-------------------------------------------------------------------- 367 class SelectOperator : public Operator { 368 public: 369 ProcessResult process(Depot &, Request &); 370 virtual ParseResult parse(Request &) const; 371 372 const std::string getName(void) const; 373 int getState(void) const; 374 375 SelectOperator(void); 376 ~SelectOperator(void); 377 }; 378 379 //-------------------------------------------------------------------- 380 class ExamineOperator : public SelectOperator { 381 public: 382 const std::string getName(void) const; 383 ExamineOperator(void); 384 ~ExamineOperator(void); 385 }; 386 387 #ifdef WITH_SSL 388 //-------------------------------------------------------------------- 389 class StarttlsOperator : public Operator { 390 public: 391 ProcessResult process(Depot &, Request &); 392 virtual ParseResult parse(Request &) const; 393 394 const std::string getName(void) const; 395 int getState(void) const; 396 397 StarttlsOperator(void); 398 ~StarttlsOperator(void); 399 }; 400 #endif 401 402 //-------------------------------------------------------------------- 403 class StatusOperator : public Operator { 404 405 std::map<int, Status> statuses; 406 407 public: 408 ProcessResult process(Depot &, Request &); 409 virtual ParseResult parse(Request &) const; 410 411 const std::string getName(void) const; 412 int getState(void) const; 413 414 StatusOperator(void); 415 ~StatusOperator(void); 416 }; 417 418 //-------------------------------------------------------------------- 419 class StoreOperator : public Operator { 420 public: 421 ProcessResult process(Depot &, Request &); 422 virtual ParseResult parse(Request &) const; 423 424 const std::string getName(void) const; 425 int getState(void) const; 426 427 StoreOperator(void); 428 ~StoreOperator(void); 429 }; 430 431 //-------------------------------------------------------------------- 432 class SubscribeOperator : public Operator { 433 public: 434 ProcessResult process(Depot &, Request &); 435 virtual ParseResult parse(Request &) const; 436 437 const std::string getName(void) const; 438 int getState(void) const; 439 440 SubscribeOperator(void); 441 ~SubscribeOperator(void); 442 }; 443 444 //-------------------------------------------------------------------- 445 class UnsubscribeOperator : public Operator { 446 public: 447 ProcessResult process(Depot &, Request &); 448 virtual ParseResult parse(Request &) const; 449 450 const std::string getName(void) const; 451 int getState(void) const; 452 453 UnsubscribeOperator(void); 454 ~UnsubscribeOperator(void); 455 }; 456 } 457 458 #endif