File kdepim_networkstatus_branch.diff of Package kdepim3

Index: kmail/kmmainwin.cpp
================================================================================
--- kmail/Makefile.am
+++ kmail/Makefile.am
@@ -32,6 +32,7 @@
         ../libksieve/libksieve.la ../libemailfunctions/libemailfunctions.la \
         ../certmanager/lib/libkleopatra.la $(INDEXLIB) \
         ../libkcal/libkcal.la \
+        -lconnectionmanager \
         $(LIB_KHTML) $(LIB_KSPELL) $(LIB_KABC)
 
 kde_module_LTLIBRARIES = kcm_kmail.la libkmailpart.la libkmail_bodypartformatter_application_octetstream.la
--- kmail/accountmanager.cpp
+++ kmail/accountmanager.cpp
@@ -22,6 +22,7 @@
 #include <kdebug.h>
 #include <kconfig.h>
 #include <kapplication.h>
+#include <connectionmanager.h>
 
 #include <qregexp.h>
 #include <qvaluelist.h>
@@ -183,6 +184,15 @@
     return;
   }
 
+  if ( curAccount->type() == "imap" || curAccount->type() == "cachedimap" || curAccount->type() == "pop" )
+  {
+    // Check with the network status daemon whether the network is available
+    if ( !( ConnectionManager::self()->status() == NetworkStatus::Online || ConnectionManager::self()->status() == NetworkStatus::NoNetworks ) ) {
+      emit checkedMail( false, mInteractive, mTotalNewInFolder );
+      return;
+    }
+
+  }
   connect( curAccount, SIGNAL( finishedCheck( bool, CheckStatus ) ),
                 this, SLOT( processNextCheck( bool ) ) );
 
--- kmail/imapaccountbase.cpp
+++ kmail/imapaccountbase.cpp
@@ -947,7 +947,10 @@
       QString caption = i18n("Error");
 
       if ( jobsKilled || errorCode == KIO::ERR_COULD_NOT_LOGIN ) {
-        if ( errorCode == KIO::ERR_SERVER_TIMEOUT || errorCode == KIO::ERR_CONNECTION_BROKEN ) {
+        if ( ( errorCode == KIO::ERR_SERVER_TIMEOUT || errorCode == KIO::ERR_CONNECTION_BROKEN ) &&
+            /* suppress error messages about loss of connectivity whilst in offline mode */
+            GlobalSettings::self()->networkState() != GlobalSettings::EnumNetworkState::Offline )
+        {
           msg = i18n("The connection to the server %1 was unexpectedly closed or timed out. It will be re-established automatically if possible.").
             arg( name() );
           KMessageBox::information( kapp->activeWindow(), msg, caption, "kmailConnectionBrokenErrorDialog" );
@@ -959,11 +962,13 @@
             KPIM::BroadcastStatus::instance()->setStatusMsg(
                 i18n(  "The connection to account %1 timed out." ).arg( name() ) );
         } else {
-          if ( !errors.isEmpty() )
+          if ( !( errorCode == KIO::ERR_UNKNOWN_HOST && GlobalSettings::self()->networkState() == GlobalSettings::EnumNetworkState::Offline ) ) {
+            if ( !errors.isEmpty() )
               KMessageBox::detailedError( kapp->activeWindow(), msg, errors.join("\n").prepend("<qt>"), caption );
-          else
+            else
               KMessageBox::error( kapp->activeWindow(), msg, caption );
           }
+        }
       } else { // i.e. we have a chance to continue, ask the user about it
         if ( errors.count() >= 3 ) { // there is no detailedWarningContinueCancel... (#86517)
           QString error = prettifyQuotaError( errors[1], job );
--- kmail/kmkernel.cpp
+++ kmail/kmkernel.cpp
@@ -28,6 +28,7 @@
 #undef REALLY_WANT_KMSENDER
 #include "undostack.h"
 #include "accountmanager.h"
+#include "networkaccount.h"
 using KMail::AccountManager;
 #include <libkdepim/kfileio.h>
 #include "kmversion.h"
@@ -89,6 +90,7 @@
 #include <fixx11h.h>
 #include <kcmdlineargs.h>
 #include <kstartupinfo.h>
+#include <connectionmanager.h>
 
 KMKernel *KMKernel::mySelf = 0;
 
@@ -1205,7 +1207,13 @@
     return;
 
   GlobalSettings::setNetworkState( GlobalSettings::EnumNetworkState::Offline );
-  BroadcastStatus::instance()->setStatusMsg( i18n("KMail is set to be offline; all network jobs are suspended"));
+  for ( KMAccount * cur = the_acctMgr->first(); cur; cur = the_acctMgr->next() ) {
+    KMail::NetworkAccount * netAccount = dynamic_cast<KMail::NetworkAccount *>( cur );
+    if ( netAccount ) {
+      netAccount->killAllJobs( true );
+    }
+  }
+  BroadcastStatus::instance()->setStatusMsg( i18n("KMail is now offline; all network operations cancelled"));
   emit onlineStatusChanged( (GlobalSettings::EnumNetworkState::type)GlobalSettings::networkState() );
 }
 
@@ -1215,7 +1223,7 @@
     return;
 
   GlobalSettings::setNetworkState( GlobalSettings::EnumNetworkState::Online );
-  BroadcastStatus::instance()->setStatusMsg( i18n("KMail is set to be online; all network jobs resumed"));
+  BroadcastStatus::instance()->setStatusMsg( i18n("KMail is now online; network operations resumed"));
   emit onlineStatusChanged( (GlobalSettings::EnumNetworkState::type)GlobalSettings::networkState() );
 
   if ( kmkernel->msgSender()->sendImmediate() ) {
@@ -1225,10 +1233,7 @@
 
 bool KMKernel::isOffline()
 {
-  if ( GlobalSettings::self()->networkState() == GlobalSettings::EnumNetworkState::Offline )
-    return true;
-  else
-    return false;
+  return ( GlobalSettings::self()->networkState() == GlobalSettings::EnumNetworkState::Offline );
 }
 
 bool KMKernel::askToGoOnline()
@@ -1479,6 +1484,8 @@
   if (lsf)
     the_searchFolderMgr->remove( lsf );
 
+  ConnectionManager::self()->registerConnectSlot( this, SLOT( resumeNetworkJobs() ) );
+  ConnectionManager::self()->registerDisconnectSlot( this, SLOT( stopNetworkJobs() ) );
   the_acctMgr       = new AccountManager();
   the_filterMgr     = new KMFilterMgr();
   the_popFilterMgr     = new KMFilterMgr(true);
@@ -1531,6 +1538,12 @@
 #else
   mBackgroundTasksTimer->start( 5 * 60000, true ); // 5 minutes, singleshot
 #endif
+
+  if ( ( ConnectionManager::self()->status() == NetworkStatus::Online || ConnectionManager::self()->status() == NetworkStatus::NoNetworks ) ) {
+    resumeNetworkJobs();
+  } else {
+    stopNetworkJobs();
+  }
 }
 
 void KMKernel::readConfig()
--- kmail/kmkernel.h
+++ kmail/kmkernel.h
@@ -202,18 +202,6 @@
   */
   virtual void resumeBackgroundJobs();
 
-  /**
-   * Stops all network related jobs and enter offline mode
-   * New network jobs cannot be started.
-  */
-  void stopNetworkJobs();
-
-  /**
-   * Resumes all network related jobs and enter online mode
-   * New network jobs can be started.
-  */
-  void resumeNetworkJobs();
-
   /** A static helper function that asks the user
    * if they want to go online.
    * @return true if the user wants to go online
@@ -409,6 +397,18 @@
 
   void slotConfigChanged();
 
+  /**
+   * Stops all network related jobs and enter offline mode
+   * New network jobs cannot be started.
+   */
+  void stopNetworkJobs();
+
+  /**
+   * Resumes all network related jobs and enter online mode
+   * New network jobs can be started.
+   */
+  void resumeNetworkJobs();
+
 protected slots:
   void slotDataReq(KIO::Job*,QByteArray&);
   void slotResult(KIO::Job*);
--- kmail/kmmainwin.cpp
+++ kmail/kmmainwin.cpp
@@ -1,4 +1,5 @@
 
+
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
@@ -22,7 +23,7 @@
 #include <kstringhandler.h>
 #include <kdebug.h>
 #include <ktip.h>
-
+#include <networkstatusindicator.h>
 #include "kmmainwin.moc"
 
 KMMainWin::KMMainWin(QWidget *)
@@ -73,7 +74,7 @@
     this, SLOT(slotConfigChanged()));
 
   connect(mKMMainWidget, SIGNAL(captionChangeRequest(const QString&)),
-	  SLOT(setCaption(const QString&)) );
+      SLOT(setCaption(const QString&)) );
 
   // Enable mail checks again (see destructor)
   kmkernel->enableMailCheck();
@@ -179,6 +180,11 @@
   statusBar()->setItemAlignment( 1, AlignLeft | AlignVCenter );
   statusBar()->addWidget( mKMMainWidget->vacationScriptIndicator(), 1 );
   mLittleProgress->show();
+
+  /* Indicator for desktop offline mode */
+  StatusBarNetworkStatusIndicator * indicator = new StatusBarNetworkStatusIndicator( this, "netstatusindicator" );
+  statusBar()->addWidget( indicator, 0, false );
+  indicator->init();
 }
 
 /** Read configuration options after widgets are created. */
@@ -219,4 +225,3 @@
   KTipDialog::showTip( this );
 }
 
-
--- kmail/kmmainwin.h
+++ kmail/kmmainwin.h
@@ -29,6 +29,7 @@
    class StatusbarProgressWidget;
    class ProgressDialog;
 }
+
 using KPIM::StatusbarProgressWidget;
 using KPIM::ProgressDialog;
 
--- kmail/popaccount.cpp
+++ kmail/popaccount.cpp
@@ -1016,7 +1016,9 @@
   }
 
   if (interactive && kmkernel) {
-    KMessageBox::error(kmkernel->mainWin(), KIO::buildErrorString(error, errorMsg));
+    if ( ! ( ( error == KIO::ERR_CONNECTION_BROKEN || error == KIO::ERR_SERVER_TIMEOUT ) &&
+            GlobalSettings::self()->networkState() != GlobalSettings::EnumNetworkState::Offline ) )
+      KMessageBox::error(kmkernel->mainWin(), KIO::buildErrorString(error, errorMsg));
   }
openSUSE Build Service is sponsored by