bincimap

Log | Files | Refs | LICENSE

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