xref: /haiku/src/add-ons/mail_daemon/inbound_protocols/imap/imap_lib/Response.h (revision a085e81e62d7a860f809b4fb7c7bf5654c396985)
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