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