00001 #ifndef IMAPRESPONSE_H
00002 #define IMAPRESPONSE_H
00003
00004 #include <qobject.h>
00005
00006 #define MAX_BODYPARTS 50
00007
00008 class IMAPHandler;
00009
00010 class IMAPResponseEnums
00011 {
00012 public:
00013 enum IMAPResponseStatus {
00014 OK, NO, BAD, PREAUTH, BYE, UnknownStatus = 0
00015 };
00016
00017 enum IMAPResponseFlags {
00018 Seen, Answered, Flagged, Deleted, Draft, Recent,
00019 Noinferiors, Noselect, Marked, Unmarked, UnknownFlag = 0
00020 };
00021
00022 enum IMAPResponseCode {
00023 ALERT, NEWNAME, PARSE, PERMANENTFLAGS, READONLY, READWRITE,
00024 TRYCREATE, UIDVALIDITY, UNSEEN, NoCode, UnknownCode = 0
00025 };
00026
00027 };
00028
00029 class IMAPResponseAddress
00030 {
00031 public:
00032 IMAPResponseAddress(QString name = 0, QString adl = 0, QString mailbox = 0, QString host = 0)
00033 {
00034 _name = name;
00035 _adl = adl;
00036 _mailbox = mailbox;
00037 _host = host;
00038 }
00039
00040 void setName(QString name) { _name = name; }
00041 QString name() { return _name; }
00042 void setAdl(QString adl) { _adl = adl; }
00043 QString adl() { return _adl; }
00044 void setMailbox(QString mailbox) { _mailbox = mailbox; }
00045 QString mailbox() { return _mailbox; }
00046 void setHost(QString host) { _host = host; }
00047 QString host() { return _host; }
00048
00049 QString toString()
00050 {
00051 if (_name.isNull() && _mailbox.isNull() && _host.isNull())
00052 return QString(0);
00053 if (_name != _mailbox + "@" + _host)
00054 return _name + " <" + _mailbox + "@" + _host + ">";
00055 else
00056 return _name;
00057 }
00058
00059 QString email()
00060 {
00061 if (_host.isEmpty()) return _mailbox;
00062 else return _mailbox + "@" + _host;
00063 }
00064
00065 private:
00066 QString _name, _adl, _mailbox, _host;
00067
00068 };
00069
00070 class IMAPResponseAddressList : public QValueList<IMAPResponseAddress>
00071 {
00072 public:
00073 IMAPResponseAddressList()
00074 : QValueList<IMAPResponseAddress>()
00075 {
00076
00077 }
00078
00079 QString toString()
00080 {
00081 QString string;
00082 IMAPResponseAddressList::Iterator it;
00083 for (it = this->begin(); it != this->end(); it++) {
00084 QString tmp = (*it).toString();
00085 if (!tmp.isNull() && string.isEmpty()) string = tmp;
00086 else if (!tmp.isNull()) string += ", " + tmp;
00087 }
00088 return string;
00089 }
00090
00091 };
00092
00093 class IMAPResponseBody
00094 {
00095 public:
00096 void setData(QString data) { _data = data; }
00097 QString data() { return _data; }
00098
00099 private:
00100 QString _data;
00101
00102 };
00103
00104 class IMAPResponseBodyPart : public IMAPResponseBody
00105 {
00106 public:
00107 void setPart(QString part) { _part = part; }
00108 QString part() { return _part; }
00109
00110 private:
00111 QString _part;
00112
00113 };
00114
00115 class IMAPResponseEnvelope
00116 {
00117 public:
00118 void setMailDate(QString date) { _date = date; }
00119 QString mailDate() { return _date; }
00120 void setSubject(QString subject) { _subject = subject; }
00121 QString subject() { return _subject; }
00122 void addFrom(IMAPResponseAddress from) { _from.append(from); }
00123 IMAPResponseAddressList from() { return _from; }
00124 void addSender(IMAPResponseAddress sender) { _sender.append(sender); }
00125 IMAPResponseAddressList sender() { return _sender; }
00126 void addReplyTo(IMAPResponseAddress replyTo) { _replyTo.append(replyTo); }
00127 IMAPResponseAddressList replyTo() { return _replyTo; }
00128 void addTo(IMAPResponseAddress to) { _to.append(to); }
00129 IMAPResponseAddressList to() { return _to; }
00130 void addCc(IMAPResponseAddress cc) { _cc.append(cc); }
00131 IMAPResponseAddressList cc() { return _cc; }
00132 void addBcc(IMAPResponseAddress bcc) { _bcc.append(bcc); }
00133 IMAPResponseAddressList bcc() { return _bcc; }
00134 void setInReplyTo(QString inReplyTo) { _inReplyTo = inReplyTo; }
00135 QString inReplyTo() { return _inReplyTo; }
00136 void setMessageId(QString messageId) { _messageId = messageId; }
00137 QString messageId() { return _messageId; }
00138
00139 private:
00140 QString _date, _subject, _inReplyTo, _messageId;
00141 IMAPResponseAddressList _from, _sender, _replyTo, _to, _cc, _bcc;
00142
00143 };
00144
00145 class IMAPResponseStatusResponse : public IMAPResponseEnums
00146 {
00147 public:
00148 IMAPResponseStatusResponse(IMAPResponseStatus status = (IMAPResponseStatus)0, QString comment = 0, IMAPResponseCode code = (IMAPResponseCode)0)
00149 {
00150 _status = status;
00151 _comment = comment;
00152 _code = code;
00153 }
00154
00155 void setStatus(IMAPResponseStatus status) { _status = status; }
00156 IMAPResponseStatus status() { return _status; }
00157 void setComment(QString comment) { _comment = comment; }
00158 QString comment() { return _comment; }
00159 void setResponseCode(IMAPResponseCode code) { _code = code; }
00160 IMAPResponseCode responseCode() { return _code; }
00161
00162 void setExitedUnexpected(bool exitu) { _exitu = exitu; }
00163 bool exitedUnexpected() { return _exitu; }
00164
00165 private:
00166 IMAPResponseStatus _status;
00167 QString _comment;
00168 IMAPResponseCode _code;
00169 bool _exitu;
00170
00171 };
00172
00173 class IMAPResponseOK : public IMAPResponseEnums
00174 {
00175 public:
00176 IMAPResponseOK(QString comment = 0, IMAPResponseCode code = (IMAPResponseCode)0)
00177 {
00178 _comment = comment;
00179 _code = code;
00180 }
00181
00182 void setComment(QString comment) { _comment = comment; }
00183 QString comment() { return _comment; }
00184 void setResponseCode(IMAPResponseCode code) { _code = code; }
00185 IMAPResponseCode responseCode() { return _code; }
00186
00187 private:
00188 QString _comment;
00189 IMAPResponseCode _code;
00190
00191 };
00192
00193 class IMAPResponseNO : public IMAPResponseEnums
00194 {
00195 public:
00196 IMAPResponseNO(QString comment = 0, IMAPResponseCode code = (IMAPResponseCode)0)
00197 {
00198 _comment = comment;
00199 _code = code;
00200 }
00201
00202 void setComment(QString comment) { _comment = comment; }
00203 QString comment() { return _comment; }
00204 void setResponseCode(IMAPResponseCode code) { _code = code; }
00205 IMAPResponseCode responseCode() { return _code; }
00206
00207 private:
00208 QString _comment;
00209 IMAPResponseCode _code;
00210
00211 };
00212
00213 class IMAPResponseBAD : public IMAPResponseEnums
00214 {
00215 public:
00216 IMAPResponseBAD(QString comment = 0, IMAPResponseCode code = (IMAPResponseCode)0)
00217 {
00218 _comment = comment;
00219 _code = code;
00220 }
00221
00222 void setComment(QString comment) { _comment = comment; }
00223 QString comment() { return _comment; }
00224 void setResponseCode(IMAPResponseCode code) { _code = code; }
00225 IMAPResponseCode responseCode() { return _code; }
00226
00227 private:
00228 QString _comment;
00229 IMAPResponseCode _code;
00230
00231 };
00232
00233 class IMAPResponseCAPABILITY
00234 {
00235 public:
00236 IMAPResponseCAPABILITY(QStringList capabilities = 0)
00237 {
00238 _capabilities = capabilities;
00239 }
00240
00241 void setCapabilities(QStringList capabilities) { _capabilities = capabilities; }
00242 QStringList capabilities() { return _capabilities; }
00243
00244 private:
00245 QStringList _capabilities;
00246
00247 };
00248
00249 class IMAPResponseLIST : public IMAPResponseEnums
00250 {
00251 public:
00252 IMAPResponseLIST(QValueList<IMAPResponseFlags> flags = QValueList<IMAPResponseFlags>(), QString folderSeparator = 0, QString folder = 0)
00253 {
00254 _flags = flags;
00255 _folderSeparator = folderSeparator;
00256 _folder = folder;
00257 }
00258
00259 void setFlags(QValueList<IMAPResponseFlags> flags) { _flags = flags; }
00260 QValueList<IMAPResponseFlags> flags() { return _flags; }
00261 void setFolderSeparator(QString folderSeparator) { _folderSeparator = folderSeparator; }
00262 QString folderSeparator() { return _folderSeparator; }
00263 void setFolder(QString folder) { _folder = folder; }
00264 QString folder() { return _folder; }
00265
00266 private:
00267 QValueList<IMAPResponseFlags> _flags;
00268 QString _folderSeparator, _folder;
00269
00270 };
00271
00272 class IMAPResponseLSUB : public IMAPResponseEnums
00273 {
00274 public:
00275 IMAPResponseLSUB(QValueList<IMAPResponseFlags> flags = QValueList<IMAPResponseFlags>(), QString folderSeperator = 0, QString folder = 0)
00276 {
00277 _flags = flags;
00278 _folderSeperator = folderSeperator;
00279 _folder = folder;
00280 }
00281
00282 void setFlags(QValueList<IMAPResponseFlags> flags) { _flags = flags; }
00283 QValueList<IMAPResponseFlags> flags() { return _flags; }
00284 void setFolderSeperator(QString folderSeperator) { _folderSeperator = folderSeperator; }
00285 QString folderSeperator() { return _folderSeperator; }
00286 void setFolder(QString folder) { _folder = folder; }
00287 QString folder() { return _folder; }
00288
00289 private:
00290 QValueList<IMAPResponseFlags> _flags;
00291 QString _folderSeperator, _folder;
00292
00293 };
00294
00295 class IMAPResponseSTATUS
00296 {
00297 public:
00298 IMAPResponseSTATUS(QString mailbox = 0, QString messages = 0, QString recent = 0, QString uidnext = 0, QString uidvalidity = 0, QString unseen = 0)
00299 {
00300 _mailbox = mailbox;
00301 _messages = messages;
00302 _recent = recent;
00303 _uidnext = uidnext;
00304 _uidvalidity = uidvalidity;
00305 _unseen = unseen;
00306 }
00307
00308 void setMailbox(QString &mailbox) { _mailbox = mailbox; }
00309 QString mailbox() { return _mailbox; }
00310 void setMessages(QString &messages) { _messages = messages; }
00311 QString messages() { return _messages; }
00312 void setRecent(QString &recent) { _recent = recent; }
00313 QString recent() { return _recent; }
00314 void setUidnext(QString &uidnext) { _uidnext = uidnext; }
00315 QString uidnext() { return _uidnext; }
00316 void setUidvalidity(QString &uidvalidity) { _uidvalidity = uidvalidity; }
00317 QString uidvalidity() { return _uidvalidity; }
00318 void setUnseen(QString &unseen) { _unseen = unseen; }
00319 QString unseen() { return _unseen; }
00320
00321 private:
00322 QString _mailbox, _messages, _recent, _uidnext, _uidvalidity, _unseen;
00323
00324 };
00325
00326 class IMAPResponseSEARCH
00327 {
00328 public:
00329 IMAPResponseSEARCH(QStringList mails = 0)
00330 {
00331 _mails = mails;
00332 }
00333
00334 void setMails(QStringList mails) { _mails = mails; }
00335 QStringList mails() { return _mails; }
00336
00337 private:
00338 QStringList _mails;
00339
00340 };
00341
00342 class IMAPResponseFLAGS : public IMAPResponseEnums
00343 {
00344 public:
00345 IMAPResponseFLAGS(QValueList<IMAPResponseFlags> flags = QValueList<IMAPResponseFlags>())
00346 {
00347 _flags = flags;
00348 }
00349
00350 void setFlags(QValueList<IMAPResponseFlags> flags) { _flags = flags; }
00351 QValueList<IMAPResponseFlags> flags() { return _flags; }
00352
00353 private:
00354 QValueList<IMAPResponseFlags> _flags;
00355
00356 };
00357
00358 class IMAPResponseEXISTS
00359 {
00360 public:
00361 IMAPResponseEXISTS(QString mails = 0)
00362 {
00363 _mails = mails;
00364 }
00365
00366 void setMails(QString mails) { _mails = mails; }
00367 QString mails() { return _mails; }
00368
00369 private:
00370 QString _mails;
00371
00372 };
00373
00374 class IMAPResponseRECENT
00375 {
00376 public:
00377 IMAPResponseRECENT(QString mails = 0)
00378 {
00379 _mails = mails;
00380 }
00381
00382 void setMails(QString mails) { _mails = mails; }
00383 QString mails() { return _mails; }
00384
00385 private:
00386 QString _mails;
00387
00388 };
00389
00390 class IMAPResponseEXPUNGE
00391 {
00392 public:
00393 IMAPResponseEXPUNGE(QString mails = 0)
00394 {
00395 _mails = mails;
00396 }
00397
00398 void setMails(QString mails) { _mails = mails; }
00399 QString mails() { return _mails; }
00400
00401 private:
00402 QString _mails;
00403
00404 };
00405
00406 class IMAPResponseFETCH : public IMAPResponseEnums
00407 {
00408 public:
00409 void setEnvelope(IMAPResponseEnvelope envelope) { _envelope = envelope; }
00410 IMAPResponseEnvelope envelope() { return _envelope; }
00411 void setFlags(QValueList<IMAPResponseFlags> flags) { _flags = flags; }
00412 QValueList<IMAPResponseFlags> flags() { return _flags; }
00413 void setInternalDate(QString idate) { _idate = idate; }
00414 QString internalDate() { return _idate; }
00415 void setRFC822Size(QString rfc822size) { _rfc822size = rfc822size; }
00416 QString RFC822Size() { return _rfc822size; }
00417 void setUid(QString uid) { _uid = uid; }
00418 QString uid() { return _uid; }
00419
00420 void setBody(QString body) { _body = body; }
00421 QString body() { return _body; }
00422 void addBodyPart(IMAPResponseBodyPart part) { _bodyParts.append(part); }
00423 void setBodyParts(QValueList<IMAPResponseBodyPart> parts) { _bodyParts = parts; }
00424 QValueList<IMAPResponseBodyPart> bodyParts() { return _bodyParts; }
00425 IMAPResponseBodyPart bodyPart(int part) { return _bodyParts[part]; }
00426 void setRfc822(QString rfc822) { _rfc822 = rfc822; }
00427 QString rfc822() { return _rfc822; }
00428 void setRfc822Header(QString rfc822Header) { _rfc822Header = rfc822Header; }
00429 QString rfc822Header() { return _rfc822Header; }
00430 void setRfc822Text(QString rfc822Text) { _rfc822Text = rfc822Text; }
00431 QString rfc822Text() { return _rfc822Text; }
00432
00433 private:
00434 IMAPResponseEnvelope _envelope;
00435 QValueList<IMAPResponseFlags> _flags;
00436 QString _idate, _rfc822size, _uid, _body, _rfc822, _rfc822Header, _rfc822Text;
00437 QValueList<IMAPResponseBodyPart> _bodyParts;
00438
00439 };
00440
00441 class IMAPResponse : public IMAPResponseEnums
00442 {
00443 public:
00444 void setTag(QString tag) { _tag = tag; }
00445 QString tag() { return _tag; }
00446
00447 void setImapHandler(IMAPHandler *handler) { _handler = handler; }
00448 IMAPHandler *imapHandler() { return _handler; }
00449
00450 void setStatusResponse(IMAPResponseStatusResponse response) { _response = response; }
00451 IMAPResponseStatusResponse statusResponse() { return _response; }
00452
00453 void addOK(IMAPResponseOK ok) { _okl.append(ok); }
00454 void addNO(IMAPResponseNO no) { _nol.append(no); }
00455 void addBAD(IMAPResponseBAD bad) { _badl.append(bad); }
00456 void addCAPABILITY(IMAPResponseCAPABILITY capability) { _capabilityl.append(capability); }
00457 void addLIST(IMAPResponseLIST list) { _listl.append(list); }
00458 void addLSUB(IMAPResponseLSUB lsub) { _lsubl.append(lsub); }
00459 void addSTATUS(IMAPResponseSTATUS status) { _statusl.append(status); }
00460 void addSEARCH(IMAPResponseSEARCH search) { _searchl.append(search); }
00461 void addFLAGS(IMAPResponseFLAGS flags) { _flagsl.append(flags); }
00462 void addEXISTS(IMAPResponseEXISTS exists) { _existsl.append(exists); }
00463 void addRECENT(IMAPResponseRECENT recent) { _recentl.append(recent); }
00464 void addEXPUNGE(IMAPResponseEXPUNGE expunge) { _expungel.append(expunge); }
00465 void addFETCH(IMAPResponseFETCH fetch) { _fetchl.append(fetch); }
00466
00467 QValueList<IMAPResponseOK> OK() { return _okl; }
00468 QValueList<IMAPResponseNO> NO() { return _nol; }
00469 QValueList<IMAPResponseBAD> BAD() { return _badl; }
00470 QValueList<IMAPResponseCAPABILITY> CAPABILITY() { return _capabilityl; }
00471 QValueList<IMAPResponseLIST> LIST() { return _listl; }
00472 QValueList<IMAPResponseLSUB> LSUB() { return _lsubl; }
00473 QValueList<IMAPResponseSTATUS> STATUS() { return _statusl; }
00474 QValueList<IMAPResponseSEARCH> SEARCH() { return _searchl; }
00475 QValueList<IMAPResponseFLAGS> FLAGS() { return _flagsl; }
00476 QValueList<IMAPResponseEXISTS> EXISTS() { return _existsl; }
00477 QValueList<IMAPResponseRECENT> RECENT() { return _recentl; }
00478 QValueList<IMAPResponseEXPUNGE> EXPUNGE() { return _expungel; }
00479 QValueList<IMAPResponseFETCH> FETCH() { return _fetchl; }
00480
00481 private:
00482 QString _tag;
00483 IMAPResponseStatusResponse _response;
00484
00485 IMAPHandler *_handler;
00486
00487 QValueList<IMAPResponseOK> _okl;
00488 QValueList<IMAPResponseNO> _nol;
00489 QValueList<IMAPResponseBAD> _badl;
00490 QValueList<IMAPResponseCAPABILITY> _capabilityl;
00491 QValueList<IMAPResponseLIST> _listl;
00492 QValueList<IMAPResponseLSUB> _lsubl;
00493 QValueList<IMAPResponseSTATUS> _statusl;
00494 QValueList<IMAPResponseSEARCH> _searchl;
00495 QValueList<IMAPResponseFLAGS> _flagsl;
00496 QValueList<IMAPResponseEXISTS> _existsl;
00497 QValueList<IMAPResponseRECENT> _recentl;
00498 QValueList<IMAPResponseEXPUNGE> _expungel;
00499 QValueList<IMAPResponseFETCH> _fetchl;
00500
00501 };
00502
00503 class IMAPResponseParser : public QObject, public IMAPResponseEnums
00504 {
00505 Q_OBJECT
00506
00507 public:
00508 IMAPResponseParser();
00509 void parse ( const QString &data);
00510
00511 IMAPResponse response();
00512
00513 signals:
00514 void needMoreData(QString &data);
00515
00516 protected:
00517 void parseResponse(const QString &data, bool tagged = false);
00518
00519 QStringList splitData(const QString &data, bool withBrackets);
00520 void parseParenthesizedList(const QString &data, QStringList &parsed);
00521 void splitTagData(const QString &line, QString &tag, QString &data);
00522 QString removeLimiters(QString &string, const QChar &sl = '"', const QChar &el = '"');
00523 IMAPResponseCode getResponseCode(const QString &line);
00524 QValueList<IMAPResponseFlags> parseFlagList(const QStringList &flags);
00525
00526 private:
00527 IMAPResponse _iresponse;
00528
00529 };
00530
00531 #endif
00532