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 "utils.h"
8 
9 #include <MailCommon/MailUtil>
10 #include <PimCommon/PimUtil>
11 
12 #include <QSettings>
13 
14 #include <KLocalizedString>
15 #include <KZip>
16 #include <QTemporaryFile>
17 
18 #include <Akonadi/AgentManager>
19 #include <QStandardPaths>
20 
storeAddressbook()21 QString Utils::storeAddressbook()
22 {
23     return QStringLiteral("backupaddressbook/");
24 }
25 
storeAlarm()26 QString Utils::storeAlarm()
27 {
28     return QStringLiteral("backupalarm/");
29 }
30 
storeCalendar()31 QString Utils::storeCalendar()
32 {
33     return QStringLiteral("backupcalendar/");
34 }
35 
backupnote()36 QString Utils::backupnote()
37 {
38     return QStringLiteral("backupnote/");
39 }
40 
storeMails()41 QString Utils::storeMails()
42 {
43     return QStringLiteral("backupmail/");
44 }
45 
exportDataTypeFileName()46 QString Utils::exportDataTypeFileName()
47 {
48     return QStringLiteral("exportdatatype.xml");
49 }
50 
currentArchiveVersion()51 int Utils::currentArchiveVersion()
52 {
53     // Increase it when we add major feature!
54     return 2;
55 }
56 
transportsPath()57 QString Utils::transportsPath()
58 {
59     return QStringLiteral("transports/");
60 }
61 
resourcesPath()62 QString Utils::resourcesPath()
63 {
64     return QStringLiteral("resources/");
65 }
66 
identitiesPath()67 QString Utils::identitiesPath()
68 {
69     return QStringLiteral("identities/");
70 }
71 
mailsPath()72 QString Utils::mailsPath()
73 {
74     return QStringLiteral("mails/");
75 }
76 
configsPath()77 QString Utils::configsPath()
78 {
79     return QStringLiteral("configs/");
80 }
81 
akonadiPath()82 QString Utils::akonadiPath()
83 {
84     return QStringLiteral("akonadi/");
85 }
86 
dataPath()87 QString Utils::dataPath()
88 {
89     return QStringLiteral("data/");
90 }
91 
calendarPath()92 QString Utils::calendarPath()
93 {
94     return QStringLiteral("calendar/");
95 }
96 
addressbookPath()97 QString Utils::addressbookPath()
98 {
99     return QStringLiteral("addressbook/");
100 }
101 
alarmPath()102 QString Utils::alarmPath()
103 {
104     return QStringLiteral("alarm/");
105 }
106 
notePath()107 QString Utils::notePath()
108 {
109     return QStringLiteral("note/");
110 }
111 
prefixAkonadiConfigFile()112 QString Utils::prefixAkonadiConfigFile()
113 {
114     return QStringLiteral("agent_config_");
115 }
116 
infoPath()117 QString Utils::infoPath()
118 {
119     return QStringLiteral("information/");
120 }
121 
akonadiAgentName(const QString & configPath)122 QString Utils::akonadiAgentName(const QString &configPath)
123 {
124     QSettings settings(configPath, QSettings::IniFormat);
125     const QString name = settings.value(QStringLiteral("Agent/Name")).toString();
126     return name;
127 }
128 
openZip(const QString & filename,QString & errorMsg)129 KZip *Utils::openZip(const QString &filename, QString &errorMsg)
130 {
131     KZip *zip = new KZip(filename);
132     const bool result = zip->open(QIODevice::ReadOnly);
133     if (!result) {
134         errorMsg = i18n("Archive cannot be opened in read mode.");
135         qCWarning(PIMDATAEXPORTERCORE_LOG) << "Impossible to open archive: " << filename << "zip error : " << zip->errorString();
136         delete zip;
137         return nullptr;
138     }
139     return zip;
140 }
141 
storeDataExportInfo(KZip * archive,const QString & exportInfoFileName)142 void Utils::storeDataExportInfo(KZip *archive, const QString &exportInfoFileName)
143 {
144     if (!exportInfoFileName.isEmpty()) {
145         const bool fileAdded = archive->addLocalFile(exportInfoFileName, Utils::infoPath() + Utils::exportDataTypeFileName());
146         if (!fileAdded) {
147             qCDebug(PIMDATAEXPORTERCORE_LOG) << "storeDataExportInfo can't add to archive" << Utils::infoPath() + Utils::exportDataTypeFileName();
148         }
149     }
150 }
151 
addVersion(KZip * archive)152 void Utils::addVersion(KZip *archive)
153 {
154     QTemporaryFile tmp;
155     tmp.open();
156     const bool fileAdded = archive->addLocalFile(tmp.fileName(), Utils::infoPath() + QStringLiteral("VERSION_%1").arg(currentArchiveVersion()));
157     if (!fileAdded) {
158         // TODO add i18n ?
159         qCDebug(PIMDATAEXPORTERCORE_LOG) << "version file can not add to archive";
160     }
161 }
162 
archiveVersion(KZip * archive)163 int Utils::archiveVersion(KZip *archive)
164 {
165     const KArchiveEntry *informationFile = archive->directory()->entry(Utils::infoPath() + QStringLiteral("VERSION_2"));
166     if (informationFile && informationFile->isFile()) {
167         return 2;
168     }
169     informationFile = archive->directory()->entry(Utils::infoPath() + QStringLiteral("VERSION_1"));
170     if (informationFile && informationFile->isFile()) {
171         return 1;
172     }
173     // TODO add more version when new version
174     return 0;
175 }
176 
appTypeToI18n(AppsType type)177 QString Utils::appTypeToI18n(AppsType type)
178 {
179     switch (type) {
180     case KMail:
181         return i18n("KMail");
182     case KAddressBook:
183         return i18n("KAddressBook");
184     case KAlarm:
185         return i18n("KAlarm");
186     case KOrganizer:
187         return i18n("KOrganizer");
188     case KNotes:
189         return i18n("KNotes");
190     case Akregator:
191         return i18n("Akregator");
192     case Unknown:
193         break;
194     }
195     qCDebug(PIMDATAEXPORTERCORE_LOG) << " type unknown " << type;
196     return QString();
197 }
198 
storedTypeToI18n(StoredType type)199 QString Utils::storedTypeToI18n(StoredType type)
200 {
201     switch (type) {
202     case None:
203         return QString();
204     case Identity:
205         return i18n("Identity");
206     case Mails:
207         return i18n("Mails");
208     case MailTransport:
209         return i18n("Mail Transport");
210     case Resources:
211         return i18n("Resources");
212     case Config:
213         return i18n("Config");
214     case Data:
215         return i18n("Data");
216     }
217     qCDebug(PIMDATAEXPORTERCORE_LOG) << " type unknown " << type;
218     return QString();
219 }
220 
listOfResource()221 QVector<Utils::AkonadiInstanceInfo> Utils::listOfResource()
222 {
223     QVector<Utils::AkonadiInstanceInfo> instanceInfoList;
224     Akonadi::AgentManager *manager = Akonadi::AgentManager::self();
225     const Akonadi::AgentInstance::List list = manager->instances();
226     instanceInfoList.reserve(list.count());
227     for (const Akonadi::AgentInstance &agent : list) {
228         Utils::AkonadiInstanceInfo info;
229         info.identifier = agent.identifier();
230         info.mimeTypes = agent.type().mimeTypes();
231         info.capabilities = agent.type().capabilities();
232         instanceInfoList.append(info);
233     }
234     return instanceInfoList;
235 }
236 
resourceNoteArchiveName()237 QString Utils::resourceNoteArchiveName()
238 {
239     return QStringLiteral("notes.zip");
240 }
241 
resourceAddressbookArchiveName()242 QString Utils::resourceAddressbookArchiveName()
243 {
244     return QStringLiteral("addressbook.zip");
245 }
246 
resourceAlarmArchiveName()247 QString Utils::resourceAlarmArchiveName()
248 {
249     return QStringLiteral("alarm.zip");
250 }
251 
resourceCalendarArchiveName()252 QString Utils::resourceCalendarArchiveName()
253 {
254     return QStringLiteral("calendar.zip");
255 }
256 
resourceMailArchiveName()257 QString Utils::resourceMailArchiveName()
258 {
259     return QStringLiteral("mail.zip");
260 }
261