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... --- common/domain/applicationdomaintype.h | 1 + common/synchronizer.cpp | 5 ++++- examples/imapresource/imapresource.cpp | 2 ++ examples/imapresource/imapserverproxy.cpp | 32 ++++++++++++++++--------------- examples/imapresource/imapserverproxy.h | 4 +++- 5 files changed, 27 insertions(+), 17 deletions(-) diff --git a/common/domain/applicationdomaintype.h b/common/domain/applicationdomaintype.h index 518f6d5..f7fd07e 100644 --- a/common/domain/applicationdomaintype.h +++ b/common/domain/applicationdomaintype.h @@ -101,6 +101,7 @@ enum SINK_EXPORT ErrorCode { LoginError, ConfigurationError, TransmissionError, + ConnectionLostError, }; enum SINK_EXPORT SuccessCode { diff --git a/common/synchronizer.cpp b/common/synchronizer.cpp index b6e33d5..46d3980 100644 --- a/common/synchronizer.cpp +++ b/common/synchronizer.cpp @@ -344,8 +344,11 @@ void Synchronizer::setStatusFromResult(const KAsync::Error &error, const QString } else if (error.errorCode == ApplicationDomain::LoginError) { //If we failed to login altough we could connect that indicates a problem with our setup. setStatus(ApplicationDomain::ErrorStatus, s, requestId); + } else if (error.errorCode == ApplicationDomain::ConnectionLostError) { + //We've lost the connection so we assume the connection to the server broke. + setStatus(ApplicationDomain::OfflineStatus, s, requestId); } - //We don't know what kind of error this was, so we assume it's transient and don't change ou status. + //We don't know what kind of error this was, so we assume it's transient and don't change our status. } else { //An operation against the server worked, so we're probably online. setStatus(ApplicationDomain::ConnectedStatus, s, requestId); diff --git a/examples/imapresource/imapresource.cpp b/examples/imapresource/imapresource.cpp index 0c0c134..3ae7fd7 100644 --- a/examples/imapresource/imapresource.cpp +++ b/examples/imapresource/imapresource.cpp @@ -511,6 +511,8 @@ public: return {ApplicationDomain::LoginError, error.errorMessage}; case Imap::HostNotFoundError: return {ApplicationDomain::NoServerError, error.errorMessage}; + case Imap::ConnectionLost: + return {ApplicationDomain::ConnectionLostError, error.errorMessage}; default: return {ApplicationDomain::UnknownError, error.errorMessage}; } 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(); }); } diff --git a/examples/imapresource/imapserverproxy.h b/examples/imapresource/imapserverproxy.h index 82f4f58..f9b854b 100644 --- a/examples/imapresource/imapserverproxy.h +++ b/examples/imapresource/imapserverproxy.h @@ -33,7 +33,9 @@ enum ErrorCode { NoError, HostNotFoundError, CouldNotConnectError, - SslHandshakeError + SslHandshakeError, + ConnectionLost, + UnknownError }; namespace Flags -- cgit v1.2.3