From 1ba34f8b16cd06a74ff96dfae803ce4b0521652b Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Mon, 28 Aug 2017 17:19:51 -0600 Subject: Detect connection lost so we can go to offline state kimap should really have better error codes... --- examples/imapresource/imapserverproxy.cpp | 32 ++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) (limited to 'examples/imapresource/imapserverproxy.cpp') diff --git a/examples/imapresource/imapserverproxy.cpp b/examples/imapresource/imapserverproxy.cpp index 538105c..a0f0970 100644 --- a/examples/imapresource/imapserverproxy.cpp +++ b/examples/imapresource/imapserverproxy.cpp @@ -80,6 +80,21 @@ static KAsync::Job runJob(KJob *job, const std::function &f) }); } +static int translateImapError(int error) +{ + switch (error) { + case KJob::UserDefinedError: + return Imap::ConnectionLost; + case KIMAP2::LoginJob::ErrorCode::ERR_HOST_NOT_FOUND: + return Imap::HostNotFoundError; + case KIMAP2::LoginJob::ErrorCode::ERR_COULD_NOT_CONNECT: + return Imap::CouldNotConnectError; + case KIMAP2::LoginJob::ErrorCode::ERR_SSL_HANDSHAKE_FAILED: + return Imap::SslHandshakeError; + } + return Imap::UnknownError; +} + static KAsync::Job runJob(KJob *job) { return KAsync::start([job](KAsync::Future &future) { @@ -87,7 +102,8 @@ static KAsync::Job runJob(KJob *job) SinkTrace() << "Job done: " << job->metaObject()->className(); if (job->error()) { SinkWarning() << "Job failed: " << job->errorString() << job->metaObject()->className(); - future.setError(job->error(), job->errorString()); + auto proxyError = translateImapError(job->error()); + future.setError(proxyError, job->errorString()); } else { future.setFinished(); } @@ -166,20 +182,6 @@ KAsync::Job ImapServerProxy::login(const QString &username, const QString // SinkTrace() << "Found personal namespaces: " << mNamespaces.personal; // SinkTrace() << "Found shared namespaces: " << mNamespaces.shared; // SinkTrace() << "Found user namespaces: " << mNamespaces.user; - }).then([=] (const KAsync::Error &error) { - if (error) { - switch (error.errorCode) { - case KIMAP2::LoginJob::ErrorCode::ERR_HOST_NOT_FOUND: - return KAsync::error(HostNotFoundError, "Host not found: " + error.errorMessage); - case KIMAP2::LoginJob::ErrorCode::ERR_COULD_NOT_CONNECT: - return KAsync::error(CouldNotConnectError, "Failed to connect: " + error.errorMessage); - case KIMAP2::LoginJob::ErrorCode::ERR_SSL_HANDSHAKE_FAILED: - return KAsync::error(SslHandshakeError, "Ssl handshake failed: " + error.errorMessage); - default: - return KAsync::error(error); - } - } - return KAsync::null(); }); } -- cgit v1.2.3 From be19bfef2d04943aa17b3f719f50f34f647c4eeb Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Mon, 28 Aug 2017 21:21:44 -0600 Subject: Translate the error in both runJob overloads. --- examples/imapresource/imapserverproxy.cpp | 33 ++++++++++++++++--------------- 1 file changed, 17 insertions(+), 16 deletions(-) (limited to 'examples/imapresource/imapserverproxy.cpp') diff --git a/examples/imapresource/imapserverproxy.cpp b/examples/imapresource/imapserverproxy.cpp index a0f0970..5c2e07c 100644 --- a/examples/imapresource/imapserverproxy.cpp +++ b/examples/imapresource/imapserverproxy.cpp @@ -61,6 +61,21 @@ const char* Imap::Capabilities::Namespace = "NAMESPACE"; const char* Imap::Capabilities::Uidplus = "UIDPLUS"; const char* Imap::Capabilities::Condstore = "CONDSTORE"; +static int translateImapError(int error) +{ + switch (error) { + case KJob::UserDefinedError: + return Imap::ConnectionLost; + case KIMAP2::LoginJob::ErrorCode::ERR_HOST_NOT_FOUND: + return Imap::HostNotFoundError; + case KIMAP2::LoginJob::ErrorCode::ERR_COULD_NOT_CONNECT: + return Imap::CouldNotConnectError; + case KIMAP2::LoginJob::ErrorCode::ERR_SSL_HANDSHAKE_FAILED: + return Imap::SslHandshakeError; + } + return Imap::UnknownError; +} + template static KAsync::Job runJob(KJob *job, const std::function &f) { @@ -69,7 +84,8 @@ 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(); - future.setError(job->error(), job->errorString()); + auto proxyError = translateImapError(job->error()); + future.setError(proxyError, job->errorString()); } else { future.setValue(f(job)); future.setFinished(); @@ -80,21 +96,6 @@ static KAsync::Job runJob(KJob *job, const std::function &f) }); } -static int translateImapError(int error) -{ - switch (error) { - case KJob::UserDefinedError: - return Imap::ConnectionLost; - case KIMAP2::LoginJob::ErrorCode::ERR_HOST_NOT_FOUND: - return Imap::HostNotFoundError; - case KIMAP2::LoginJob::ErrorCode::ERR_COULD_NOT_CONNECT: - return Imap::CouldNotConnectError; - case KIMAP2::LoginJob::ErrorCode::ERR_SSL_HANDSHAKE_FAILED: - return Imap::SslHandshakeError; - } - return Imap::UnknownError; -} - static KAsync::Job runJob(KJob *job) { return KAsync::start([job](KAsync::Future &future) { -- cgit v1.2.3