Skip to content

Commit

Permalink
Rebase on upstream after IDLE integration
Browse files Browse the repository at this point in the history
  • Loading branch information
dcaliste committed Mar 21, 2019
1 parent d8b8007 commit 61e4c75
Show file tree
Hide file tree
Showing 14 changed files with 158 additions and 1,153 deletions.
4 changes: 2 additions & 2 deletions rpm/0004-Accounts-qt-integration.patch
Expand Up @@ -3345,7 +3345,7 @@ index 679abeef..1c132995 100644

bool compressCapable(_protocol.capabilities().contains("COMPRESS=DEFLATE", Qt::CaseInsensitive));
@@ -1462,6 +1572,25 @@ void ImapClient::setAccount(const QMailAccountId &id)
qMailLog(Messaging) << "CanCreateFolders for " << account.id() << "changed to" << true;
qMailLog(Messaging) << "Disable HasPersistentConnection for account" << account.id();
}
}
+
Expand Down Expand Up @@ -3973,8 +3973,8 @@ index bf4a24ec..61a049b3 100644
+ _client->removeSsoIdentity(_accountId);
+#endif
disable();
destroyIdleSession();
delete _source;
}
diff --git a/src/plugins/messageservices/pop/pop.pro b/src/plugins/messageservices/pop/pop.pro
index 837f928f..eb96f74d 100644
--- a/src/plugins/messageservices/pop/pop.pro
Expand Down
188 changes: 46 additions & 142 deletions rpm/0006-Add-keepalive-timer-to-IMAP-IDLE-service.patch
@@ -1,20 +1,20 @@
From c6a7e74090171af6d67bb4fc97c745c6c50fc4d2 Mon Sep 17 00:00:00 2001
From 403bfc07c452c18690e5d8228f16fea3f0f84fbd Mon Sep 17 00:00:00 2001
From: Valerio Valerio <valerio.valerio@jollamobile.com>
Date: Wed, 10 Sep 2014 14:36:13 +0300
Subject: [PATCH 06/19] Add keepalive timer to IMAP IDLE service
Subject: [PATCH 06/17] Add keepalive timer to IMAP IDLE service

This commit introduce a dependency on nemo-keepalive via
DEFINES+=USE_KEEPALIVE
---
src/plugins/messageservices/imap/imap.pro | 4 ++
.../messageservices/imap/imapclient.cpp | 3 +
src/plugins/messageservices/imap/imapclient.h | 6 ++
.../messageservices/imap/imapservice.cpp | 64 +++++++++++++++++++
.../messageservices/imap/imapservice.h | 11 +++-
5 files changed, 87 insertions(+), 1 deletion(-)
src/plugins/messageservices/imap/imap.pro | 4 ++
src/plugins/messageservices/imap/imapclient.cpp | 3 ++
src/plugins/messageservices/imap/imapclient.h | 6 +++
src/plugins/messageservices/imap/imapservice.cpp | 49 ++++++++++++++++++++++++
src/plugins/messageservices/imap/imapservice.h | 9 ++++-
5 files changed, 70 insertions(+), 1 deletion(-)

diff --git a/src/plugins/messageservices/imap/imap.pro b/src/plugins/messageservices/imap/imap.pro
index 1c0ae6bb..1b5742b4 100644
index 1c0ae6b..1b5742b 100644
--- a/src/plugins/messageservices/imap/imap.pro
+++ b/src/plugins/messageservices/imap/imap.pro
@@ -5,6 +5,10 @@ load(qt_plugin)
Expand All @@ -28,181 +28,85 @@ index 1c0ae6bb..1b5742b4 100644
contains(DEFINES,QT_QMF_USE_ALIGNEDTIMER) {
QT += alignedtimer
}
diff --git a/src/plugins/messageservices/imap/imapclient.cpp b/src/plugins/messageservices/imap/imapclient.cpp
index 1c132995..24dfa0cf 100644
--- a/src/plugins/messageservices/imap/imapclient.cpp
+++ b/src/plugins/messageservices/imap/imapclient.cpp
@@ -2003,6 +2003,9 @@ void ImapClient::closeIdleConnections()
qMailLog(IMAP) << Q_FUNC_INFO << "Account was modified. Closing connections";

closeConnection();
+#ifdef USE_KEEPALIVE
+ emit stopPushEmail();
+#endif
// closing idle connections
foreach(const QMailFolderId &id, _monitored.keys()) {
IdleProtocol *protocol = _monitored.take(id);
diff --git a/src/plugins/messageservices/imap/imapclient.h b/src/plugins/messageservices/imap/imapclient.h
index 36428286..ebd7afb7 100644
--- a/src/plugins/messageservices/imap/imapclient.h
+++ b/src/plugins/messageservices/imap/imapclient.h
@@ -51,6 +51,9 @@
#include <ssosessionmanager.h>
#endif

+#ifdef USE_KEEPALIVE
+#include <keepalive/backgroundactivity.h>
+#endif

class ImapStrategy;
class ImapStrategyContext;
@@ -107,6 +110,9 @@ signals:
void errorOccurred(QMailServiceAction::Status::ErrorCode, const QString &);
void updateStatus(const QString &);
void restartPushEmail();
+#ifdef USE_KEEPALIVE
+ void stopPushEmail();
+#endif

void progressChanged(uint, uint);
void retrievalCompleted();
diff --git a/src/plugins/messageservices/imap/imapservice.cpp b/src/plugins/messageservices/imap/imapservice.cpp
index 61a049b3..65bfee9d 100644
index e926f1c..392aee1 100644
--- a/src/plugins/messageservices/imap/imapservice.cpp
+++ b/src/plugins/messageservices/imap/imapservice.cpp
@@ -1512,6 +1512,14 @@ ImapService::ImapService(const QMailAccountId &accountId)
_accountWasPushEnabled(false),
_initiatePushEmailTimer(new QTimer(this))
@@ -1517,6 +1517,12 @@ ImapService::ImapService(const QMailAccountId &accountId)
_networkSession(0),
_networkSessionTimer(new QTimer(this))
{
+#ifdef USE_KEEPALIVE
+ _lastSyncCounter = 0;
+ _idling = false;
+ _backgroundActivity = new BackgroundActivity(this);
+ _backgroundActivity->setWakeupFrequency(BackgroundActivity::ThirtySeconds);
+ connect(_backgroundActivity, SIGNAL(running()), this, SLOT(onUpdateLastSyncTime()));
+ connect(_backgroundActivity, SIGNAL(running()), this, SLOT(startStopBackgroundActivity()));
+#endif
+
QMailAccount account(accountId);
if (!(account.status() & QMailAccount::CanSearchOnServer)) {
account.setStatus(QMailAccount::CanSearchOnServer, true);
@@ -1542,6 +1550,9 @@ void ImapService::enable()
connect(_client, SIGNAL(errorOccurred(QMailServiceAction::Status::ErrorCode, QString)), this, SLOT(errorOccurred(QMailServiceAction::Status::ErrorCode, QString)));
connect(_client, SIGNAL(updateStatus(QString)), this, SLOT(updateStatus(QString)));
connect(_client, SIGNAL(restartPushEmail()), this, SLOT(restartPushEmail()));
+#ifdef USE_KEEPALIVE
+ connect(_client, SIGNAL(stopPushEmail()), this, SLOT(stopPushEmail()));
+#endif

QMailAccountConfiguration accountCfg(_accountId);
ImapConfiguration imapCfg(accountCfg);
@@ -1581,6 +1592,10 @@ void ImapService::disable()
_previousConnectionSettings = connectionSettings(imapCfg);
_restartPushEmailTimer->stop();
_initiatePushEmailTimer->stop();
@@ -1978,8 +2014,25 @@ void ImapService::setPersistentConnectionStatus(bool status)
}
}
_idling = status;
+#ifdef USE_KEEPALIVE
+ _idling = false;
+ _backgroundActivity->stop();
+ startStopBackgroundActivity();
+#endif
_source->setIntervalTimer(0);
_source->setPushIntervalTimer(0);
_source->retrievalTerminated();
@@ -1693,9 +1708,22 @@ void ImapService::initiatePushEmail()
<< QMailAccount(_accountId).name();
_restartPushEmailTimer->stop();
_initiatePushEmailTimer->stop();
+#ifdef USE_KEEPALIVE
+ _idling = false;
+ if (_backgroundActivity->isRunning()) {
+ _backgroundActivity->stop();
+ qMailLog(Messaging) << Q_FUNC_INFO << "Stopping keepalive";
+ }
+#endif
QMailFolderIdList ids(_client->configurationIdleFolderIds());
if (ids.count()) {
_establishingPushEmail = true;
+#ifdef USE_KEEPALIVE
+ qMailLog(Messaging) << Q_FUNC_INFO << "Starting keepalive";
+ _lastSyncCounter = 0;
+ _idling = true;
+ _backgroundActivity->wait();
+#endif
foreach(QMailFolderId id, ids) {
// Check for flag changes and new mail
_source->queueFlagsChangedCheck(id);
@@ -1743,6 +1771,42 @@ void ImapService::updateStatus(const QString &text)
updateStatus(QMailServiceAction::Status::ErrNoError, text, _accountId);
}

+#ifdef USE_KEEPALIVE
+void ImapService::onUpdateLastSyncTime()
+void ImapService::startStopBackgroundActivity()
+{
+ if (_idling && _client->idlesEstablished()) {
+ _lastSyncCounter++;
+ if (_lastSyncCounter == 2) {
+ QMailAccount account(_accountId);
+ account.setLastSynchronized(QMailTimeStamp::currentDateTime());
+ if (!QMailStore::instance()->updateAccount(&account)) {
+ qWarning() << "Unable to update account" << account.id() << "to set lastSynchronized";
+ }
+ _lastSyncCounter = 0;
+ }
+ }
+
+ // start timer again if still in idle mode
+ if (_idling) {
+ _backgroundActivity->wait();
+ qMailLog(Messaging) << Q_FUNC_INFO << "Starting keepalive";
+ _backgroundActivity->wait();
+ } else if (_backgroundActivity->isRunning()){
+ qMailLog(Messaging) << Q_FUNC_INFO << "Stopping keepalive";
+ _backgroundActivity->stop();
+ _lastSyncCounter = 0;
+ }
+}
+
+void ImapService::stopPushEmail()
+{
+ qMailLog(Messaging) << "Stopping push email for account" << _accountId
+ << QMailAccount(_accountId).name();
+ _idling = false;
+ _backgroundActivity->stop();
+ _restartPushEmailTimer->stop();
+ _initiatePushEmailTimer->stop();
+}
+#endif
+
class ImapConfigurator : public QMailMessageServiceConfigurator
{
public:
diff --git a/src/plugins/messageservices/imap/imapservice.h b/src/plugins/messageservices/imap/imapservice.h
index 7b688c52..1855eba5 100644
index c9d38fe..21797de 100644
--- a/src/plugins/messageservices/imap/imapservice.h
+++ b/src/plugins/messageservices/imap/imapservice.h
@@ -68,9 +68,13 @@ protected slots:
virtual void accountsUpdated(const QMailAccountIdList &ids);
void errorOccurred(int code, const QString &text);
void errorOccurred(QMailServiceAction::Status::ErrorCode code, const QString &text);
-
void updateStatus(const QString& text);
@@ -51,6 +51,10 @@
#include "imapclient.h"
#include <qmailmessageservice.h>
#include <QNetworkSession>
+
+#ifdef USE_KEEPALIVE
+#include <keepalive/backgroundactivity.h>
+#endif

QT_BEGIN_NAMESPACE

@@ -71,6 +71,10 @@ protected slots:
void openIdleSession();
void closeIdleSession();

+#ifdef USE_KEEPALIVE
+ void onUpdateLastSyncTime();
+ void stopPushEmail();
+ void startStopBackgroundActivity();
+#endif
+
private:
class Source;
friend class Source;
@@ -88,6 +92,11 @@ private:
enum { ThirtySeconds = 30 };
static QMap<QMailAccountId, int> _initiatePushDelay; // Limit battery consumption
QTimer *_initiatePushEmailTimer;
private slots:
void onOnlineStateChanged(bool isOnline);
void onSessionOpened();
@@ -110,6 +114,9 @@ private:
QNetworkConfigurationManager *_networkConfigManager; // Qt network configuration manager
QNetworkSession *_networkSession; // Qt network session
QTimer *_networkSessionTimer;
+#ifdef USE_KEEPALIVE
+ BackgroundActivity* _backgroundActivity;
+ int _lastSyncCounter;
+ bool _idling;
+#endif
};

class ImapServicePlugin : public QMailMessageServicePlugin
--
2.17.2
2.7.4

0 comments on commit 61e4c75

Please sign in to comment.