Branch 'kolab/integration/4.13.0' - 2 commits - resources/imap

Christian Mollekopf mollekopf at kolabsys.com
Mon Dec 1 13:13:02 CET 2014


 resources/imap/imapresourcebase.cpp |   27 ++++++++++++++-------------
 resources/imap/imapresourcebase.h   |    1 +
 2 files changed, 15 insertions(+), 13 deletions(-)

New commits:
commit 4e73e04b23aabc903e695bf897132bdcf3c9cd65
Merge: 6bf7244 5c4a908
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Mon Dec 1 13:12:48 2014 +0100

    Merge remote-tracking branch 'kolab/kolab/integration/4.13.0' into kolab/integration/4.13.0



commit 6bf7244ca8dc7ebe2635aa3a5950877e72c8434c
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Mon Nov 17 16:40:52 2014 +0100

    ImapResource: Cancel the current task if we disconnect while the login is ongoing.
    
    Otherwise we may end up with a stuck startConnect task if the socket somehow disconnects during login.

diff --git a/resources/imap/imapresourcebase.cpp b/resources/imap/imapresourcebase.cpp
index 904f0a6..62d2457 100644
--- a/resources/imap/imapresourcebase.cpp
+++ b/resources/imap/imapresourcebase.cpp
@@ -97,7 +97,8 @@ ImapResourceBase::ImapResourceBase( const QString &id )
     m_pool( new SessionPool( 2, this ) ),
     mSubscriptions( 0 ),
     m_idle( 0 ),
-    m_settings( 0 )
+    m_settings( 0 ),
+    m_startConnectInProgress( false )
 {
   QTimer::singleShot( 0, this, SLOT(updateResourceName()) );
 
@@ -240,6 +241,7 @@ void ImapResourceBase::startConnect( const QVariant& )
     taskDone();
     return;
   }
+  m_startConnectInProgress = true;
 
   m_pool->disconnect(); // reset all state, delete any old account
   ImapAccount *account = new ImapAccount;
@@ -287,15 +289,14 @@ int ImapResourceBase::configureSubscription(qlonglong windowId)
 
 void ImapResourceBase::onConnectDone( int errorCode, const QString &errorString )
 {
+  m_startConnectInProgress = false;
   switch ( errorCode ) {
   case SessionPool::NoError:
     setOnline( true );
     taskDone();
     emit status( Idle, i18n( "Connection established." ) );
-
     synchronizeCollectionTree();
     break;
-
   case SessionPool::PasswordRequestError:
   case SessionPool::EncryptionError:
   case SessionPool::LoginFailError:
@@ -304,24 +305,22 @@ void ImapResourceBase::onConnectDone( int errorCode, const QString &errorString
     setOnline( false );
     emit status( Broken, errorString );
     cancelTask();
-    return;
-
+    break;
   case SessionPool::CouldNotConnectError:
     emit status( Idle, i18n( "Server is not available." ) );
     deferTask();
     setTemporaryOffline((m_pool->account() && m_pool->account()->timeout() > 0) ? m_pool->account()->timeout() : 300);
-    return;
-
+    break;
   case SessionPool::ReconnectNeededError:
     reconnect();
-    return;
-
+    break;
   case SessionPool::NoAvailableSessionError:
     kFatal() << "Shouldn't happen";
-    return;
+    break;
   case SessionPool::CancelledError:
     kWarning() << "Session login cancelled";
-    return;
+    cancelTask();
+    break;
   }
 }
 
@@ -518,9 +517,7 @@ void ImapResourceBase::scheduleConnectionAttempt()
 
 void ImapResourceBase::doSetOnline(bool online)
 {
-#ifndef IMAPRESOURCE_NO_SOLID
   kDebug() << "online=" << online;
-#endif
   if ( !online ) {
     Q_FOREACH(ResourceTask* task, m_taskList) {
       task->kill();
@@ -531,6 +528,10 @@ void ImapResourceBase::doSetOnline(bool online)
     if (m_pool->isConnected()) {
         m_pool->disconnect();
     }
+    if (m_startConnectInProgress) {
+      cancelTask();
+      m_startConnectInProgress = false;
+    }
     if (m_idle) {
       m_idle->stop();
       delete m_idle;
diff --git a/resources/imap/imapresourcebase.h b/resources/imap/imapresourcebase.h
index 04a7cf9..716a1cc 100644
--- a/resources/imap/imapresourcebase.h
+++ b/resources/imap/imapresourcebase.h
@@ -166,6 +166,7 @@ private:
   ImapIdleManager *m_idle;
   QTimer *m_statusMessageTimer;
   QChar m_separatorCharacter;
+  bool m_startConnectInProgress;
 };
 
 #endif




More information about the commits mailing list