1 /* 2 * Copyright 2011, Axel Dörfler, axeld@pinc-software.de. 3 * Distributed under the terms of the MIT License. 4 */ 5 #ifndef RESPONSE_H 6 #define RESPONSE_H 7 8 9 #include <stdexcept> 10 11 #include <ObjectList.h> 12 #include <String.h> 13 14 15 namespace IMAP { 16 17 18 class Argument; 19 20 21 class ArgumentList : public BObjectList<Argument> { 22 public: 23 ArgumentList(); 24 ~ArgumentList(); 25 26 bool Contains(const char* string) const; 27 BString StringAt(int32 index) const; 28 bool IsStringAt(int32 index) const; 29 bool EqualsAt(int32 index, 30 const char* string) const; 31 32 ArgumentList& ListAt(int32 index) const; 33 bool IsListAt(int32 index) const; 34 bool IsListAt(int32 index, char kind) const; 35 36 int32 IntegerAt(int32 index) const; 37 bool IsIntegerAt(int32 index) const; 38 39 BString ToString() const; 40 }; 41 42 43 class Argument { 44 public: 45 Argument(); 46 virtual ~Argument(); 47 48 virtual BString ToString() const = 0; 49 }; 50 51 52 class ListArgument : public Argument { 53 public: 54 ListArgument(char kind); 55 56 ArgumentList& List() { return fList; } 57 char Kind() { return fKind; } 58 59 virtual BString ToString() const; 60 61 private: 62 ArgumentList fList; 63 char fKind; 64 }; 65 66 67 class StringArgument : public Argument { 68 public: 69 StringArgument(const BString& string); 70 StringArgument(const StringArgument& other); 71 72 const BString& String() { return fString; } 73 74 virtual BString ToString() const; 75 76 private: 77 BString fString; 78 }; 79 80 81 class ParseException : public std::exception { 82 public: 83 ParseException(); 84 ParseException(const char* message); 85 virtual ~ParseException(); 86 87 const char* Message() const { return fMessage; } 88 89 protected: 90 const char* fMessage; 91 }; 92 93 94 class ExpectedParseException : ParseException { 95 public: 96 ExpectedParseException(char expected, 97 char instead); 98 99 protected: 100 char fBuffer[64]; 101 }; 102 103 104 class Response : public ArgumentList { 105 public: 106 Response(); 107 ~Response(); 108 109 void SetTo(const char* line) throw(ParseException); 110 111 bool IsUntagged() const { return fTag == 0; } 112 int32 Tag() const { return fTag; } 113 bool IsCommand(const char* command) const; 114 bool IsContinuation() const { return fContinuation; } 115 116 protected: 117 char ParseLine(ArgumentList& arguments, 118 const char*& line); 119 void Consume(const char*& line, char c); 120 void ParseList(ArgumentList& arguments, 121 const char*& line, char start, char end); 122 void ParseQuoted(ArgumentList& arguments, 123 const char*& line); 124 void ParseLiteral(ArgumentList& arguments, 125 const char*& line); 126 void ParseString(ArgumentList& arguments, 127 const char*& line); 128 BString ExtractString(const char*& line); 129 130 protected: 131 int32 fTag; 132 bool fContinuation; 133 }; 134 135 136 } // namespace IMAP 137 138 139 #endif // RESPONSE_H 140