Buteo Synchronization Framework
synchronizer.h
1 /*
2  * This file is part of buteo-syncfw package
3  *
4  * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
5  * Copyright (C) 2014-2019 Jolla Ltd.
6  * Copyright (C) 2020 Open Mobile Platform LLC.
7  *
8  * Contact: Sateesh Kavuri <sateesh.kavuri@nokia.com>
9  *
10  * This library is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU Lesser General Public License
12  * version 2.1 as published by the Free Software Foundation.
13  *
14  * This library is distributed in the hope that it will be useful, but
15  * WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this library; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
22  * 02110-1301 USA
23  *
24  */
25 #ifndef SYNCHRONIZER_H
26 #define SYNCHRONIZER_H
27 
28 #include "SyncDBusInterface.h"
29 #include "SyncQueue.h"
30 #include "StorageBooker.h"
31 #include "SyncScheduler.h"
32 #include "SyncBackup.h"
33 #include "SyncOnChange.h"
34 #include "SyncOnChangeScheduler.h"
35 
36 #include "SyncCommonDefs.h"
37 #include "ProfileManager.h"
38 #include "PluginManager.h"
39 #include "PluginCbInterface.h"
40 #include "ClientPlugin.h"
41 
42 #include <QVector>
43 #include <QMutex>
44 #include <QCoreApplication>
45 #include <QMap>
46 #include <QString>
47 #include <QDBusInterface>
48 #include <QScopedPointer>
49 #include <QTimer>
50 
51 struct _GSettings;
52 
53 namespace Buteo {
54 
55 class PluginManager;
56 class ServerPluginRunner;
57 class NetworkManager;
58 class TransportTracker;
59 class ServerActivator;
60 class AccountsHelper;
61 class BatteryInfo;
62 
67 class Synchronizer : public SyncDBusInterface, // Derived from QObject
68  public PluginCbInterface
69 {
70  Q_OBJECT
71 public:
72 
74  Synchronizer(QCoreApplication *aApplication);
75 
77  virtual ~Synchronizer();
78 
81  bool initialize();
82 
84  void close();
85 
86 
87 // From PluginCbInterface
88 // ---------------------------------------------------------------------------
90  virtual bool requestStorage(const QString &aStorageName,
91  const SyncPluginBase *aCaller);
92 
94  virtual void releaseStorage(const QString &aStorageName,
95  const SyncPluginBase *aCaller);
96 
98  virtual StoragePlugin *createStorage(const QString &aPluginName);
99 
101  virtual void destroyStorage(StoragePlugin *aStorage);
102 
104  virtual bool isConnectivityAvailable(Sync::ConnectivityType aType);
105 
107  virtual Profile *getSyncProfileByRemoteAddress(const QString &aAddress);
108 
110  virtual QString getValue(const QString &aAddress, const QString &aKey);
111 
112 
113 // From SyncDBusInterface
114 // --------------------------------------------------------------------------
115 
116 public slots:
117 
119  virtual bool startSync(QString aProfileName);
120 
122  virtual void abortSync(QString aProfileName);
123 
125  virtual bool removeProfile(QString aProfileAsXml);
126 
128  virtual bool updateProfile(QString aProfileAsXml);
129 
131  virtual bool requestStorages(QStringList aStorageNames);
132 
134  virtual void releaseStorages(QStringList aStorageNames);
135 
137  virtual QStringList runningSyncs();
138 
140  virtual bool setSyncSchedule(QString aProfileId, QString aScheduleAsXml);
141 
143  virtual bool saveSyncResults(QString aProfileId, QString aSyncResults);
144 
146  virtual QString createSyncProfileForAccount(uint aAccountId);
147 
152  virtual QString getLastSyncResult(const QString &aProfileId);
153 
160  virtual QStringList allVisibleSyncProfiles();
161 
170  virtual QString syncProfile(const QString &aProfileId);
171  virtual QStringList syncProfilesByKey(const QString &aKey, const QString &aValue);
172  virtual QStringList syncProfilesByType(const QString &aType);
173 // --------------------------------------------------------------------------
174 
176  bool startScheduledSync(QString aProfileName);
177 
179  void backupStarts();
180 
182  void backupFinished();
183 
185  void restoreStarts();
186 
188  void restoreFinished();
189 
191  virtual bool getBackUpRestoreState();
192 
193  void start(unsigned int aAccountId);
194 
199  void stop(unsigned int aAccountId);
200 
206 
220  int status(unsigned int aAccountId, int &aFailedReason, qlonglong &aPrevSyncTime, qlonglong &aNextSyncTime);
221 
230  void isSyncedExternally(unsigned int aAccountId, const QString aClientProfileName);
231 
232 signals:
233 
235  void storageReleased();
236 
242  void syncDone(const QString &aProfileName);
243 
244 private slots:
245 
251  void onStorageReleased();
252 
253  void onTransferProgress(const QString &aProfileName,
254  Sync::TransferDatabase aDatabase, Sync::TransferType aType,
255  const QString &aMimeType, int aCommittedItems);
256 
257  void onSessionFinished(const QString &aProfileName,
258  Sync::SyncStatus aStatus, const QString &aMessage,
259  SyncResults::MinorCode aErrorCode);
260 
261  void onStorageAccquired(const QString &aProfileName, const QString &aMimeType);
262 
263  void onSyncProgressDetail(const QString &aProfileName, int aProgressDetail);
264 
265  void onServerDone();
266 
267  void onNewSession(const QString &aDestination);
268 
269  void slotProfileChanged(QString aProfileName, int aChangeType, QString aProfileAsXml);
270 
275  void startServer(const QString &aProfileName);
276 
281  void stopServer(const QString &aProfileName);
282 
283  void onNetworkStateChanged(bool aState, Sync::InternetConnectionType type);
284 
291  void enableSOCSlot(const QString &aProfileName);
292 
297  void reschedule(const QString &aProfileName);
298 
306  void slotSyncStatus(QString aProfileName, int aStatus,
307  QString aMessage, int aMoreDetails);
308 
313  void removeScheduledSync(const QString &aProfileName);
314 
320  void externalSyncStatus(const QString &aProfileName, bool aQuery);
321 
323  void profileChangeTriggerTimeout();
324 
325 private:
326 
327  bool startSync(const QString &aProfileName, bool aScheduled);
328 
334  bool startSyncNow(SyncSession *aSession);
335 
342  bool startNextSync();
343 
349  void cleanupSession(SyncSession *aSession, Sync::SyncStatus aStatus);
350 
355  void startServers(bool resume = false);
356 
361  void stopServers(bool suspend = false);
362 
366  void backupRestoreStarts();
367 
371  void backupRestoreFinished();
372 
376  void initializeScheduler();
377 
378  bool isBackupRestoreInProgress();
379 
385  bool cleanupProfile(const QString &profileId);
386 
387  bool clientProfileActive(const QString &clientProfileName);
388 
394  void removeExternalSyncStatus(const SyncProfile *aProfile);
395 
400  bool acceptScheduledSync(bool aConnected, Sync::InternetConnectionType aType, SyncProfile *profile) const;
401 
409  void externalSyncStatus(const SyncProfile *aProfile, bool aQuery = false);
410 
411  QMap<QString, SyncSession *> iActiveSessions;
412  QMap<QString, bool> iExternalSyncProfileStatus;
413  QList<QString> iProfilesToRemove;
415  QList<QString> iWaitingOnlineSyncs;
416  NetworkManager *iNetworkManager;
417  QMap<QString, int> iCountersStorage;
418  PluginManager iPluginManager;
419  ProfileManager iProfileManager;
420  SyncQueue iSyncQueue;
421  StorageBooker iStorageBooker;
422  SyncScheduler *iSyncScheduler;
423  SyncBackup *iSyncBackup;
424  TransportTracker *iTransportTracker;
425  ServerActivator *iServerActivator;
426  AccountsHelper *iAccounts;
427  bool iClosing;
428  SyncOnChange iSyncOnChange;
429  SyncOnChangeScheduler iSyncOnChangeScheduler;
430 
435  void saveProfileCounter(const SyncProfile *aProfile);
436 
441  void restoreProfileCounter(SyncProfile *aProfile);
442 
443  bool iSOCEnabled;
444  QString iUUID;
445  QString iRemoteName;
446 
447  /*
448  * Temporary, until we can clean up Buteo and properly implement the SyncOnChange
449  * queue to handle all of the required changes (account + profile + connectivity)
450  * in a sane manner (also taking into account BackupRestore status).
451  * However, that change will be far more invasive, so for now this is much simpler.
452  */
453  QList<QPair<QString, ProfileManager::ProfileChangeType> > iProfileChangeTriggerQueue;
454  QTimer iProfileChangeTriggerTimer;
455 
456 #ifdef SYNCFW_UNIT_TESTS
457  friend class SynchronizerTest;
458 #endif
459 
460  QDBusInterface *iSyncUIInterface;
461  _GSettings *iSettings;
462  BatteryInfo *iBatteryInfo;
463 };
464 
465 }
466 
467 #endif // SYNCHRONIZER_H
Helper Class towards Accounts::Manager and various SSO related operations.
Definition: AccountsHelper.h:44
Class for managing network sessions.
Definition: NetworkManager.h:43
Interface which client and server plugins can use to communicate with synchronization daemon.
Definition: PluginCbInterface.h:39
Manages plugins.
Definition: PluginManager.h:56
ProfileManager is responsible for storing and retrieving the profiles.
Definition: ProfileManager.h:46
This class represents a single profile, a collection of settings or data releated to some entity.
Definition: Profile.h:53
Keeps track of which server plug-ins should be enabled.
Definition: ServerActivator.h:48
A helper class for managing storage reservations.
Definition: StorageBooker.h:37
Base class for storage plugins.
Definition: StoragePlugin.h:39
Handles Sync requirements towards Backup.
Definition: SyncBackup.h:38
Defines a D-Bus interface for the sync daemon.
Definition: msyncd/SyncDBusInterface.h:42
Definition: SyncOnChangeScheduler.h:15
this class initiates a sync if there are changes in storage(s) it's asked to monitor
Definition: SyncOnChange.h:19
Base class for client and server plugins.
Definition: SyncPluginBase.h:46
A top level synchronization profile.
Definition: SyncProfile.h:49
Class for queuing sync sessions.
Definition: SyncQueue.h:38
MinorCode
enum value
Definition: SyncResults.h:77
SyncScheduler Object to be used to set Schedule via the framework.
Definition: SyncScheduler.h:55
Class representing a single sync session.
Definition: SyncSession.h:44
The main entry point to the synchronization framework.
Definition: synchronizer.h:69
virtual void abortSync(QString aProfileName)
Definition: synchronizer.cpp:773
virtual void releaseStorages(QStringList aStorageNames)
Definition: synchronizer.cpp:939
virtual Profile * getSyncProfileByRemoteAddress(const QString &aAddress)
Definition: synchronizer.cpp:1842
virtual QString createSyncProfileForAccount(uint aAccountId)
Definition: synchronizer.cpp:363
virtual ~Synchronizer()
Destructor.
Definition: synchronizer.cpp:97
virtual QStringList allVisibleSyncProfiles()
Gets all visible sync profiles.
Definition: synchronizer.cpp:1730
void syncDone(const QString &aProfileName)
emit this signal when the sync session is completed, this is useful when the session status is not im...
Definition: moc_synchronizer.cpp:428
void restoreFinished()
Called when backup is restored.
Definition: synchronizer.cpp:1592
bool initialize()
registers the dbus service and creates handlers for various tasks of the synchronizer
Definition: synchronizer.cpp:106
bool startScheduledSync(QString aProfileName)
Called starts a schedule sync.
Definition: synchronizer.cpp:282
void stop(unsigned int aAccountId)
Stops sync for all profiles matching the given account ID.
Definition: synchronizer.cpp:1616
void backupStarts()
Called when backup starts.
Definition: synchronizer.cpp:1571
void restoreStarts()
Called when starting to restore a backup.
Definition: synchronizer.cpp:1585
void close()
stops the daemon and unregisters the dbus object
Definition: synchronizer.cpp:232
virtual void destroyStorage(StoragePlugin *aStorage)
Definition: synchronizer.cpp:1066
virtual bool isConnectivityAvailable(Sync::ConnectivityType aType)
Definition: synchronizer.cpp:1073
int status(unsigned int aAccountId, int &aFailedReason, qlonglong &aPrevSyncTime, qlonglong &aNextSyncTime)
Returns the status of the sync for the given account Id.
Definition: synchronizer.cpp:1627
void isSyncedExternally(unsigned int aAccountId, const QString aClientProfileName)
Queries the sync externally status of a given account, 'syncedExternallyStatus' signal is emitted wit...
Definition: synchronizer.cpp:2003
void storageReleased()
emitted by releaseStorages call
Definition: moc_synchronizer.cpp:422
virtual QString getLastSyncResult(const QString &aProfileId)
To get lastSyncResult.
Definition: synchronizer.cpp:1706
virtual QString getValue(const QString &aAddress, const QString &aKey)
Definition: synchronizer.cpp:1862
virtual StoragePlugin * createStorage(const QString &aPluginName)
Definition: synchronizer.cpp:1030
virtual bool startSync(QString aProfileName)
Definition: synchronizer.cpp:274
Synchronizer(QCoreApplication *aApplication)
The contructor.
Definition: synchronizer.cpp:76
virtual QString syncProfile(const QString &aProfileId)
Gets a sync profile.
Definition: synchronizer.cpp:1751
virtual bool removeProfile(QString aProfileAsXml)
Definition: synchronizer.cpp:864
void backupFinished()
Called when backup is completed.
Definition: synchronizer.cpp:1578
QList< unsigned int > syncingAccounts()
Returns the list of account IDs for which sync is ongoing.
Definition: synchronizer.cpp:1677
virtual bool updateProfile(QString aProfileAsXml)
Definition: synchronizer.cpp:882
virtual bool requestStorages(QStringList aStorageNames)
Definition: synchronizer.cpp:932
virtual bool requestStorage(const QString &aStorageName, const SyncPluginBase *aCaller)
Definition: synchronizer.cpp:1012
virtual QStringList runningSyncs()
Definition: synchronizer.cpp:947
virtual void releaseStorage(const QString &aStorageName, const SyncPluginBase *aCaller)
Definition: synchronizer.cpp:1021
virtual bool setSyncSchedule(QString aProfileId, QString aScheduleAsXml)
Definition: synchronizer.cpp:339
virtual bool saveSyncResults(QString aProfileId, QString aSyncResults)
Definition: synchronizer.cpp:349
virtual bool getBackUpRestoreState()
Called to get the current backup/restore state.
Definition: synchronizer.cpp:1599
Class for tracking transport states.
Definition: TransportTracker.h:50
Definition: SyncBackupAdaptor.h:40
Definition: SyncBackupAdaptor.h:41