Diffstat (limited to 'noncore/unsupported/mail2/libmail/imaphandler.cpp') (more/less context) (show whitespace changes)
-rw-r--r-- | noncore/unsupported/mail2/libmail/imaphandler.cpp | 334 |
1 files changed, 334 insertions, 0 deletions
diff --git a/noncore/unsupported/mail2/libmail/imaphandler.cpp b/noncore/unsupported/mail2/libmail/imaphandler.cpp new file mode 100644 index 0000000..66c92c5 --- a/dev/null +++ b/noncore/unsupported/mail2/libmail/imaphandler.cpp | |||
@@ -0,0 +1,334 @@ | |||
1 | #include "imapresponse.h" | ||
2 | #include "imaphandler.h" | ||
3 | #include "imapbase.h" | ||
4 | |||
5 | IMAPHandler::IMAPHandler(const Account &account) | ||
6 | : QObject(), _account(account) | ||
7 | { | ||
8 | _loggingin = false; | ||
9 | _loggedin = false; | ||
10 | _tag = 0; | ||
11 | _ibase = new IMAPBase(account); | ||
12 | |||
13 | connect(_ibase, SIGNAL(dataReceived(const QString &)), SLOT(slotDataReceived(const QString &))); | ||
14 | connect(_ibase, SIGNAL(lookingUpHost()), SLOT(slotLookingUpHost())); | ||
15 | connect(_ibase, SIGNAL(hostFound()), SLOT(slotHostFound())); | ||
16 | connect(_ibase, SIGNAL(connected()), SLOT(slotConnected())); | ||
17 | connect(_ibase, SIGNAL(disconnected()), SLOT(slotDisconnected())); | ||
18 | connect(_ibase, SIGNAL(error(int)), SLOT(slotError(int))); | ||
19 | } | ||
20 | |||
21 | void IMAPHandler::doLogin() | ||
22 | { | ||
23 | if (_loggedin) return; | ||
24 | if (_loggingin) return; | ||
25 | |||
26 | _loggingin = true; | ||
27 | iLogin(_account.user(), _account.pass()); | ||
28 | } | ||
29 | |||
30 | QString IMAPHandler::iCapability() | ||
31 | { | ||
32 | _ibase->sendCommand(QString("%1 CAPABILITY\r\n") | ||
33 | .arg(tag())); | ||
34 | return tag(false); | ||
35 | } | ||
36 | |||
37 | QString IMAPHandler::iNoop() | ||
38 | { | ||
39 | _ibase->sendCommand(QString("%1 NOOP\r\n") | ||
40 | .arg(tag())); | ||
41 | return tag(false); | ||
42 | } | ||
43 | |||
44 | QString IMAPHandler::iLogout() | ||
45 | { | ||
46 | _ibase->sendCommand(QString("%1 LOGOUT\r\n") | ||
47 | .arg(tag())); | ||
48 | return tag(false); | ||
49 | } | ||
50 | |||
51 | QString IMAPHandler::iAuthenticate(const QString &mechanism) | ||
52 | { | ||
53 | _ibase->sendCommand(QString("%1 AUTHENTICATE \"%2\"\r\n") | ||
54 | .arg(tag()) | ||
55 | .arg(escape(mechanism))); | ||
56 | return tag(false); | ||
57 | } | ||
58 | |||
59 | QString IMAPHandler::iLogin(const QString &user, const QString &pass) | ||
60 | { | ||
61 | _ibase->sendCommand(QString("%1 LOGIN \"%2\" \"%3\"\r\n") | ||
62 | .arg(tag()) | ||
63 | .arg(escape(user)) | ||
64 | .arg(escape(pass))); | ||
65 | return tag(false); | ||
66 | } | ||
67 | |||
68 | QString IMAPHandler::iSelect(const QString &mailbox) | ||
69 | { | ||
70 | doLogin(); | ||
71 | |||
72 | _ibase->sendCommand(QString("%1 SELECT \"%2\"\r\n") | ||
73 | .arg(tag()) | ||
74 | .arg(escape(mailbox))); | ||
75 | return tag(false); | ||
76 | } | ||
77 | |||
78 | QString IMAPHandler::iExamine(const QString &mailbox) | ||
79 | { | ||
80 | doLogin(); | ||
81 | |||
82 | _ibase->sendCommand(QString("%1 EXAMINE \"%2\"\r\n") | ||
83 | .arg(tag()) | ||
84 | .arg(escape(mailbox))); | ||
85 | return tag(false); | ||
86 | } | ||
87 | |||
88 | QString IMAPHandler::iCreate(const QString &mailbox) | ||
89 | { | ||
90 | doLogin(); | ||
91 | |||
92 | _ibase->sendCommand(QString("%1 CREATE \"%2\"\r\n") | ||
93 | .arg(tag()) | ||
94 | .arg(escape(mailbox))); | ||
95 | return tag(false); | ||
96 | } | ||
97 | |||
98 | QString IMAPHandler::iDelete(const QString &mailbox) | ||
99 | { | ||
100 | doLogin(); | ||
101 | |||
102 | _ibase->sendCommand(QString("%1 DELETE \"%2\"\r\n") | ||
103 | .arg(tag()) | ||
104 | .arg(escape(mailbox))); | ||
105 | return tag(false); | ||
106 | } | ||
107 | |||
108 | QString IMAPHandler::iRename(const QString &mailbox, const QString &newMailbox) | ||
109 | { | ||
110 | doLogin(); | ||
111 | |||
112 | _ibase->sendCommand(QString("%1 RENAME \"%2\" \"%3\"\r\n") | ||
113 | .arg(tag()) | ||
114 | .arg(escape(mailbox)) | ||
115 | .arg(escape(newMailbox))); | ||
116 | return tag(false); | ||
117 | } | ||
118 | |||
119 | QString IMAPHandler::iSubscribe(const QString &mailbox) | ||
120 | { | ||
121 | doLogin(); | ||
122 | |||
123 | _ibase->sendCommand(QString("%1 SUBSCRIBE \"%2\"\r\n") | ||
124 | .arg(tag()) | ||
125 | .arg(escape(mailbox))); | ||
126 | return tag(false); | ||
127 | } | ||
128 | |||
129 | QString IMAPHandler::iUnsubscribe(const QString &mailbox) | ||
130 | { | ||
131 | doLogin(); | ||
132 | |||
133 | _ibase->sendCommand(QString("%1 UNSUBSCRIBE \"%2\"\r\n") | ||
134 | .arg(tag()) | ||
135 | .arg(escape(mailbox))); | ||
136 | return tag(false); | ||
137 | } | ||
138 | |||
139 | QString IMAPHandler::iList(const QString &reference, const QString &mailbox) | ||
140 | { | ||
141 | doLogin(); | ||
142 | |||
143 | _ibase->sendCommand(QString("%1 LIST \"%2\" \"%3\"\r\n") | ||
144 | .arg(tag()) | ||
145 | .arg(escape(reference)) | ||
146 | .arg(escape(mailbox))); | ||
147 | return tag(false); | ||
148 | } | ||
149 | |||
150 | QString IMAPHandler::iLsub(const QString &reference, const QString &mailbox) | ||
151 | { | ||
152 | doLogin(); | ||
153 | |||
154 | _ibase->sendCommand(QString("%1 LSUB \"%2\" \"%3\"\r\n") | ||
155 | .arg(tag()) | ||
156 | .arg(escape(reference)) | ||
157 | .arg(escape(mailbox))); | ||
158 | return tag(false); | ||
159 | } | ||
160 | |||
161 | QString IMAPHandler::iStatus(const QString &mailbox, const QString &items) | ||
162 | { | ||
163 | doLogin(); | ||
164 | |||
165 | _ibase->sendCommand(QString("%1 STATUS \"%2\" (%3)\r\n") | ||
166 | .arg(tag()) | ||
167 | .arg(escape(mailbox)) | ||
168 | .arg(escape(items))); | ||
169 | return tag(false); | ||
170 | } | ||
171 | |||
172 | QString IMAPHandler::iAppend(const QString &mailbox, const QString &literal, const QString &flags, const QString &datetime = 0) | ||
173 | { | ||
174 | doLogin(); | ||
175 | |||
176 | _ibase->sendCommand(QString("%1 APPEND \"%2\" (%3) \"%4\" {%5}\r\n%6\r\n") | ||
177 | .arg(tag()) | ||
178 | .arg(escape(mailbox)) | ||
179 | .arg(flags) | ||
180 | .arg(escape(datetime)) | ||
181 | .arg(literal.length()) | ||
182 | .arg(literal)); | ||
183 | return tag(false); | ||
184 | } | ||
185 | |||
186 | QString IMAPHandler::iCheck() | ||
187 | { | ||
188 | doLogin(); | ||
189 | |||
190 | _ibase->sendCommand(QString("%1 CHECK\r\n") | ||
191 | .arg(tag())); | ||
192 | return tag(false); | ||
193 | } | ||
194 | |||
195 | QString IMAPHandler::iClose() | ||
196 | { | ||
197 | doLogin(); | ||
198 | |||
199 | _ibase->sendCommand(QString("%1 CLOSE\r\n") | ||
200 | .arg(tag())); | ||
201 | return tag(false); | ||
202 | } | ||
203 | |||
204 | QString IMAPHandler::iExpunge() | ||
205 | { | ||
206 | doLogin(); | ||
207 | |||
208 | _ibase->sendCommand(QString("%1 EXPUNGE\r\n") | ||
209 | .arg(tag())); | ||
210 | return tag(false); | ||
211 | } | ||
212 | |||
213 | QString IMAPHandler::iSearch(const QString &search, const QString &charset) | ||
214 | { | ||
215 | doLogin(); | ||
216 | |||
217 | _ibase->sendCommand(QString("%1 SEARCH %2 %3\r\n") | ||
218 | .arg(tag()) | ||
219 | .arg(charset.isEmpty() ? QString(0) : escape(charset)) | ||
220 | .arg(search)); | ||
221 | return tag(false); | ||
222 | } | ||
223 | |||
224 | QString IMAPHandler::iFetch(const QString &message, const QString &items) | ||
225 | { | ||
226 | doLogin(); | ||
227 | |||
228 | _ibase->sendCommand(QString("%1 FETCH %2 (%3)\r\n") | ||
229 | .arg(tag()) | ||
230 | .arg(message) | ||
231 | .arg(items)); | ||
232 | return tag(false); | ||
233 | } | ||
234 | |||
235 | QString IMAPHandler::iStore(const QString &message, const QString &items) | ||
236 | { | ||
237 | doLogin(); | ||
238 | |||
239 | _ibase->sendCommand(QString("%1 STORE %2 %3\r\n") | ||
240 | .arg(tag()) | ||
241 | .arg(message) | ||
242 | .arg(items)); | ||
243 | return tag(false); | ||
244 | } | ||
245 | |||
246 | QString IMAPHandler::iCopy(const QString &message, const QString &mailbox) | ||
247 | { | ||
248 | doLogin(); | ||
249 | |||
250 | _ibase->sendCommand(QString("%1 COPY %2 \"%3\"\r\n") | ||
251 | .arg(tag()) | ||
252 | .arg(message) | ||
253 | .arg(escape(mailbox))); | ||
254 | return tag(false); | ||
255 | } | ||
256 | |||
257 | QString IMAPHandler::iUid(const QString &command, const QString &arguments) | ||
258 | { | ||
259 | doLogin(); | ||
260 | |||
261 | _ibase->sendCommand(QString("%1 UID %2 %3\r\n") | ||
262 | .arg(tag()) | ||
263 | .arg(command) | ||
264 | .arg(arguments)); | ||
265 | return tag(false); | ||
266 | } | ||
267 | |||
268 | QString IMAPHandler::iX(const QString &commandAtom, const QString &arguments) | ||
269 | { | ||
270 | doLogin(); | ||
271 | |||
272 | _ibase->sendCommand(QString("%1 X%2 %3\r\n") | ||
273 | .arg(tag()) | ||
274 | .arg(commandAtom) | ||
275 | .arg(arguments)); | ||
276 | return tag(false); | ||
277 | } | ||
278 | |||
279 | QString IMAPHandler::escape(const QString &in) | ||
280 | { | ||
281 | QString in_ = in; | ||
282 | return in_.replace(QRegExp("\""), "\\\""); | ||
283 | } | ||
284 | |||
285 | QString IMAPHandler::tag(bool count) | ||
286 | { | ||
287 | return QString("a%1").arg(count ? _tag++ : _tag); | ||
288 | } | ||
289 | |||
290 | void IMAPHandler::slotDataReceived(const QString &data) | ||
291 | { | ||
292 | IMAPResponseParser parser(data); | ||
293 | IMAPResponse response = parser.response(); | ||
294 | response.setImapHandler(this); | ||
295 | |||
296 | if (!_loggingin) emit gotResponse(response); | ||
297 | else { | ||
298 | if (response.statusResponse().status() == IMAPResponseEnums::OK) { | ||
299 | _loggingin = false; | ||
300 | _loggedin = true; | ||
301 | qWarning("OK. Logged in. Leaving loggingin state."); | ||
302 | } else { | ||
303 | _loggingin = false; | ||
304 | emit IMAPError(IMAPBase::IMAPErrLoginFailed); | ||
305 | } | ||
306 | } | ||
307 | } | ||
308 | |||
309 | void IMAPHandler::slotLookingUpHost() | ||
310 | { | ||
311 | emit IMAPLookingUpHost(); | ||
312 | } | ||
313 | |||
314 | void IMAPHandler::slotHostFound() | ||
315 | { | ||
316 | emit IMAPHostFound(); | ||
317 | } | ||
318 | |||
319 | void IMAPHandler::slotConnected() | ||
320 | { | ||
321 | emit IMAPConnected(); | ||
322 | } | ||
323 | |||
324 | void IMAPHandler::slotDisconnected() | ||
325 | { | ||
326 | _loggedin = false; | ||
327 | emit IMAPDisconnected(); | ||
328 | } | ||
329 | |||
330 | void IMAPHandler::slotError(int err) | ||
331 | { | ||
332 | emit IMAPError(err); | ||
333 | } | ||
334 | |||