Skip to content

Commit

Permalink
Merge branch 'idle' into 'master'
Browse files Browse the repository at this point in the history
Rebase on upstream after IDLE integration

See merge request mer-core/messagingframework!30
  • Loading branch information
pvuorela committed Mar 21, 2019
2 parents d8b8007 + 61e4c75 commit 41f1851
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 41f1851

Please sign in to comment.