summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/unsupported/mail2/libmail/imaphandler.cpp9
-rw-r--r--noncore/unsupported/mail2/libmail/imaphandler.h2
2 files changed, 10 insertions, 1 deletions
diff --git a/noncore/unsupported/mail2/libmail/imaphandler.cpp b/noncore/unsupported/mail2/libmail/imaphandler.cpp
index 66c92c5..730a004 100644
--- a/noncore/unsupported/mail2/libmail/imaphandler.cpp
+++ b/noncore/unsupported/mail2/libmail/imaphandler.cpp
@@ -1,71 +1,72 @@
#include "imapresponse.h"
#include "imaphandler.h"
#include "imapbase.h"
IMAPHandler::IMAPHandler(const Account &account)
: QObject(), _account(account)
{
+ _ready = false;
_loggingin = false;
_loggedin = false;
_tag = 0;
_ibase = new IMAPBase(account);
connect(_ibase, SIGNAL(dataReceived(const QString &)), SLOT(slotDataReceived(const QString &)));
connect(_ibase, SIGNAL(lookingUpHost()), SLOT(slotLookingUpHost()));
connect(_ibase, SIGNAL(hostFound()), SLOT(slotHostFound()));
connect(_ibase, SIGNAL(connected()), SLOT(slotConnected()));
connect(_ibase, SIGNAL(disconnected()), SLOT(slotDisconnected()));
connect(_ibase, SIGNAL(error(int)), SLOT(slotError(int)));
}
void IMAPHandler::doLogin()
{
if (_loggedin) return;
if (_loggingin) return;
_loggingin = true;
iLogin(_account.user(), _account.pass());
}
QString IMAPHandler::iCapability()
{
_ibase->sendCommand(QString("%1 CAPABILITY\r\n")
.arg(tag()));
return tag(false);
}
QString IMAPHandler::iNoop()
{
_ibase->sendCommand(QString("%1 NOOP\r\n")
.arg(tag()));
return tag(false);
}
QString IMAPHandler::iLogout()
{
_ibase->sendCommand(QString("%1 LOGOUT\r\n")
.arg(tag()));
return tag(false);
}
QString IMAPHandler::iAuthenticate(const QString &mechanism)
{
_ibase->sendCommand(QString("%1 AUTHENTICATE \"%2\"\r\n")
.arg(tag())
.arg(escape(mechanism)));
return tag(false);
}
QString IMAPHandler::iLogin(const QString &user, const QString &pass)
{
_ibase->sendCommand(QString("%1 LOGIN \"%2\" \"%3\"\r\n")
.arg(tag())
.arg(escape(user))
.arg(escape(pass)));
return tag(false);
}
QString IMAPHandler::iSelect(const QString &mailbox)
{
doLogin();
@@ -228,107 +229,115 @@ QString IMAPHandler::iFetch(const QString &message, const QString &items)
_ibase->sendCommand(QString("%1 FETCH %2 (%3)\r\n")
.arg(tag())
.arg(message)
.arg(items));
return tag(false);
}
QString IMAPHandler::iStore(const QString &message, const QString &items)
{
doLogin();
_ibase->sendCommand(QString("%1 STORE %2 %3\r\n")
.arg(tag())
.arg(message)
.arg(items));
return tag(false);
}
QString IMAPHandler::iCopy(const QString &message, const QString &mailbox)
{
doLogin();
_ibase->sendCommand(QString("%1 COPY %2 \"%3\"\r\n")
.arg(tag())
.arg(message)
.arg(escape(mailbox)));
return tag(false);
}
QString IMAPHandler::iUid(const QString &command, const QString &arguments)
{
doLogin();
_ibase->sendCommand(QString("%1 UID %2 %3\r\n")
.arg(tag())
.arg(command)
.arg(arguments));
return tag(false);
}
QString IMAPHandler::iX(const QString &commandAtom, const QString &arguments)
{
doLogin();
_ibase->sendCommand(QString("%1 X%2 %3\r\n")
.arg(tag())
.arg(commandAtom)
.arg(arguments));
return tag(false);
}
QString IMAPHandler::escape(const QString &in)
{
QString in_ = in;
return in_.replace(QRegExp("\""), "\\\"");
}
QString IMAPHandler::tag(bool count)
{
return QString("a%1").arg(count ? _tag++ : _tag);
}
void IMAPHandler::slotDataReceived(const QString &data)
{
+ if (!_ready) {
+ // The first data is always the greeting string.
+ // We can ignore it.
+ _ready = true;
+ return;
+ }
+
+
IMAPResponseParser parser(data);
IMAPResponse response = parser.response();
response.setImapHandler(this);
if (!_loggingin) emit gotResponse(response);
else {
if (response.statusResponse().status() == IMAPResponseEnums::OK) {
_loggingin = false;
_loggedin = true;
qWarning("OK. Logged in. Leaving loggingin state.");
} else {
_loggingin = false;
emit IMAPError(IMAPBase::IMAPErrLoginFailed);
}
}
}
void IMAPHandler::slotLookingUpHost()
{
emit IMAPLookingUpHost();
}
void IMAPHandler::slotHostFound()
{
emit IMAPHostFound();
}
void IMAPHandler::slotConnected()
{
emit IMAPConnected();
}
void IMAPHandler::slotDisconnected()
{
_loggedin = false;
emit IMAPDisconnected();
}
void IMAPHandler::slotError(int err)
{
emit IMAPError(err);
}
diff --git a/noncore/unsupported/mail2/libmail/imaphandler.h b/noncore/unsupported/mail2/libmail/imaphandler.h
index 8cb42db..cc47a85 100644
--- a/noncore/unsupported/mail2/libmail/imaphandler.h
+++ b/noncore/unsupported/mail2/libmail/imaphandler.h
@@ -18,69 +18,69 @@ public:
QString iCapability();
QString iNoop();
QString iLogout();
QString iAuthenticate(const QString &mechanism);
QString iLogin(const QString &user, const QString &pass);
QString iSelect(const QString &mailbox);
QString iExamine(const QString &mailbox);
QString iCreate(const QString &mailbox);
QString iDelete(const QString &mailbox);
QString iRename(const QString &mailbox, const QString &newMailbox);
QString iSubscribe(const QString &mailbox);
QString iUnsubscribe(const QString &mailbox);
QString iList(const QString &reference, const QString &mailbox);
QString iLsub(const QString &reference, const QString &mailbox);
QString iStatus(const QString &mailbox, const QString &items);
QString iAppend(const QString &mailbox, const QString &literal, const QString &flags = 0, const QString &datetime = 0);
QString iCheck();
QString iClose();
QString iExpunge();
QString iSearch(const QString &search, const QString &charset = 0);
QString iFetch(const QString &message, const QString &items);
QString iStore(const QString &message, const QString &items);
QString iCopy(const QString &message, const QString &mailbox);
QString iUid(const QString &command, const QString &arguments);
QString iX(const QString &commandAtom, const QString &arguments);
signals:
void gotResponse(IMAPResponse &response);
void IMAPLookingUpHost();
void IMAPHostFound();
void IMAPConnected();
void IMAPDisconnected();
void IMAPError(int err);
protected:
void doLogin();
QString escape(const QString &in);
QString tag(bool count = true);
protected slots:
void slotDataReceived(const QString &data);
void slotLookingUpHost();
void slotHostFound();
void slotConnected();
void slotDisconnected();
void slotError(int err);
private:
Account _account;
IMAPBase *_ibase;
unsigned int _tag;
- bool _loggingin, _loggedin;
+ bool _ready, _loggingin, _loggedin;
};
#endif