summaryrefslogtreecommitdiff
path: root/buteo-plugins/buteo-common/socialdbuteoplugin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'buteo-plugins/buteo-common/socialdbuteoplugin.cpp')
-rw-r--r--buteo-plugins/buteo-common/socialdbuteoplugin.cpp355
1 files changed, 0 insertions, 355 deletions
diff --git a/buteo-plugins/buteo-common/socialdbuteoplugin.cpp b/buteo-plugins/buteo-common/socialdbuteoplugin.cpp
deleted file mode 100644
index 0eb5f91..0000000
--- a/buteo-plugins/buteo-common/socialdbuteoplugin.cpp
+++ /dev/null
@@ -1,355 +0,0 @@
-/****************************************************************************
- **
- ** Copyright (C) 2013-2026 Jolla Ltd.
- ** Contact: Chris Adams <chris.adams@jolla.com>
- **
- ** This program/library is free software; you can redistribute it and/or
- ** modify it under the terms of the GNU Lesser General Public License
- ** version 2.1 as published by the Free Software Foundation.
- **
- ** This program/library is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- ** Lesser General Public License for more details.
- **
- ** You should have received a copy of the GNU Lesser General Public
- ** License along with this program/library; if not, write to the Free
- ** Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- ** 02110-1301 USA
- **
- ****************************************************************************/
-
-#include "socialdbuteoplugin.h"
-#include "socialnetworksyncadaptor.h"
-#include "trace.h"
-
-#include <QCoreApplication>
-#include <QTranslator>
-
-#include <QDBusMessage>
-#include <QDBusConnection>
-#include <QDBusPendingCall>
-
-#include "buteosyncfw_p.h"
-
-#include <Accounts/Manager>
-#include <Accounts/Account>
-#include <Accounts/Service>
-
-namespace {
- const QString SyncProfileTemplatesKey = QStringLiteral("sync_profile_templates");
-
- QString SyncProfileIdKey(const QString &templateProfileName)
- {
- return QStringLiteral("%1/%2").arg(templateProfileName).arg(Buteo::KEY_PROFILE_ID);
- }
-
- QString createProfile(Buteo::ProfileManager *profileManager,
- const QString &templateProfileName,
- Accounts::Account *account,
- const Accounts::Service &srv,
- bool enableProfile,
- const QVariantMap &properties)
- {
- if (!account || !srv.isValid()) {
- qWarning() << "Invalid account or service";
- return QString();
- }
- if (templateProfileName.isEmpty()) {
- qWarning() << "Invalid templateProfileName";
- return QString();
- }
-
- Accounts::Service prevService = account->selectedService();
- account->selectService(srv);
-
- Buteo::SyncProfile *templateProfile = profileManager->syncProfile(templateProfileName);
- if (!templateProfile) {
- account->selectService(prevService);
- qWarning() << "Unable to load template profile:" << templateProfileName;
- return QString();
- }
-
- Buteo::SyncProfile *profile = templateProfile->clone();
- if (!profile) {
- delete templateProfile;
- account->selectService(prevService);
- qWarning() << "unable to clone template profile:" << templateProfileName;
- return QString();
- }
-
- QString accountIdStr = QString::number(account->id());
- profile->setName(templateProfileName + "-" + accountIdStr);
- profile->setKey(Buteo::KEY_DISPLAY_NAME, templateProfileName + "-" + account->displayName().toHtmlEscaped());
- profile->setKey(Buteo::KEY_ACCOUNT_ID, accountIdStr);
- profile->setBoolKey(Buteo::KEY_USE_ACCOUNTS, true);
- profile->setEnabled(enableProfile);
-
- // enable the profile schedule
- Buteo::SyncSchedule schedule = profile->syncSchedule();
- schedule.setScheduleEnabled(true);
- profile->setSyncSchedule(schedule);
-
- // set custom properties; note this may override any properties already set
- Q_FOREACH (const QString &key, properties.keys()) {
- profile->setKey(key, properties[key].toString());
- }
-
- QString profileId = profileManager->updateProfile(*profile);
- if (profileId.isEmpty()) {
- qWarning() << "Unable to save sync profile" << templateProfile->name();
- } else {
- account->setValue(SyncProfileIdKey(templateProfile->name()), profile->name());
- }
-
- account->selectService(prevService);
- delete profile;
- delete templateProfile;
-
- return profileId;
- }
-}
-
-SocialdButeoPlugin::SocialdButeoPlugin(const QString& pluginName,
- const Buteo::SyncProfile& profile,
- Buteo::PluginCbInterface *callbackInterface,
- const QString &socialServiceName,
- const QString &dataTypeName)
- : ClientPlugin(pluginName, profile, callbackInterface)
- , m_socialNetworkSyncAdaptor(nullptr)
- , m_socialServiceName(socialServiceName)
- , m_dataTypeName(dataTypeName)
- , m_profileAccountId(0)
-{
-}
-
-SocialdButeoPlugin::~SocialdButeoPlugin()
-{
-}
-
-bool SocialdButeoPlugin::init()
-{
- m_profileAccountId = profile().key(Buteo::KEY_ACCOUNT_ID).toInt();
- m_socialNetworkSyncAdaptor = createSocialNetworkSyncAdaptor();
- if (m_socialNetworkSyncAdaptor) {
- connect(m_socialNetworkSyncAdaptor, &SocialNetworkSyncAdaptor::statusChanged,
- this, &SocialdButeoPlugin::syncStatusChanged);
- return true;
- }
-
- return false;
-}
-
-bool SocialdButeoPlugin::uninit()
-{
- delete m_socialNetworkSyncAdaptor;
- m_socialNetworkSyncAdaptor = nullptr;
- return true;
-}
-
-bool SocialdButeoPlugin::startSync()
-{
- if (!m_socialNetworkSyncAdaptor || !m_socialNetworkSyncAdaptor->enabled()) {
- qCDebug(lcSocialPlugin) << "no enabled" << m_socialServiceName << "sync adaptor for" << m_dataTypeName;
- return false;
- }
-
- // if the profile being triggered is the template profile, then we
- // need to ensure that the appropriate per-account profiles exist.
- if (m_profileAccountId == 0) {
- QList<Buteo::SyncProfile*> perAccountProfiles = ensurePerAccountSyncProfilesExist();
- m_socialNetworkSyncAdaptor->setAccountSyncProfile(nullptr);
-
- // we need to trigger sync with each profile separately,
- // or (due to scheduling/etc) another plugin instance might
- // be created to sync that profile at the same time, and
- // we don't handle concurrency.
- foreach (Buteo::SyncProfile *perAccountProfile, perAccountProfiles) {
- QDBusMessage message = QDBusMessage::createMethodCall(
- "com.meego.msyncd", "/synchronizer", "com.meego.msyncd", "startSync");
- message.setArguments(QVariantList() << perAccountProfile->name());
- QDBusConnection::sessionBus().asyncCall(message);
- }
- qDeleteAll(perAccountProfiles);
-
- // This template profile only dispatches account-specific sync profiles.
- // Those child sync runs report their own individual results.
- updateResults(Buteo::SyncResults(QDateTime::currentDateTime(),
- Buteo::SyncResults::SYNC_RESULT_SUCCESS,
- Buteo::SyncResults::NO_ERROR));
- emit success(getProfileName(), QString("%1 update dispatched").arg(getProfileName()));
- return true;
- }
-
- Buteo::SyncProfile *accountSyncProfile = profile().clone();
- if (accountSyncProfile
- && m_dataTypeName == SocialNetworkSyncAdaptor::dataTypeName(SocialNetworkSyncAdaptor::Notifications)) {
- accountSyncProfile->setEnabled(true);
- Buteo::SyncSchedule schedule = accountSyncProfile->syncSchedule();
- schedule.setScheduleEnabled(true);
- accountSyncProfile->setSyncSchedule(schedule);
- m_profileManager.updateProfile(*accountSyncProfile);
- }
- m_socialNetworkSyncAdaptor->setAccountSyncProfile(accountSyncProfile);
-
- // Now perform sync for the account-specific profile.
- if (m_socialNetworkSyncAdaptor->status() == SocialNetworkSyncAdaptor::Inactive) {
- qCDebug(lcSocialPlugin) << "performing sync of" << m_dataTypeName << "from" << m_socialServiceName
- << "for account" << m_profileAccountId;
- m_socialNetworkSyncAdaptor->sync(m_dataTypeName, m_profileAccountId);
- return true;
- } else {
- qCDebug(lcSocialPlugin) << m_socialServiceName << "sync adaptor for" << m_dataTypeName
- << "is still busy with last sync of account" << m_profileAccountId;
- }
- return false;
-}
-
-void SocialdButeoPlugin::abortSync(Sync::SyncStatus status)
-{
- // note: it seems buteo automatically calls abortSync on network connectivity loss...
- qCInfo(lcSocialPlugin) << "aborting sync with status:" << status;
- m_socialNetworkSyncAdaptor->abortSync(status);
-}
-
-bool SocialdButeoPlugin::cleanUp()
-{
- m_profileAccountId = profile().key(Buteo::KEY_ACCOUNT_ID).toInt();
- if (!m_socialNetworkSyncAdaptor) {
- // might have already been initialized by the OOP framework via init().
- m_socialNetworkSyncAdaptor = createSocialNetworkSyncAdaptor();
- }
-
- if (m_socialNetworkSyncAdaptor && m_profileAccountId > 0) {
- m_socialNetworkSyncAdaptor->purgeDataForOldAccount(m_profileAccountId,
- SocialNetworkSyncAdaptor::CleanUpPurge);
- }
-
- return true;
-}
-
-Buteo::SyncResults SocialdButeoPlugin::getSyncResults() const
-{
- return m_syncResults;
-}
-
-void SocialdButeoPlugin::connectivityStateChanged(Sync::ConnectivityType type, bool state)
-{
- // See TransportTracker.cpp:149 for example
- // Sync::CONNECTIVITY_INTERNET, true|false
- qCInfo(lcSocialPlugin) << "notified of connectivity change:" << type << state;
- if (type == Sync::CONNECTIVITY_INTERNET && state == false) {
- // we lost connectivity during sync.
- abortSync(Sync::SYNC_CONNECTION_ERROR);
- }
-}
-
-void SocialdButeoPlugin::syncStatusChanged()
-{
- if (m_socialNetworkSyncAdaptor) {
- SocialNetworkSyncAdaptor::Status syncStatus = m_socialNetworkSyncAdaptor->status();
- // Busy change comes when sync starts -> let's ignore that.
- if (syncStatus == SocialNetworkSyncAdaptor::Inactive) {
- updateResults(Buteo::SyncResults(QDateTime::currentDateTime(),
- Buteo::SyncResults::SYNC_RESULT_SUCCESS,
- Buteo::SyncResults::NO_ERROR));
- emit success(getProfileName(), QString("%1 update succeeded").arg(getProfileName()));
- } else if (syncStatus != SocialNetworkSyncAdaptor::Busy) {
- updateResults(Buteo::SyncResults(QDateTime::currentDateTime(),
- Buteo::SyncResults::SYNC_RESULT_FAILED,
- Buteo::SyncResults::ABORTED));
- emit error(getProfileName(), QString("%1 update failed").arg(getProfileName()),
- Buteo::SyncResults::ABORTED);
- }
- } else {
- updateResults(Buteo::SyncResults(QDateTime::currentDateTime(),
- Buteo::SyncResults::SYNC_RESULT_FAILED,
- Buteo::SyncResults::ABORTED));
- emit error(getProfileName(), QString("%1 update failed").arg(getProfileName()), Buteo::SyncResults::ABORTED);
- }
-}
-
-void SocialdButeoPlugin::updateResults(const Buteo::SyncResults &results)
-{
- m_syncResults = results;
- m_syncResults.setScheduled(true);
-}
-
-// This function is called when the non-per-account profile is triggered.
-// The implementation does:
-// - get all profiles from the ProfileManager
-// - get all accounts from the AccountManager
-// - build a mapping of profile -> account for the current data type. (should be one-to-one for the datatype).
-// - any account which doesn't have a profile, print an error.
-// - check the enabled status of the account -> ensure that the enabled status is reflected in the profile.
-// It then returns a list of the appropriate (per account for this data-type) sync profiles.
-// The caller takes ownership of the list.
-QList<Buteo::SyncProfile*> SocialdButeoPlugin::ensurePerAccountSyncProfilesExist()
-{
- Accounts::Manager am;
- Accounts::AccountIdList accountIds = am.accountList();
- QList<Buteo::SyncProfile*> syncProfiles = m_profileManager.allSyncProfiles();
- QMap<Accounts::Account*, Buteo::SyncProfile*> perAccountProfiles;
-
- Accounts::Service dataTypeSyncService = am.service(m_socialNetworkSyncAdaptor->syncServiceName());
- if (!dataTypeSyncService.isValid()) {
- qWarning() << Q_FUNC_INFO << "Invalid data type sync service name specified:"
- << m_socialNetworkSyncAdaptor->syncServiceName();
- return QList<Buteo::SyncProfile*>();
- }
-
- for (int i = 0; i < accountIds.size(); ++i) {
- Accounts::Account *currAccount = Accounts::Account::fromId(&am, accountIds.at(i), this);
- if (!currAccount || currAccount->id() == 0
- || m_socialNetworkSyncAdaptor->syncServiceName().split('-').first() != currAccount->providerName()) {
- // we only generate per-account sync profiles for accounts which
- // are provided by the provider which provides our sync service.
- continue;
- }
-
- // for the current account, find the associated sync profile.
- bool foundProfile = false;
- for (int j = 0; j < syncProfiles.size(); ++j) {
- if (syncProfiles[j]->key(Buteo::KEY_ACCOUNT_ID).toInt() == QString::number(currAccount->id()).toInt()
- && syncProfiles[j]->clientProfile() != NULL
- && syncProfiles[j]->clientProfile()->name() == profile().clientProfile()->name()) {
- // we have found the sync profile for this datatype for this account.
- foundProfile = true;
- perAccountProfiles.insert(currAccount, syncProfiles.takeAt(j));
- break;
- }
- }
-
- if (!foundProfile) {
- // it should have been generated for the account when the account was added.
- qCInfo(lcSocialPlugin) << "no per-account" << profile().name()
- << "sync profile exists for account:" << currAccount->id();
-
- // create the per-account profile... we shouldn't need to do this...
- QString profileName = createProfile(&m_profileManager, profile().name(), currAccount, dataTypeSyncService, true, QVariantMap());
- Buteo::SyncProfile *newProfile = m_profileManager.syncProfile(profileName);
- if (!newProfile) {
- qCWarning(lcSocialPlugin) << "unable to create per-account" << profile().name()
- << "sync profile for account:" << currAccount->id();
- } else {
- // enable the sync schedule for the profile.
- Buteo::SyncSchedule schedule = newProfile->syncSchedule();
- schedule.setScheduleEnabled(true);
- newProfile->setSyncSchedule(schedule);
- m_profileManager.updateProfile(*newProfile);
- // and return the profile in the map.
- perAccountProfiles.insert(currAccount, newProfile);
- }
- }
- }
-
- // Every account now has the appropriate sync profile.
- qDeleteAll(syncProfiles); // these are for the wrong data type, ignore them.
- QList<Buteo::SyncProfile *> retn;
- foreach (Accounts::Account *acc, perAccountProfiles.keys()) {
- retn.append(perAccountProfiles[acc]);
- acc->deleteLater();
- }
-
- return retn;
-}