1 /*
2    SPDX-FileCopyrightText: 2012-2021 Laurent Montel <montel@kde.org>
3 
4    SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #include "exportalarmjobinterface.h"
8 #include "exportresourcearchivejob.h"
9 
10 #include <KLocalizedString>
11 
12 #include <KConfigGroup>
13 #include <QTemporaryFile>
14 #include <QTimer>
15 
16 #include <QFile>
17 #include <QFileInfo>
18 #include <QStandardPaths>
19 
ExportAlarmJobInterface(QObject * parent,Utils::StoredTypes typeSelected,ArchiveStorage * archiveStorage,int numberOfStep)20 ExportAlarmJobInterface::ExportAlarmJobInterface(QObject *parent, Utils::StoredTypes typeSelected, ArchiveStorage *archiveStorage, int numberOfStep)
21     : AbstractImportExportJob(parent, archiveStorage, typeSelected, numberOfStep)
22 {
23 }
24 
~ExportAlarmJobInterface()25 ExportAlarmJobInterface::~ExportAlarmJobInterface()
26 {
27 }
28 
start()29 void ExportAlarmJobInterface::start()
30 {
31     Q_EMIT title(i18n("Start export KAlarm settings..."));
32     createProgressDialog(i18n("Export KAlarm settings"));
33     if (mTypeSelected & Utils::Resources) {
34         QTimer::singleShot(0, this, &ExportAlarmJobInterface::slotCheckBackupResource);
35     } else if (mTypeSelected & Utils::Config) {
36         QTimer::singleShot(0, this, &ExportAlarmJobInterface::slotCheckBackupConfig);
37     } else {
38         Q_EMIT jobFinished();
39     }
40 }
41 
slotAlarmJobTerminated()42 void ExportAlarmJobInterface::slotAlarmJobTerminated()
43 {
44     if (wasCanceled()) {
45         Q_EMIT jobFinished();
46         return;
47     }
48     mIndexIdentifier++;
49     QTimer::singleShot(0, this, &ExportAlarmJobInterface::slotWriteNextArchiveResource);
50 }
51 
slotWriteNextArchiveResource()52 void ExportAlarmJobInterface::slotWriteNextArchiveResource()
53 {
54     if (mIndexIdentifier < mAkonadiInstanceInfo.count()) {
55         const Utils::AkonadiInstanceInfo agent = mAkonadiInstanceInfo.at(mIndexIdentifier);
56         const QString identifier = agent.identifier;
57         if (identifier.contains(QLatin1String("akonadi_kalarm_dir_resource_"))) {
58             const QString archivePath = Utils::alarmPath() + identifier + QLatin1Char('/');
59 
60             const QString url = resourcePath(identifier);
61             if (!mAgentPaths.contains(url)) {
62                 if (!url.isEmpty()) {
63                     mAgentPaths << url;
64                     exportResourceToArchive(archivePath, url, identifier);
65                 } else {
66                     qCDebug(PIMDATAEXPORTERCORE_LOG) << "Url is empty for " << identifier;
67                     QTimer::singleShot(0, this, &ExportAlarmJobInterface::slotAlarmJobTerminated);
68                 }
69             } else {
70                 QTimer::singleShot(0, this, &ExportAlarmJobInterface::slotAlarmJobTerminated);
71             }
72         } else if (identifier.contains(QLatin1String("akonadi_kalarm_resource_"))) {
73             backupAlarmResourceFile(identifier, Utils::alarmPath());
74             QTimer::singleShot(0, this, &ExportAlarmJobInterface::slotAlarmJobTerminated);
75         } else {
76             QTimer::singleShot(0, this, &ExportAlarmJobInterface::slotAlarmJobTerminated);
77         }
78     } else {
79         Q_EMIT info(i18n("Resources backup done."));
80         QTimer::singleShot(0, this, &ExportAlarmJobInterface::slotCheckBackupConfig);
81     }
82 }
83 
slotCheckBackupResource()84 void ExportAlarmJobInterface::slotCheckBackupResource()
85 {
86     mAkonadiInstanceInfo = listOfResource();
87     setProgressDialogLabel(i18n("Backing up resources..."));
88     increaseProgressDialog();
89     QTimer::singleShot(0, this, &ExportAlarmJobInterface::slotWriteNextArchiveResource);
90 }
91 
slotCheckBackupConfig()92 void ExportAlarmJobInterface::slotCheckBackupConfig()
93 {
94     if (mTypeSelected & Utils::Config) {
95         backupConfig();
96         increaseProgressDialog();
97         if (wasCanceled()) {
98             Q_EMIT jobFinished();
99             return;
100         }
101     }
102     Q_EMIT jobFinished();
103 }
104 
backupConfig()105 void ExportAlarmJobInterface::backupConfig()
106 {
107     setProgressDialogLabel(i18n("Backing up config..."));
108 
109     const QString kalarmStr(QStringLiteral("kalarmrc"));
110     const QString kalarmrc = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + QLatin1Char('/') + kalarmStr;
111     if (QFileInfo::exists(kalarmrc)) {
112         KSharedConfigPtr kalarm = KSharedConfig::openConfig(kalarmrc);
113 
114         QTemporaryFile tmp;
115         tmp.open();
116 
117         KConfig *kalarmConfig = kalarm->copyTo(tmp.fileName());
118 
119         const QString collectionsStr(QStringLiteral("Collections"));
120         if (kalarmConfig->hasGroup(collectionsStr)) {
121             KConfigGroup group = kalarmConfig->group(collectionsStr);
122             const QString selectionKey(QStringLiteral("FavoriteCollectionIds"));
123             convertCollectionIdsToRealPath(group, selectionKey);
124         }
125 
126         kalarmConfig->sync();
127         backupFile(tmp.fileName(), Utils::configsPath(), kalarmStr);
128         delete kalarmConfig;
129     }
130 
131     backupUiRcFile(QStringLiteral("kalarmui.rc"), QStringLiteral("kalarm"));
132 
133     Q_EMIT info(i18n("Config backup done."));
134 }
135