From 11b790ba6f06141db802273628ce2d191982677e Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Tue, 2 Jan 2018 11:10:08 +0100 Subject: Avoid ending up with a connection lost error when a select fails --- examples/imapresource/imapserverproxy.cpp | 13 ++++++++++--- examples/imapresource/imapserverproxy.h | 1 + 2 files changed, 11 insertions(+), 3 deletions(-) (limited to 'examples') diff --git a/examples/imapresource/imapserverproxy.cpp b/examples/imapresource/imapserverproxy.cpp index 8a791a2..b27ffb0 100644 --- a/examples/imapresource/imapserverproxy.cpp +++ b/examples/imapresource/imapserverproxy.cpp @@ -62,8 +62,11 @@ const char* Imap::Capabilities::Namespace = "NAMESPACE"; const char* Imap::Capabilities::Uidplus = "UIDPLUS"; const char* Imap::Capabilities::Condstore = "CONDSTORE"; -static int translateImapError(int error, bool isLoginJob) +static int translateImapError(KJob *job) { + const int error = job->error(); + const bool isLoginJob = dynamic_cast(job); + const bool isSelectJob = dynamic_cast(job); switch (error) { case KIMAP2::LoginJob::ErrorCode::ERR_HOST_NOT_FOUND: return Imap::HostNotFoundError; @@ -76,6 +79,10 @@ static int translateImapError(int error, bool isLoginJob) if (isLoginJob) { return Imap::LoginFailed; } + //Hack to detect selection errors + if (isSelectJob) { + return Imap::SelectFailed; + } //Hack to detect connection lost if (error == KJob::UserDefinedError) { return Imap::ConnectionLost; @@ -91,7 +98,7 @@ static KAsync::Job runJob(KJob *job, const std::function &f) SinkTrace() << "Job done: " << job->metaObject()->className(); if (job->error()) { SinkWarning() << "Job failed: " << job->errorString() << job->metaObject()->className() << job->error(); - auto proxyError = translateImapError(job->error(), dynamic_cast(job)); + auto proxyError = translateImapError(job); future.setError(proxyError, job->errorString()); } else { future.setValue(f(job)); @@ -110,7 +117,7 @@ static KAsync::Job runJob(KJob *job) SinkTrace() << "Job done: " << job->metaObject()->className(); if (job->error()) { SinkWarning() << "Job failed: " << job->errorString() << job->metaObject()->className() << job->error(); - auto proxyError = translateImapError(job->error(), dynamic_cast(job)); + auto proxyError = translateImapError(job); future.setError(proxyError, job->errorString()); } else { future.setFinished(); diff --git a/examples/imapresource/imapserverproxy.h b/examples/imapresource/imapserverproxy.h index 0dc6e55..57b252d 100644 --- a/examples/imapresource/imapserverproxy.h +++ b/examples/imapresource/imapserverproxy.h @@ -37,6 +37,7 @@ enum ErrorCode { SslHandshakeError, ConnectionLost, MissingCredentialsError, + SelectFailed, UnknownError }; -- cgit v1.2.3