2
Copyright (c) 2012 Montel Laurent <montel@kde.org>
4
This program is free software; you can redistribute it and/or modify it
5
under the terms of the GNU General Public License, version 2, as
6
published by the Free Software Foundation.
8
This program is distributed in the hope that it will be useful, but
9
WITHOUT ANY WARRANTY; without even the implied warranty of
10
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
General Public License for more details.
13
You should have received a copy of the GNU General Public License along
14
with this program; if not, write to the Free Software Foundation, Inc.,
15
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
#include "importmailjob.h"
19
#include "akonadidatabase.h"
21
#include "mailcommon/filter/filtermanager.h"
22
#include "mailcommon/filter/filterimporterexporter.h"
23
#include "mailcommon/mailutil.h"
24
#include "mailcommon/createresource.h"
26
#include "messageviewer/kcursorsaver.h"
29
#include <mailtransport/transportmanager.h>
31
#include <kpimidentities/identitymanager.h>
32
#include <kpimidentities/identity.h>
34
#include <KStandardDirs>
38
#include <KTemporaryFile>
39
#include <KSharedConfig>
40
#include <KConfigGroup>
41
#include <KMessageBox>
43
#include <akonadi/agenttype.h>
44
#include <akonadi/agentmanager.h>
45
#include <akonadi/agentinstancecreatejob.h>
48
#include <QDBusInterface>
49
#include <QMetaMethod>
52
using namespace Akonadi;
54
static const QString storeMails = QLatin1String("backupmail/");
56
ImportMailJob::ImportMailJob(QWidget *parent, BackupMailUtil::BackupTypes typeSelected,const QString& filename, int numberOfStep)
57
:AbstractImportExportJob(parent,filename,typeSelected,numberOfStep), mArchiveDirectory(0)
59
mTempDir = new KTempDir();
60
mTempDirName = mTempDir->name();
61
mCreateResource = new MailCommon::CreateResource();
62
connect(mCreateResource,SIGNAL(createResourceInfo(QString)),SIGNAL(info(QString)));
63
connect(mCreateResource,SIGNAL(createResourceError(QString)),SIGNAL(error(QString)));
66
ImportMailJob::~ImportMailJob()
69
delete mCreateResource;
72
void ImportMailJob::start()
77
void ImportMailJob::startRestore()
79
if(!openArchive(false /*readonly*/))
81
mArchiveDirectory = mArchive->directory();
82
searchAllFiles(mArchiveDirectory,QString());
83
if(!mFileList.isEmpty()|| !mHashMailArchive.isEmpty()) {
84
if(mTypeSelected & BackupMailUtil::MailTransport)
86
if(mTypeSelected & BackupMailUtil::Resources)
88
if(mTypeSelected & BackupMailUtil::Mails)
90
if(mTypeSelected & BackupMailUtil::Identity)
92
if(mTypeSelected & BackupMailUtil::Config)
94
if(mTypeSelected & BackupMailUtil::AkonadiDb)
96
if(mTypeSelected & BackupMailUtil::Nepomuk)
102
void ImportMailJob::searchAllFiles(const KArchiveDirectory*dir,const QString&prefix)
104
Q_FOREACH(const QString& entryName, dir->entries()) {
105
const KArchiveEntry *entry = dir->entry(entryName);
106
if (entry && entry->isDirectory()) {
107
const QString newPrefix = (prefix.isEmpty() ? prefix : prefix + QLatin1Char('/')) + entryName;
108
if(entryName == QLatin1String("mails")) {
109
storeMailArchiveResource(static_cast<const KArchiveDirectory*>(entry),entryName);
111
searchAllFiles(static_cast<const KArchiveDirectory*>(entry), newPrefix);
114
QString fileName = prefix.isEmpty() ? entry->name() : prefix + QLatin1Char('/') + entry->name();
120
void ImportMailJob::storeMailArchiveResource(const KArchiveDirectory*dir, const QString& prefix)
122
Q_FOREACH(const QString& entryName, dir->entries()) {
123
const KArchiveEntry *entry = dir->entry(entryName);
124
if (entry && entry->isDirectory()) {
125
const KArchiveDirectory*resourceDir = static_cast<const KArchiveDirectory*>(entry);
126
const QStringList lst = resourceDir->entries();
127
if(lst.count() == 2) {
128
const QString archPath(prefix + QLatin1Char('/') + entryName + QLatin1Char('/'));
129
const QString name(lst.at(0));
130
if(name.endsWith(QLatin1String("rc"))&&
131
(name.contains(QLatin1String("akonadi_mbox_resource_")) ||
132
name.contains(QLatin1String("akonadi_mixedmaildir_resource_")) ||
133
name.contains(QLatin1String("akonadi_maildir_resource_")))) {
134
mHashMailArchive.insert(archPath + name,archPath +lst.at(1));
136
mHashMailArchive.insert(archPath +lst.at(1),archPath + name);
139
kDebug()<<" lst.at(0)"<<lst.at(0);
140
kDebug()<<" Problem in archive. number of file "<<lst.count();
146
void ImportMailJob::restoreTransports()
148
const QString path = BackupMailUtil::transportsPath()+QLatin1String("mailtransports");
149
if(!mFileList.contains(path)) {
150
Q_EMIT error(i18n("mailtransports file could not be found in the archive."));
153
Q_EMIT info(i18n("Restore transports..."));
154
MessageViewer::KCursorSaver busy( MessageViewer::KBusyPtr::busy() );
155
const KArchiveEntry* transport = mArchiveDirectory->entry(path);
156
if(transport && transport->isFile()) {
157
const KArchiveFile* fileTransport = static_cast<const KArchiveFile*>(transport);
159
fileTransport->copyTo(mTempDirName);
160
KSharedConfig::Ptr transportConfig = KSharedConfig::openConfig(mTempDirName + QLatin1Char('/') +QLatin1String("mailtransports"));
162
int defaultTransport = -1;
163
if(transportConfig->hasGroup(QLatin1String("General"))) {
164
KConfigGroup group = transportConfig->group(QLatin1String("General"));
165
defaultTransport = group.readEntry(QLatin1String("default-transport"),-1);
168
const QStringList transportList = transportConfig->groupList().filter( QRegExp( "Transport \\d+" ) );
169
Q_FOREACH(const QString&transport, transportList) {
170
KConfigGroup group = transportConfig->group(transport);
171
const int transportId = group.readEntry(QLatin1String("id"), -1);
172
MailTransport::Transport* mt = MailTransport::TransportManager::self()->createTransport();
173
mt->setName(group.readEntry(QLatin1String("name")));
174
const QString hostStr(QLatin1String("host"));
175
if(group.hasKey(hostStr)) {
176
mt->setHost(group.readEntry(hostStr));
178
const QString portStr(QLatin1String("port"));
179
if(group.hasKey(portStr)) {
180
mt->setPort(group.readEntry(portStr,-1));
182
const QString userNameStr(QLatin1String("userName"));
183
if(group.hasKey(userNameStr)) {
184
mt->setUserName(group.readEntry(userNameStr));
186
const QString precommandStr(QLatin1String("precommand"));
187
if(group.hasKey(precommandStr)) {
188
mt->setPrecommand(group.readEntry(precommandStr));
190
const QString requiresAuthenticationStr(QLatin1String("requiresAuthentication"));
191
if(group.hasKey(requiresAuthenticationStr)) {
192
mt->setRequiresAuthentication(group.readEntry(requiresAuthenticationStr,false));
194
const QString specifyHostnameStr(QLatin1String("specifyHostname"));
195
if(group.hasKey(specifyHostnameStr)) {
196
mt->setSpecifyHostname(group.readEntry(specifyHostnameStr,false));
198
const QString localHostnameStr(QLatin1String("localHostname"));
199
if(group.hasKey(localHostnameStr)) {
200
mt->setLocalHostname(group.readEntry(localHostnameStr));
202
const QString specifySenderOverwriteAddressStr(QLatin1String("specifySenderOverwriteAddress"));
203
if(group.hasKey(specifySenderOverwriteAddressStr)) {
204
mt->setSpecifySenderOverwriteAddress(group.readEntry(specifySenderOverwriteAddressStr,false));
206
const QString storePasswordStr(QLatin1String("storePassword"));
207
if(group.hasKey(storePasswordStr)) {
208
mt->setStorePassword(group.readEntry(storePasswordStr,false));
210
const QString senderOverwriteAddressStr(QLatin1String("senderOverwriteAddress"));
211
if(group.hasKey(senderOverwriteAddressStr)) {
212
mt->setSenderOverwriteAddress(group.readEntry(senderOverwriteAddressStr));
214
const QString encryptionStr(QLatin1String("encryption"));
215
if(group.hasKey(encryptionStr)) {
216
mt->setEncryption(group.readEntry(encryptionStr,1)); //TODO verify
218
const QString authenticationTypeStr(QLatin1String("authenticationType"));
219
if(group.hasKey(authenticationTypeStr)) {
220
mt->setAuthenticationType(group.readEntry(authenticationTypeStr,1));//TODO verify
223
mt->forceUniqueName();
225
MailTransport::TransportManager::self()->addTransport( mt );
226
if ( transportId == defaultTransport )
227
MailTransport::TransportManager::self()->setDefaultTransport( mt->id() );
228
mHashTransport.insert(transportId, mt->id());
230
Q_EMIT info(i18n("Transports restored."));
232
Q_EMIT error(i18n("Failed to restore transports file."));
236
void ImportMailJob::restoreResources()
238
MessageViewer::KCursorSaver busy( MessageViewer::KBusyPtr::busy() );
239
Q_FOREACH(const QString& filename, mFileList) {
240
if(filename.startsWith(BackupMailUtil::resourcesPath())) {
241
const KArchiveEntry* fileEntry = mArchiveDirectory->entry(filename);
242
if(fileEntry && fileEntry->isFile()) {
243
const KArchiveFile* file = static_cast<const KArchiveFile*>(fileEntry);
246
file->copyTo(tmp.fileName());
247
KSharedConfig::Ptr resourceConfig = KSharedConfig::openConfig(tmp.fileName());
248
const QString filename(file->name());
249
QMap<QString, QVariant> settings;
250
if(filename.contains(QLatin1String("pop3"))) {
251
KConfigGroup general = resourceConfig->group(QLatin1String("General"));
252
if(general.hasKey(QLatin1String("login"))) {
253
settings.insert(QLatin1String("Login"),general.readEntry("login"));
255
if(general.hasKey(QLatin1String("host"))) {
256
settings.insert(QLatin1String("Host"),general.readEntry("host"));
258
if(general.hasKey(QLatin1String("port"))) {
259
settings.insert(QLatin1String("Port"),general.readEntry("port",110));
261
if(general.hasKey(QLatin1String("authenticationMethod"))) {
262
settings.insert(QLatin1String("AuthenticationMethod"),general.readEntry("authenticationMethod",7));
264
if(general.hasKey(QLatin1String("useSSL"))) {
265
settings.insert(QLatin1String("UseSSL"),general.readEntry("useSSL",false));
267
if(general.hasKey(QLatin1String("useTLS"))) {
268
settings.insert(QLatin1String("UseTLS"),general.readEntry("useTLS",false));
270
if(general.hasKey(QLatin1String("pipelining"))) {
271
settings.insert(QLatin1String("Pipelining"),general.readEntry("pipelining",false));
273
if(general.hasKey(QLatin1String("leaveOnServer"))) {
274
settings.insert(QLatin1String("LeaveOnServer"),general.readEntry("leaveOnServer",false));
276
if(general.hasKey(QLatin1String("leaveOnServerDays"))) {
277
settings.insert(QLatin1String("LeaveOnServerDays"),general.readEntry("leaveOnServerDays",-1));
279
if(general.hasKey(QLatin1String("leaveOnServerCount"))) {
280
settings.insert(QLatin1String("LeaveOnServerCount"),general.readEntry("leaveOnServerCount",-1));
282
if(general.hasKey(QLatin1String("leaveOnServerSize"))) {
283
settings.insert(QLatin1String("LeaveOnServerSize"),general.readEntry("leaveOnServerSize",-1));
285
if(general.hasKey(QLatin1String("filterOnServer"))) {
286
settings.insert(QLatin1String("FilterOnServer"),general.readEntry("filterOnServer",false));
288
if(general.hasKey(QLatin1String("filterCheckSize"))) {
289
settings.insert(QLatin1String("FilterCheckSize"),general.readEntry("filterCheckSize"));
291
if(general.hasKey(QLatin1String("targetCollection"))) {
292
const Akonadi::Collection::Id collection = convertPathToId(general.readEntry("targetCollection"));
293
if(collection != -1) {
294
settings.insert(QLatin1String("TargetCollection"),collection);
297
if(general.hasKey(QLatin1String("precommand"))) {
298
settings.insert(QLatin1String("Precommand"),general.readEntry("precommand"));
300
if(general.hasKey(QLatin1String("intervalCheckEnabled"))) {
301
settings.insert(QLatin1String("IntervalCheckEnabled"),general.readEntry("intervalCheckEnabled",false));
303
if(general.hasKey(QLatin1String("intervalCheckInterval"))) {
304
settings.insert(QLatin1String("IntervalCheckInterval"),general.readEntry("intervalCheckInterval",5));
307
KConfigGroup leaveOnserver = resourceConfig->group(QLatin1String("LeaveOnServer"));
309
if(leaveOnserver.hasKey(QLatin1String("seenUidList"))) {
310
settings.insert(QLatin1String("SeenUidList"),leaveOnserver.readEntry("seenUidList",QStringList()));
312
if(leaveOnserver.hasKey(QLatin1String("seenUidTimeList"))) {
314
//settings.insert(QLatin1String("SeenUidTimeList"),QVariant::fromValue<QList<int> >(leaveOnserver.readEntry("seenUidTimeList",QList<int>())));
316
if(leaveOnserver.hasKey(QLatin1String("downloadLater"))) {
317
settings.insert(QLatin1String("DownloadLater"),leaveOnserver.readEntry("downloadLater",QStringList()));
319
const QString newResource = mCreateResource->createResource( QString::fromLatin1("akonadi_imap_resource"), filename, settings );
320
if(!newResource.isEmpty())
321
mHashResources.insert(filename,newResource);
322
} else if(filename.contains(QLatin1String("imap"))) {
323
KConfigGroup network = resourceConfig->group(QLatin1String("network"));
324
if(network.hasKey(QLatin1String("Authentication"))) {
325
settings.insert(QLatin1String("Authentication"),network.readEntry("Authentication",1));
327
if(network.hasKey(QLatin1String("ImapPort"))) {
328
settings.insert(QLatin1String("ImapPort"),network.readEntry("ImapPort",993));
330
if(network.hasKey(QLatin1String("ImapServer"))) {
331
settings.insert(QLatin1String("ImapServer"),network.readEntry("ImapServer"));
333
if(network.hasKey(QLatin1String("Safety"))) {
334
settings.insert(QLatin1String("Safety"),network.readEntry("Safety","SSL"));
336
if(network.hasKey(QLatin1String("SubscriptionEnabled"))) {
337
settings.insert(QLatin1String("SubscriptionEnabled"),network.readEntry("SubscriptionEnabled",false));
339
if(network.hasKey(QLatin1String("UserName"))) {
340
settings.insert(QLatin1String("UserName"),network.readEntry("UserName"));
343
if(network.hasKey(QLatin1String("SessionTimeout"))) {
344
settings.insert(QLatin1String("SessionTimeout"),network.readEntry("SessionTimeout",30));
347
KConfigGroup cache = resourceConfig->group(QLatin1String("cache"));
349
if(cache.hasKey(QLatin1String("AccountIdentity"))) {
350
const int identity = cache.readEntry("AccountIdentity",-1);
352
if(mHashIdentity.contains(identity)) {
353
settings.insert(QLatin1String("AccountIdentity"),mHashIdentity.value(identity));
355
settings.insert(QLatin1String("AccountIdentity"),identity);
359
if(cache.hasKey(QLatin1String("IntervalCheckEnabled"))) {
360
settings.insert(QLatin1String("IntervalCheckEnabled"),cache.readEntry("IntervalCheckEnabled",true));
362
if(cache.hasKey(QLatin1String("RetrieveMetadataOnFolderListing"))) {
363
settings.insert(QLatin1String("RetrieveMetadataOnFolderListing"),cache.readEntry("RetrieveMetadataOnFolderListing",true));
365
if(cache.hasKey(QLatin1String("AutomaticExpungeEnabled"))) {
366
settings.insert(QLatin1String("AutomaticExpungeEnabled"),cache.readEntry("AutomaticExpungeEnabled",true));
368
if(cache.hasKey(QLatin1String(""))) {
369
settings.insert(QLatin1String(""),cache.readEntry(""));
371
if(cache.hasKey(QLatin1String("DisconnectedModeEnabled"))) {
372
settings.insert(QLatin1String("DisconnectedModeEnabled"),cache.readEntry("DisconnectedModeEnabled",false));
374
if(cache.hasKey(QLatin1String("IntervalCheckTime"))) {
375
settings.insert(QLatin1String("IntervalCheckTime"),cache.readEntry("IntervalCheckTime",-1));
377
if(cache.hasKey(QLatin1String("UseDefaultIdentity"))) {
378
settings.insert(QLatin1String("UseDefaultIdentity"),cache.readEntry("UseDefaultIdentity",true));
380
if(cache.hasKey(QLatin1String("TrashCollection"))) {
381
const Akonadi::Collection::Id collection = convertPathToId(cache.readEntry("TrashCollection"));
382
if(collection != -1) {
383
settings.insert(QLatin1String("TrashCollection"),collection);
385
kDebug()<<" Use default trash folder";
390
KConfigGroup siever = resourceConfig->group(QLatin1String("siever"));
391
if(siever.hasKey(QLatin1String("SieveSupport"))) {
392
settings.insert(QLatin1String("SieveSupport"),siever.readEntry("SieveSupport",false));
394
if(siever.hasKey(QLatin1String("SieveReuseConfig"))) {
395
settings.insert(QLatin1String("SieveReuseConfig"),siever.readEntry("SieveReuseConfig",true));
397
if(siever.hasKey(QLatin1String("SievePort"))) {
398
settings.insert(QLatin1String("SievePort"),siever.readEntry("SievePort",4190));
400
if(siever.hasKey(QLatin1String("SieveAlternateUrl"))) {
401
settings.insert(QLatin1String("SieveAlternateUrl"),siever.readEntry("SieveAlternateUrl"));
403
if(siever.hasKey(QLatin1String("SieveVacationFilename"))) {
404
settings.insert(QLatin1String("SieveVacationFilename"),siever.readEntry("SieveVacationFilename"));
408
const QString newResource = mCreateResource->createResource( QString::fromLatin1("akonadi_pop3_resource"), filename, settings );
409
if(!newResource.isEmpty())
410
mHashResources.insert(filename,newResource);
412
kDebug()<<" problem with resource";
419
void ImportMailJob::restoreMails()
421
MessageViewer::KCursorSaver busy( MessageViewer::KBusyPtr::busy() );
422
QDir dir(mTempDirName);
423
dir.mkdir(BackupMailUtil::mailsPath());
424
const QString copyToDirName(mTempDirName + QLatin1Char('/') + BackupMailUtil::mailsPath());
425
QHashIterator<QString, QString> res(mHashMailArchive);
426
while (res.hasNext()) {
428
const QString resourceFile = res.key();
429
const KArchiveEntry* fileResouceEntry = mArchiveDirectory->entry(resourceFile);
430
if(fileResouceEntry && fileResouceEntry->isFile()) {
431
const KArchiveFile* file = static_cast<const KArchiveFile*>(fileResouceEntry);
432
file->copyTo(copyToDirName);
433
const QString resourceName(file->name());
434
KSharedConfig::Ptr resourceConfig = KSharedConfig::openConfig(copyToDirName + QLatin1Char('/') + resourceName);
435
const KUrl url = BackupMailUtil::resourcePath(resourceConfig);
436
const QString filename(file->name());
439
if(!url.path().contains(QDir::homePath())) {
440
qDebug()<<" url "<<url.path();
441
newUrl.setPath(QDir::homePath() + QLatin1Char('/') + storeMails + url.fileName());
443
if(QFile(newUrl.path()).exists()) {
444
QString newFileName = newUrl.path();
445
for(int i = 0;; ++i) {
446
newFileName = newUrl.path() + QString::fromLatin1("_%1").arg(i);
447
if(!QFile(newFileName).exists()) {
451
newUrl=KUrl(newFileName);
453
QMap<QString, QVariant> settings;
454
if(resourceName.contains(QLatin1String("akonadi_mbox_resource_"))) {
455
const QString dataFile = res.value();
456
const KArchiveEntry* dataResouceEntry = mArchiveDirectory->entry(dataFile);
457
if(dataResouceEntry->isFile()) {
458
const KArchiveFile* file = static_cast<const KArchiveFile*>(dataResouceEntry);
459
file->copyTo(newUrl.path());
461
settings.insert(QLatin1String("Path"),newUrl.path());
464
KConfigGroup general = resourceConfig->group(QLatin1String("General"));
465
if(general.hasKey(QLatin1String("DisplayName"))) {
466
settings.insert(QLatin1String("DisplayName"),general.readEntry(QLatin1String("DisplayName")));
468
if(general.hasKey(QLatin1String("ReadOnly"))) {
469
settings.insert(QLatin1String("ReadOnly"),general.readEntry(QLatin1String("ReadOnly"),false));
471
if(general.hasKey(QLatin1String("MonitorFile"))) {
472
settings.insert(QLatin1String("MonitorFile"),general.readEntry(QLatin1String("MonitorFile"),false));
474
if(resourceConfig->hasGroup(QLatin1String("Locking"))) {
475
KConfigGroup locking = resourceConfig->group(QLatin1String("Locking"));
476
if(locking.hasKey(QLatin1String("Lockfile"))) {
477
settings.insert(QLatin1String("Lockfile"),locking.readEntry(QLatin1String("Lockfile")));
480
if(locking.hasKey(QLatin1String("LockfileMethod"))) {
481
settings.insert(QLatin1String("LockfileMethod"),locking.readEntry(QLatin1String("LockfileMethod"),4));
484
if(resourceConfig->hasGroup(QLatin1String("Compacting"))) {
485
KConfigGroup compacting = resourceConfig->group(QLatin1String("Compacting"));
486
if(compacting.hasKey(QLatin1String("CompactFrequency"))) {
487
settings.insert(QLatin1String("CompactFrequency"),compacting.readEntry(QLatin1String("CompactFrequency"),1));
489
if(compacting.hasKey(QLatin1String("MessageCount"))) {
490
settings.insert(QLatin1String("MessageCount"),compacting.readEntry(QLatin1String("MessageCount"),50));
493
const QString newResource = mCreateResource->createResource( QString::fromLatin1("akonadi_mbox_resource"), filename, settings );
494
if(!newResource.isEmpty())
495
mHashResources.insert(filename,newResource);
496
} else if(resourceName.contains(QLatin1String("akonadi_maildir_resource_")) ||
497
resourceName.contains(QLatin1String("akonadi_mixedmaildir_resource_"))) {
498
settings.insert(QLatin1String("Path"),newUrl.path());
499
KConfigGroup general = resourceConfig->group(QLatin1String("General"));
500
if(general.hasKey(QLatin1String("TopLevelIsContainer"))) {
501
settings.insert(QLatin1String("TopLevelIsContainer"),general.readEntry(QLatin1String("TopLevelIsContainer"),false));
503
if(general.hasKey(QLatin1String("ReadOnly"))) {
504
settings.insert(QLatin1String("ReadOnly"),general.readEntry(QLatin1String("ReadOnly"),false));
506
if(general.hasKey(QLatin1String("MonitorFilesystem"))) {
507
settings.insert(QLatin1String("MonitorFilesystem"),general.readEntry(QLatin1String("MonitorFilesystem"),true));
510
const QString newResource = mCreateResource->createResource( resourceName.contains(QLatin1String("akonadi_mixedmaildir_resource_")) ?
511
QString::fromLatin1("akonadi_mixedmaildir_resource")
512
: QString::fromLatin1("akonadi_maildir_resource")
513
, filename, settings );
514
if(!newResource.isEmpty())
515
mHashResources.insert(filename,newResource);
517
const QString mailFile = res.value();
520
kDebug()<<" resource name not supported "<<resourceName;
522
//qDebug()<<"url "<<url;
527
void ImportMailJob::copyToFile(const KArchiveFile * archivefile, const QString& dest, const QString&filename, const QString&prefix)
529
QDir dir(mTempDirName);
532
const QString copyToDirName(mTempDirName + QLatin1Char('/') + prefix);
533
archivefile->copyTo(copyToDirName);
535
file.setFileName(copyToDirName + QLatin1Char('/') + filename);
537
if(!file.copy(dest)) {
538
KMessageBox::error(mParent,i18n("File \"%1\" can not be copied to \"%2\".",filename,dest),i18n("Copy file"));
542
void ImportMailJob::restoreConfig()
544
const QString filtersPath(BackupMailUtil::configsPath() + QLatin1String("filters"));
545
if(!mFileList.contains(filtersPath)) {
546
Q_EMIT error(i18n("filters file could not be found in the archive."));
549
MessageViewer::KCursorSaver busy( MessageViewer::KBusyPtr::busy() );
550
const KArchiveEntry* filter = mArchiveDirectory->entry(filtersPath);
551
if(filter && filter->isFile()) {
552
const KArchiveFile* fileFilter = static_cast<const KArchiveFile*>(filter);
554
fileFilter->copyTo(mTempDirName);
555
const QString filterFileName(mTempDirName + QLatin1Char('/') +QLatin1String("filters"));
556
KSharedConfig::Ptr filtersConfig = KSharedConfig::openConfig(filterFileName);
557
const QStringList filterList = filtersConfig->groupList().filter( QRegExp( "Filter #\\d+" ) );
558
Q_FOREACH(const QString&filterStr, filterList) {
559
KConfigGroup group = filtersConfig->group(filterStr);
560
const QString accountStr("accounts-set");
561
if(group.hasKey(accountStr)) {
562
const QString accounts = group.readEntry(accountStr);
563
if(!accounts.isEmpty()) {
564
const QStringList lstAccounts = accounts.split(QLatin1Char(','));
565
QStringList newLstAccounts;
566
Q_FOREACH(const QString&acc, lstAccounts) {
567
if(mHashResources.contains(acc)) {
568
newLstAccounts.append(mHashResources.value(acc));
570
newLstAccounts.append(acc);
573
group.writeEntry(accountStr,newLstAccounts);
576
const int numActions = group.readEntry( "actions", 0 );
579
for ( int i=0 ; i < numActions ; ++i ) {
580
actName.sprintf("action-name-%d", i);
581
argsName.sprintf("action-args-%d", i);
582
const QString actValue = group.readEntry(actName);
583
if(actValue==QLatin1String("set identity")) {
584
const int argsValue = group.readEntry(argsName,-1);
586
if(mHashIdentity.contains(argsValue)) {
587
group.writeEntry(argsName,mHashIdentity.value(argsValue));
590
} else if(actValue==QLatin1String("set transport")) {
591
const int argsValue = group.readEntry(argsName,-1);
593
if(mHashTransport.contains(argsValue)) {
594
group.writeEntry(argsName,mHashTransport.value(argsValue));
600
filtersConfig->sync();
602
bool canceled = false;
603
MailCommon::FilterImporterExporter exportFilters;
604
QList<MailCommon::MailFilter*> lstFilter = exportFilters.importFilters(canceled, MailCommon::FilterImporterExporter::KMailFilter, filterFileName);
606
MailCommon::FilterManager::instance()->appendFilters(lstFilter);
609
const QString kmailsnippetrcStr("kmailsnippetrc");
610
const KArchiveEntry* kmailsnippetentry = mArchiveDirectory->entry(BackupMailUtil::configsPath() + kmailsnippetrcStr);
611
if(kmailsnippetentry && kmailsnippetentry->isFile()) {
612
const KArchiveFile* kmailsnippet = static_cast<const KArchiveFile*>(kmailsnippetentry);
613
const QString kmailsnippetrc = KStandardDirs::locateLocal( "config", kmailsnippetrcStr);
614
if(QFile(kmailsnippetrc).exists()) {
615
//TODO 4.10 allow to merge config.
616
if(KMessageBox::warningYesNo(mParent,i18n("\"%1\" already exists. Do you want to overwrite it ?",kmailsnippetrcStr),i18n("Restore"))== KMessageBox::Yes) {
617
copyToFile(kmailsnippet, kmailsnippetrc,kmailsnippetrcStr,BackupMailUtil::configsPath());
620
copyToFile(kmailsnippet, kmailsnippetrc,kmailsnippetrcStr,BackupMailUtil::configsPath());
624
const QString labldaprcStr("kabldaprc");
625
const KArchiveEntry* kabldapentry = mArchiveDirectory->entry(BackupMailUtil::configsPath() + labldaprcStr);
626
if(kabldapentry && kabldapentry->isFile()) {
627
const KArchiveFile* kabldap= static_cast<const KArchiveFile*>(kabldapentry);
628
const QString kabldaprc = KStandardDirs::locateLocal( "config", labldaprcStr);
629
if(QFile(kabldaprc).exists()) {
630
//TODO 4.10 allow to merge config.
631
if(KMessageBox::warningYesNo(mParent,i18n("\"%1\" already exists. Do you want to overwrite it ?",labldaprcStr),i18n("Restore"))== KMessageBox::Yes) {
632
copyToFile(kabldap, kabldaprc, labldaprcStr,BackupMailUtil::configsPath());
635
copyToFile(kabldap, kabldaprc, labldaprcStr,BackupMailUtil::configsPath());
638
const QString archiveconfigurationrcStr("akonadi_archivemail_agentrc");
639
const KArchiveEntry* archiveconfigurationentry = mArchiveDirectory->entry(BackupMailUtil::configsPath() + archiveconfigurationrcStr);
640
if( archiveconfigurationentry && archiveconfigurationentry->isFile()) {
641
const KArchiveFile* archiveconfiguration = static_cast<const KArchiveFile*>(archiveconfigurationentry);
642
const QString archiveconfigurationrc = KStandardDirs::locateLocal( "config", archiveconfigurationrcStr);
643
if(QFile(archiveconfigurationrc).exists()) {
644
//TODO 4.10 allow to merge config.
645
if(KMessageBox::warningYesNo(mParent,i18n("\"%1\" already exists. Do you want to overwrite it ?",archiveconfigurationrcStr),i18n("Restore"))== KMessageBox::Yes) {
646
importArchiveConfig(archiveconfiguration, archiveconfigurationrc, archiveconfigurationrcStr, BackupMailUtil::configsPath());
649
importArchiveConfig(archiveconfiguration, archiveconfigurationrc, archiveconfigurationrcStr, BackupMailUtil::configsPath());
655
const QString templatesconfigurationrcStr("templatesconfigurationrc");
656
const KArchiveEntry* templatesconfigurationentry = mArchiveDirectory->entry(BackupMailUtil::configsPath() + templatesconfigurationrcStr);
657
if( templatesconfigurationentry && templatesconfigurationentry->isFile()) {
658
const KArchiveFile* templatesconfiguration = static_cast<const KArchiveFile*>(templatesconfigurationentry);
659
const QString templatesconfigurationrc = KStandardDirs::locateLocal( "config", templatesconfigurationrcStr);
660
if(QFile(templatesconfigurationrc).exists()) {
661
//TODO 4.10 allow to merge config.
662
if(KMessageBox::warningYesNo(mParent,i18n("\"%1\" already exists. Do you want to overwrite it ?",templatesconfigurationrcStr),i18n("Restore"))== KMessageBox::Yes) {
663
importTemplatesConfig(templatesconfiguration, templatesconfigurationrc, templatesconfigurationrcStr, BackupMailUtil::configsPath());
666
importTemplatesConfig(templatesconfiguration, templatesconfigurationrc, templatesconfigurationrcStr, BackupMailUtil::configsPath());
674
const QString kmailStr("kmail2rc");
675
const KArchiveEntry* kmail2rcentry = mArchiveDirectory->entry(BackupMailUtil::configsPath() + kmailStr);
676
if(kmail2rcentry && kmail2rcentry->isFile()) {
677
const KArchiveFile* kmailrc = static_cast<const KArchiveFile*>(kmail2rcentry);
678
const QString kmail2rc = KStandardDirs::locateLocal( "config", kmailStr);
679
if(QFile(kmail2rc).exists()) {
680
if(KMessageBox::warningYesNo(mParent,i18n("\"%1\" already exists. Do you want to overwrite it ?",kmailStr),i18n("Restore"))== KMessageBox::Yes) {
681
importKmailConfig(kmailrc,kmail2rc,kmailStr,BackupMailUtil::configsPath());
684
importKmailConfig(kmailrc,kmail2rc,kmailStr,BackupMailUtil::configsPath());
688
Q_EMIT info(i18n("Config restored."));
691
void ImportMailJob::restoreIdentity()
693
const QString path(BackupMailUtil::identitiesPath() +QLatin1String("emailidentities"));
694
if(!mFileList.contains(path)) {
695
Q_EMIT error(i18n("emailidentities file could not be found in the archive."));
698
Q_EMIT info(i18n("Restore identities..."));
699
MessageViewer::KCursorSaver busy( MessageViewer::KBusyPtr::busy() );
700
const KArchiveEntry* identity = mArchiveDirectory->entry(path);
701
if(identity && identity->isFile()) {
702
const KArchiveFile* fileIdentity = static_cast<const KArchiveFile*>(identity);
703
fileIdentity->copyTo(mTempDirName);
704
KSharedConfig::Ptr identityConfig = KSharedConfig::openConfig(mTempDirName + QLatin1Char('/') +QLatin1String("emailidentities"));
705
KConfigGroup general = identityConfig->group(QLatin1String("General"));
706
const int defaultIdentity = general.readEntry(QLatin1String("Default Identity"),-1);
708
const QStringList identityList = identityConfig->groupList().filter( QRegExp( "Identity #\\d+" ) );
709
Q_FOREACH(const QString&identityStr, identityList) {
710
KConfigGroup group = identityConfig->group(identityStr);
712
const QString uidStr("uoid");
713
if(group.hasKey(uidStr)) {
714
oldUid = group.readEntry(uidStr).toUInt();
715
group.deleteEntry(uidStr);
717
const QString fcc(QLatin1String("Fcc"));
718
if(group.hasKey(fcc)) {
719
const Akonadi::Collection::Id fccId = convertPathToId(group.readEntry(fcc));
721
group.writeEntry(fcc,fccId);
723
group.deleteEntry(fcc);
725
const QString draft = QLatin1String("Drafts");
726
if(group.hasKey(draft)) {
727
const Akonadi::Collection::Id draftId = convertPathToId(group.readEntry(draft));
729
group.writeEntry(draft,draftId);
731
group.deleteEntry(draft);
733
const QString templates = QLatin1String("Templates");
734
if(group.hasKey(templates)) {
735
const Akonadi::Collection::Id templateId = convertPathToId(group.readEntry(templates));
737
group.writeEntry(templates,templateId);
739
group.deleteEntry(templates);
742
KPIMIdentities::Identity* identity = &mIdentityManager->newFromScratch( QString() );
744
identity->readConfig(group);
746
mHashIdentity.insert(oldUid,identity->uoid());
747
if(oldUid == defaultIdentity) {
748
mIdentityManager->setAsDefault(identity->uoid());
751
mIdentityManager->commit();
753
Q_EMIT info(i18n("Identities restored."));
755
Q_EMIT error(i18n("Failed to restore identity file."));
759
void ImportMailJob::restoreAkonadiDb()
761
const QString akonadiDbPath(BackupMailUtil::akonadiPath() + QLatin1String("akonadidatabase.sql"));
762
if(!mFileList.contains(akonadiDbPath)) {
763
Q_EMIT error(i18n("akonadi database file could not be found in the archive."));
767
MessageViewer::KCursorSaver busy( MessageViewer::KBusyPtr::busy() );
769
const KArchiveEntry* akonadiDataBaseEntry = mArchiveDirectory->entry(akonadiDbPath);
770
if(akonadiDataBaseEntry && akonadiDataBaseEntry->isFile()) {
772
const KArchiveFile* akonadiDataBaseFile = static_cast<const KArchiveFile*>(akonadiDataBaseEntry);
777
akonadiDataBaseFile->copyTo(tmp.fileName());
779
/* Restore the database */
780
AkonadiDataBase akonadiDataBase;
782
const QString dbDriver(akonadiDataBase.driver());
784
QString dbRestoreAppName;
785
if( dbDriver == QLatin1String("QPSQL") ) {
786
dbRestoreAppName = QLatin1String("pg_restore");
787
params << akonadiDataBase.options()
788
<< QLatin1String("--dbname=") + akonadiDataBase.name()
789
<< QLatin1String("--format=custom")
790
<< QLatin1String("--clean")
791
<< QLatin1String("--no-owner")
792
<< QLatin1String("--no-privileges")
795
else if (dbDriver == QLatin1String("QMYSQL") ) {
796
dbRestoreAppName = QLatin1String("mysql");
797
params << akonadiDataBase.options()
798
<< QLatin1String("--database=") + akonadiDataBase.name();
800
Q_EMIT error(i18n("Database driver \"%1\" not supported.",dbDriver));
803
const QString dbRestoreApp = KStandardDirs::findExe( dbRestoreAppName );
804
if(dbRestoreApp.isEmpty()) {
805
Q_EMIT error(i18n("Could not find \"%1\" necessary to restore database.",dbRestoreAppName));
808
KProcess *proc = new KProcess( this );
809
proc->setProgram( KStandardDirs::findExe( dbRestoreApp ), params );
810
proc->setStandardInputFile(tmp.fileName());
811
const int result = proc->execute();
814
Q_EMIT error(i18n("Failed to restore Akonadi Database."));
818
Q_EMIT info(i18n("Akonadi Database restored."));
821
void ImportMailJob::restoreNepomuk()
823
MessageViewer::KCursorSaver busy( MessageViewer::KBusyPtr::busy() );
824
Q_EMIT info(i18n("Nepomuk Database restored."));
825
Q_EMIT error(i18n("Failed to restore Nepomuk Database."));
830
void ImportMailJob::importArchiveConfig(const KArchiveFile* archiveconfiguration, const QString& archiveconfigurationrc, const QString&filename,const QString& prefix)
832
copyToFile(archiveconfiguration,archiveconfigurationrc,filename,prefix);
833
KSharedConfig::Ptr archiveConfig = KSharedConfig::openConfig(archiveconfigurationrc);
836
const QString archiveGroupPattern = QLatin1String( "ArchiveMailCollection " );
837
const QStringList archiveList = archiveConfig->groupList().filter( archiveGroupPattern );
838
Q_FOREACH(const QString& str, archiveList) {
839
const QString path = str.right(str.length()-archiveGroupPattern.length());
842
KConfigGroup oldGroup = archiveConfig->group(str);
843
const Akonadi::Collection::Id id = convertPathToId(path);
845
KConfigGroup newGroup( archiveConfig, archiveGroupPattern + QString::number(id));
846
oldGroup.copyTo( &newGroup );
847
newGroup.writeEntry(QLatin1String("saveCollectionId"),id);
848
KUrl path = newGroup.readEntry("storePath",KUrl());
849
if(!QDir(path.path()).exists()) {
850
newGroup.writeEntry(QLatin1String("storePath"),KUrl(QDir::homePath()));
853
oldGroup.deleteGroup();
856
archiveConfig->sync();
861
void ImportMailJob::importTemplatesConfig(const KArchiveFile* templatesconfiguration, const QString& templatesconfigurationrc, const QString&filename,const QString& prefix)
863
copyToFile(templatesconfiguration,templatesconfigurationrc,filename,prefix);
864
KSharedConfig::Ptr templateConfig = KSharedConfig::openConfig(templatesconfigurationrc);
867
const QString templateGroupPattern = QLatin1String( "Templates #" );
868
const QStringList templateList = templateConfig->groupList().filter( templateGroupPattern );
869
Q_FOREACH(const QString& str, templateList) {
870
const QString path = str.right(str.length()-templateGroupPattern.length());
873
KConfigGroup oldGroup = templateConfig->group(str);
874
const Akonadi::Collection::Id id = convertPathToId(path);
876
KConfigGroup newGroup( templateConfig, templateGroupPattern + QString::number(id));
877
oldGroup.copyTo( &newGroup );
879
oldGroup.deleteGroup();
883
const QString templateGroupIdentityPattern = QLatin1String( "Templates #IDENTITY_" );
884
const QStringList templateListIdentity = templateConfig->groupList().filter( templateGroupIdentityPattern );
885
Q_FOREACH(const QString& str, templateListIdentity) {
887
const int identity = str.right(str.length()-templateGroupIdentityPattern.length()).toInt(&found);
890
KConfigGroup oldGroup = templateConfig->group(str);
891
if(mHashIdentity.contains(identity)) {
892
KConfigGroup newGroup( templateConfig, templateGroupPattern + QString::number(mHashIdentity.value(identity)));
893
oldGroup.copyTo( &newGroup );
895
oldGroup.deleteGroup();
898
templateConfig->sync();
901
void ImportMailJob::importKmailConfig(const KArchiveFile* kmailsnippet, const QString& kmail2rc, const QString&filename,const QString& prefix)
903
copyToFile(kmailsnippet,kmail2rc,filename,prefix);
904
KSharedConfig::Ptr kmailConfig = KSharedConfig::openConfig(kmail2rc);
907
const QString folderGroupPattern = QLatin1String( "Folder-" );
908
const QStringList folderList = kmailConfig->groupList().filter( folderGroupPattern );
909
Q_FOREACH(const QString&str, folderList) {
910
const QString path = str.right(str.length()-folderGroupPattern.length());
911
if(!path.isEmpty()) {
912
KConfigGroup oldGroup = kmailConfig->group(str);
913
const Akonadi::Collection::Id id = convertPathToId(path);
915
KConfigGroup newGroup( kmailConfig, folderGroupPattern + QString::number(id));
916
oldGroup.copyTo( &newGroup );
918
oldGroup.deleteGroup();
921
const QString accountOrder("AccountOrder");
922
if(kmailConfig->hasGroup(accountOrder)) {
923
KConfigGroup group = kmailConfig->group(accountOrder);
924
QStringList orderList = group.readEntry(QLatin1String("order"),QStringList());
925
QStringList newOrderList;
926
if(!orderList.isEmpty()) {
927
Q_FOREACH(const QString&account, orderList) {
928
if(mHashResources.contains(account)) {
929
newOrderList.append(mHashResources.value(account));
931
newOrderList.append(account);
937
const QString composerStr("Composer");
938
if(kmailConfig->hasGroup(composerStr)) {
939
KConfigGroup composerGroup = kmailConfig->group(composerStr);
940
const QString previousStr("previous-fcc");
941
if(composerGroup.hasKey(previousStr)) {
942
const QString path = composerGroup.readEntry(previousStr);
943
if(!path.isEmpty()) {
944
const Akonadi::Collection::Id id = convertPathToId(path);
946
composerGroup.writeEntry(previousStr,id);
948
composerGroup.deleteEntry(previousStr);
952
const QString previousIdentityStr("previous-identity");
953
if(composerGroup.hasKey(previousIdentityStr)) {
954
const int identityValue = composerGroup.readEntry(previousIdentityStr, -1);
955
if(identityValue!=-1) {
956
if(mHashIdentity.contains(identityValue)) {
957
composerGroup.writeEntry(previousIdentityStr,mHashIdentity.value(identityValue));
959
composerGroup.writeEntry(previousIdentityStr,identityValue);
965
const QString generalStr("General");
966
if(kmailConfig->hasGroup(generalStr)) {
967
KConfigGroup generalGroup = kmailConfig->group(generalStr);
968
const QString startupFolderStr("startupFolder");
969
if(generalGroup.hasKey(startupFolderStr)) {
970
const QString path = generalGroup.readEntry(startupFolderStr);
971
if(!path.isEmpty()) {
972
const Akonadi::Collection::Id id = convertPathToId(path);
974
generalGroup.writeEntry(startupFolderStr,id);
976
generalGroup.deleteEntry(startupFolderStr);
982
const QString resourceGroupPattern = QLatin1String( "Resource " );
983
const QStringList resourceList = kmailConfig->groupList().filter( resourceGroupPattern );
984
Q_FOREACH(const QString&str, resourceList) {
985
const QString res = str.right(str.length()-resourceGroupPattern.length());
987
KConfigGroup oldGroup = kmailConfig->group(str);
988
if(mHashResources.contains(res)) {
989
KConfigGroup newGroup( kmailConfig, folderGroupPattern + mHashResources.value(res));
990
oldGroup.copyTo( &newGroup );
992
oldGroup.deleteGroup();
999
Akonadi::Collection::Id ImportMailJob::convertPathToId(const QString& path)
1001
if(mHashConvertPathCollectionId.contains(path)) {
1002
return mHashConvertPathCollectionId.value(path);
1004
const Akonadi::Collection::Id id = MailCommon::Util::convertFolderPathToCollectionId(path);
1006
mHashConvertPathCollectionId.insert(path,id);