00001 #include "imapresponse.h"
00002 #include "imaphandler.h"
00003 #include "imapbase.h"
00004
00005 IMAPHandler::IMAPHandler(const Account &account)
00006 : QObject(), _account(account)
00007 {
00008 _ready = false;
00009 _loggingin = false;
00010 _loggedin = false;
00011 _tag = 0;
00012 _ibase = new IMAPBase(account);
00013
00014 connect(_ibase, SIGNAL(dataReceived(const QString&)), SLOT(slotDataReceived(const QString&)));
00015 connect(_ibase, SIGNAL(lookingUpHost()), SLOT(slotLookingUpHost()));
00016 connect(_ibase, SIGNAL(hostFound()), SLOT(slotHostFound()));
00017 connect(_ibase, SIGNAL(connected()), SLOT(slotConnected()));
00018 connect(_ibase, SIGNAL(disconnected()), SLOT(slotDisconnected()));
00019 connect(_ibase, SIGNAL(error(int)), SLOT(slotError(int)));
00020 }
00021
00022 void IMAPHandler::doLogin()
00023 {
00024 if (_loggedin) return;
00025 if (_loggingin) return;
00026
00027 _loggingin = true;
00028 iLogin(_account.user(), _account.pass());
00029 }
00030
00031 QString IMAPHandler::iCapability()
00032 {
00033 _ibase->sendCommand(QString("%1 CAPABILITY\r\n")
00034 .arg(tag()));
00035 return tag(false);
00036 }
00037
00038 QString IMAPHandler::iNoop()
00039 {
00040 _ibase->sendCommand(QString("%1 NOOP\r\n")
00041 .arg(tag()));
00042 return tag(false);
00043 }
00044
00045 QString IMAPHandler::iLogout()
00046 {
00047 _ibase->sendCommand(QString("%1 LOGOUT\r\n")
00048 .arg(tag()));
00049 return tag(false);
00050 }
00051
00052 QString IMAPHandler::iAuthenticate(const QString &mechanism)
00053 {
00054 _ibase->sendCommand(QString("%1 AUTHENTICATE \"%2\"\r\n")
00055 .arg(tag())
00056 .arg(escape(mechanism)));
00057 return tag(false);
00058 }
00059
00060 QString IMAPHandler::iLogin(const QString &user, const QString &pass)
00061 {
00062 _ibase->sendCommand(QString("%1 LOGIN \"%2\" \"%3\"\r\n")
00063 .arg(tag())
00064 .arg(escape(user))
00065 .arg(escape(pass)));
00066 return tag(false);
00067 }
00068
00069 QString IMAPHandler::iSelect(const QString &mailbox)
00070 {
00071 doLogin();
00072
00073 _ibase->sendCommand(QString("%1 SELECT \"%2\"\r\n")
00074 .arg(tag())
00075 .arg(escape(mailbox)));
00076 return tag(false);
00077 }
00078
00079 QString IMAPHandler::iExamine(const QString &mailbox)
00080 {
00081 doLogin();
00082
00083 _ibase->sendCommand(QString("%1 EXAMINE \"%2\"\r\n")
00084 .arg(tag())
00085 .arg(escape(mailbox)));
00086 return tag(false);
00087 }
00088
00089 QString IMAPHandler::iCreate(const QString &mailbox)
00090 {
00091 doLogin();
00092
00093 _ibase->sendCommand(QString("%1 CREATE \"%2\"\r\n")
00094 .arg(tag())
00095 .arg(escape(mailbox)));
00096 return tag(false);
00097 }
00098
00099 QString IMAPHandler::iDelete(const QString &mailbox)
00100 {
00101 doLogin();
00102
00103 _ibase->sendCommand(QString("%1 DELETE \"%2\"\r\n")
00104 .arg(tag())
00105 .arg(escape(mailbox)));
00106 return tag(false);
00107 }
00108
00109 QString IMAPHandler::iRename(const QString &mailbox, const QString &newMailbox)
00110 {
00111 doLogin();
00112
00113 _ibase->sendCommand(QString("%1 RENAME \"%2\" \"%3\"\r\n")
00114 .arg(tag())
00115 .arg(escape(mailbox))
00116 .arg(escape(newMailbox)));
00117 return tag(false);
00118 }
00119
00120 QString IMAPHandler::iSubscribe(const QString &mailbox)
00121 {
00122 doLogin();
00123
00124 _ibase->sendCommand(QString("%1 SUBSCRIBE \"%2\"\r\n")
00125 .arg(tag())
00126 .arg(escape(mailbox)));
00127 return tag(false);
00128 }
00129
00130 QString IMAPHandler::iUnsubscribe(const QString &mailbox)
00131 {
00132 doLogin();
00133
00134 _ibase->sendCommand(QString("%1 UNSUBSCRIBE \"%2\"\r\n")
00135 .arg(tag())
00136 .arg(escape(mailbox)));
00137 return tag(false);
00138 }
00139
00140 QString IMAPHandler::iList(const QString &reference, const QString &mailbox)
00141 {
00142 doLogin();
00143
00144 _ibase->sendCommand(QString("%1 LIST \"%2\" \"%3\"\r\n")
00145 .arg(tag())
00146 .arg(escape(reference))
00147 .arg(escape(mailbox)));
00148 return tag(false);
00149 }
00150
00151 QString IMAPHandler::iLsub(const QString &reference, const QString &mailbox)
00152 {
00153 doLogin();
00154
00155 _ibase->sendCommand(QString("%1 LSUB \"%2\" \"%3\"\r\n")
00156 .arg(tag())
00157 .arg(escape(reference))
00158 .arg(escape(mailbox)));
00159 return tag(false);
00160 }
00161
00162 QString IMAPHandler::iStatus(const QString &mailbox, const QString &items)
00163 {
00164 doLogin();
00165
00166 _ibase->sendCommand(QString("%1 STATUS \"%2\" (%3)\r\n")
00167 .arg(tag())
00168 .arg(escape(mailbox))
00169 .arg(escape(items)));
00170 return tag(false);
00171 }
00172
00173 QString IMAPHandler::iAppend(const QString &mailbox, const QString &literal, const QString &flags, const QString &datetime)
00174 {
00175 doLogin();
00176
00177 _ibase->sendCommand(QString("%1 APPEND \"%2\" (%3) \"%4\" {%5}\r\n%6\r\n")
00178 .arg(tag())
00179 .arg(escape(mailbox))
00180 .arg(flags)
00181 .arg(escape(datetime))
00182 .arg(literal.length())
00183 .arg(literal));
00184 return tag(false);
00185 }
00186
00187 QString IMAPHandler::iCheck()
00188 {
00189 doLogin();
00190
00191 _ibase->sendCommand(QString("%1 CHECK\r\n")
00192 .arg(tag()));
00193 return tag(false);
00194 }
00195
00196 QString IMAPHandler::iClose()
00197 {
00198 doLogin();
00199
00200 _ibase->sendCommand(QString("%1 CLOSE\r\n")
00201 .arg(tag()));
00202 return tag(false);
00203 }
00204
00205 QString IMAPHandler::iExpunge()
00206 {
00207 doLogin();
00208
00209 _ibase->sendCommand(QString("%1 EXPUNGE\r\n")
00210 .arg(tag()));
00211 return tag(false);
00212 }
00213
00214 QString IMAPHandler::iSearch(const QString &search, const QString &charset)
00215 {
00216 doLogin();
00217
00218 _ibase->sendCommand(QString("%1 SEARCH %2 %3\r\n")
00219 .arg(tag())
00220 .arg(charset.isEmpty() ? QString(0) : escape(charset))
00221 .arg(search));
00222 return tag(false);
00223 }
00224
00225 QString IMAPHandler::iFetch(const QString &message, const QString &items)
00226 {
00227 doLogin();
00228
00229 _ibase->sendCommand(QString("%1 FETCH %2 (%3)\r\n")
00230 .arg(tag())
00231 .arg(message)
00232 .arg(items));
00233 return tag(false);
00234 }
00235
00236 QString IMAPHandler::iStore(const QString &message, const QString &items)
00237 {
00238 doLogin();
00239
00240 _ibase->sendCommand(QString("%1 STORE %2 %3\r\n")
00241 .arg(tag())
00242 .arg(message)
00243 .arg(items));
00244 return tag(false);
00245 }
00246
00247 QString IMAPHandler::iCopy(const QString &message, const QString &mailbox)
00248 {
00249 doLogin();
00250
00251 _ibase->sendCommand(QString("%1 COPY %2 \"%3\"\r\n")
00252 .arg(tag())
00253 .arg(message)
00254 .arg(escape(mailbox)));
00255 return tag(false);
00256 }
00257
00258 QString IMAPHandler::iUid(const QString &command, const QString &arguments)
00259 {
00260 doLogin();
00261
00262 _ibase->sendCommand(QString("%1 UID %2 %3\r\n")
00263 .arg(tag())
00264 .arg(command)
00265 .arg(arguments));
00266 return tag(false);
00267 }
00268
00269 QString IMAPHandler::iX(const QString &commandAtom, const QString &arguments)
00270 {
00271 doLogin();
00272
00273 _ibase->sendCommand(QString("%1 X%2 %3\r\n")
00274 .arg(tag())
00275 .arg(commandAtom)
00276 .arg(arguments));
00277 return tag(false);
00278 }
00279
00280 QString IMAPHandler::escape(const QString &in)
00281 {
00282 QString in_ = in;
00283 return in_.replace(QRegExp("\""), "\\\"");
00284 }
00285
00286 QString IMAPHandler::tag(bool count)
00287 {
00288 return QString("a%1").arg(count ? _tag++ : _tag);
00289 }
00290
00291 void IMAPHandler::slotDataReceived(const QString &data)
00292 {
00293 if (!_ready) {
00294
00295
00296 _ready = true;
00297 return;
00298 }
00299
00300
00301 IMAPResponseParser parser;
00302
00303 parser. parse ( data );
00304 IMAPResponse response = parser.response();
00305
00306 response.setImapHandler(this);
00307
00308 if (!_loggingin) { qDebug("Emitting gotResponse!\n" ); emit gotResponse(response); }
00309 else {
00310 if (response.statusResponse().status() == IMAPResponseEnums::OK) {
00311 _loggingin = false;
00312 _loggedin = true;
00313 qWarning("OK. Logged in. Leaving loggingin state.");
00314 } else {
00315 _loggingin = false;
00316 emit IMAPError(IMAPBase::IMAPErrLoginFailed);
00317 }
00318 }
00319 }
00320
00321 void IMAPHandler::slotLookingUpHost()
00322 {
00323 emit IMAPLookingUpHost();
00324 }
00325
00326 void IMAPHandler::slotHostFound()
00327 {
00328 emit IMAPHostFound();
00329 }
00330
00331 void IMAPHandler::slotConnected()
00332 {
00333 emit IMAPConnected();
00334 }
00335
00336 void IMAPHandler::slotDisconnected()
00337 {
00338 _loggedin = false;
00339 emit IMAPDisconnected();
00340 }
00341
00342 void IMAPHandler::slotError(int err)
00343 {
00344 emit IMAPError(err);
00345 }
00346