File indexing completed on 2024-05-12 05:25:33

0001 /*
0002    SPDX-FileCopyrightText: 2014-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "pimdatabackuprestore.h"
0008 #include "archivestorage.h"
0009 #include "importexportprogressindicatorbase.h"
0010 
0011 #include "mail/exportmailjobinterfaceimpl.h"
0012 #include "mail/importmailjobinterfaceimpl.h"
0013 
0014 #include "addressbook/exportaddressbookjobinterfaceimpl.h"
0015 #include "addressbook/importaddressbookjobinterfaceimpl.h"
0016 
0017 #include "calendar/exportcalendarjobinterfaceimpl.h"
0018 #include "calendar/importcalendarjobinterfaceimpl.h"
0019 
0020 #include "alarm/exportalarmjobinterfaceimpl.h"
0021 #include "alarm/importalarmjobinterfaceimpl.h"
0022 
0023 #include "notes/exportnotesjobinterfaceimpl.h"
0024 #include "notes/importnotesjobinterfaceimpl.h"
0025 
0026 #include "akregator/exportakregatorjobinterface.h"
0027 #include "akregator/importakregatorjobinterface.h"
0028 
0029 #include <KLocalizedString>
0030 #include <QFile>
0031 
0032 #include "pimdataexportcore_debug.h"
0033 #include <QDateTime>
0034 #include <QLocale>
0035 
0036 PimDataBackupRestore::PimDataBackupRestore(QObject *parent)
0037     : QObject(parent)
0038 {
0039 }
0040 
0041 PimDataBackupRestore::~PimDataBackupRestore()
0042 {
0043     delete mImportExportData;
0044     mImportExportData = nullptr;
0045     QFile f(mExportedInfoFileName);
0046     if (f.exists()) {
0047         const bool removeFile = f.remove();
0048         if (!removeFile) {
0049             qCDebug(PIMDATAEXPORTERCORE_LOG) << "Impossible to remove exportedfile info" << mExportedInfoFileName;
0050         }
0051     }
0052 }
0053 
0054 void PimDataBackupRestore::setExportedInfoFileName(const QString &filename)
0055 {
0056     mExportedInfoFileName = filename;
0057 }
0058 
0059 void PimDataBackupRestore::setStoredParameters(const QMap<Utils::AppsType, Utils::importExportParameters> &stored)
0060 {
0061     mStored = stored;
0062 }
0063 
0064 bool PimDataBackupRestore::openArchive(const QString &filename, bool readWrite)
0065 {
0066     mArchiveStorage = new ArchiveStorage(filename, this);
0067     if (!mArchiveStorage->openArchive(readWrite)) {
0068         delete mArchiveStorage;
0069         mArchiveStorage = nullptr;
0070         return false;
0071     }
0072     return true;
0073 }
0074 
0075 bool PimDataBackupRestore::backupStart(const QString &filename)
0076 {
0077     if (mStored.isEmpty()) {
0078         addDate();
0079         Q_EMIT addInfo(i18n("No data selected."));
0080         Q_EMIT jobFailed();
0081         deleteLater();
0082         return false;
0083     }
0084     if (!openArchive(filename, true)) {
0085         Q_EMIT addError(i18n("Unable to open file \"%1\".", filename));
0086         Q_EMIT jobFailed();
0087         deleteLater();
0088         return false;
0089     }
0090     Q_EMIT updateActions(true);
0091     mAction = Backup;
0092     mStoreIterator = mStored.constBegin();
0093     addDate();
0094     Q_EMIT addInfo(i18n("Starting to backup data in \'%1\'", mArchiveStorage->filename()));
0095     Q_EMIT addEndLine();
0096     // Add version
0097     Utils::addVersion(mArchiveStorage->archive());
0098     // Add exported file info.
0099     // qDebug() << "mExportedInfoFileName" << mExportedInfoFileName;
0100     Utils::storeDataExportInfo(mArchiveStorage->archive(), mExportedInfoFileName);
0101     backupNextStep();
0102     return true;
0103 }
0104 
0105 void PimDataBackupRestore::nextStep()
0106 {
0107     ++mStoreIterator;
0108     Q_EMIT addEndLine();
0109     switch (mAction) {
0110     case Backup:
0111         backupNextStep();
0112         break;
0113     case Restore:
0114         restoreNextStep();
0115     }
0116 }
0117 
0118 void PimDataBackupRestore::backupNextStep()
0119 {
0120     if (mStoreIterator != mStored.constEnd()) {
0121         switch (mStoreIterator.key()) {
0122         case Utils::KMail:
0123             if (mStoreIterator.value().numberSteps != 0) {
0124                 mImportExportData = new ExportMailJobInterfaceImpl(this, mStoreIterator.value().types, mArchiveStorage, mStoreIterator.value().numberSteps);
0125                 executeJob();
0126             }
0127             break;
0128         case Utils::KAddressBook:
0129             if (mStoreIterator.value().numberSteps != 0) {
0130                 mImportExportData =
0131                     new ExportAddressbookJobInterfaceImpl(this, mStoreIterator.value().types, mArchiveStorage, mStoreIterator.value().numberSteps);
0132                 executeJob();
0133             }
0134             break;
0135         case Utils::KAlarm:
0136             if (mStoreIterator.value().numberSteps != 0) {
0137                 mImportExportData = new ExportAlarmJobInterfaceImpl(this, mStoreIterator.value().types, mArchiveStorage, mStoreIterator.value().numberSteps);
0138                 executeJob();
0139             }
0140             break;
0141         case Utils::KOrganizer:
0142             if (mStoreIterator.value().numberSteps != 0) {
0143                 mImportExportData = new ExportCalendarJobInterfaceImpl(this, mStoreIterator.value().types, mArchiveStorage, mStoreIterator.value().numberSteps);
0144                 executeJob();
0145             }
0146             break;
0147         case Utils::KNotes:
0148             if (mStoreIterator.value().numberSteps != 0) {
0149                 mImportExportData = new ExportNotesJobInterfaceImpl(this, mStoreIterator.value().types, mArchiveStorage, mStoreIterator.value().numberSteps);
0150                 executeJob();
0151             }
0152             break;
0153         case Utils::Akregator:
0154             if (mStoreIterator.value().numberSteps != 0) {
0155                 mImportExportData = new ExportAkregatorJobInterface(this, mStoreIterator.value().types, mArchiveStorage, mStoreIterator.value().numberSteps);
0156                 executeJob();
0157             }
0158             break;
0159         case Utils::Unknown:
0160             break;
0161         }
0162     } else {
0163         backupFinished();
0164     }
0165 }
0166 
0167 void PimDataBackupRestore::closeArchive()
0168 {
0169     if (mArchiveStorage) {
0170         mArchiveStorage->closeArchive();
0171         delete mArchiveStorage;
0172         mArchiveStorage = nullptr;
0173     }
0174     if (mImportExportData) {
0175         delete mImportExportData;
0176         mImportExportData = nullptr;
0177     }
0178     Q_EMIT updateActions(false);
0179 }
0180 
0181 void PimDataBackupRestore::backupFinished()
0182 {
0183     Q_EMIT addInfo(i18n("Backup in \'%1\' done.", mArchiveStorage->filename()));
0184     // At the end
0185     closeArchive();
0186     Q_EMIT backupDone();
0187     deleteLater();
0188 }
0189 
0190 void PimDataBackupRestore::restoreNextStep()
0191 {
0192     if (mStoreIterator != mStored.constEnd()) {
0193         switch (mStoreIterator.key()) {
0194         case Utils::KMail:
0195             if (mStoreIterator.value().numberSteps != 0) {
0196                 mImportExportData = new ImportMailJobInterfaceImpl(this, mStoreIterator.value().types, mArchiveStorage, mStoreIterator.value().numberSteps);
0197                 executeJob();
0198             }
0199             break;
0200         case Utils::KAddressBook:
0201             if (mStoreIterator.value().numberSteps != 0) {
0202                 mImportExportData =
0203                     new ImportAddressbookJobInterfaceImpl(this, mStoreIterator.value().types, mArchiveStorage, mStoreIterator.value().numberSteps);
0204                 executeJob();
0205             }
0206             break;
0207         case Utils::KAlarm:
0208             if (mStoreIterator.value().numberSteps != 0) {
0209                 mImportExportData = new ImportAlarmJobInterfaceImpl(this, mStoreIterator.value().types, mArchiveStorage, mStoreIterator.value().numberSteps);
0210                 executeJob();
0211             }
0212             break;
0213         case Utils::KOrganizer:
0214             if (mStoreIterator.value().numberSteps != 0) {
0215                 mImportExportData = new ImportCalendarJobInterfaceImpl(this, mStoreIterator.value().types, mArchiveStorage, mStoreIterator.value().numberSteps);
0216                 executeJob();
0217             }
0218             break;
0219         case Utils::KNotes:
0220             if (mStoreIterator.value().numberSteps != 0) {
0221                 mImportExportData = new ImportNotesJobInterfaceImpl(this, mStoreIterator.value().types, mArchiveStorage, mStoreIterator.value().numberSteps);
0222                 executeJob();
0223             }
0224             break;
0225         case Utils::Akregator:
0226             if (mStoreIterator.value().numberSteps != 0) {
0227                 mImportExportData = new ImportAkregatorJobInterface(this, mStoreIterator.value().types, mArchiveStorage, mStoreIterator.value().numberSteps);
0228                 executeJob();
0229             }
0230             break;
0231         case Utils::Unknown:
0232             break;
0233         }
0234     } else {
0235         restoreFinished();
0236     }
0237 }
0238 
0239 bool PimDataBackupRestore::continueToRestore()
0240 {
0241     return true;
0242 }
0243 
0244 void PimDataBackupRestore::addDate()
0245 {
0246     const QDateTime now = QDateTime::currentDateTime();
0247     Q_EMIT addInfo(QLatin1Char('[') + QLocale().toString((now), QLocale::ShortFormat) + QLatin1Char(']'));
0248 }
0249 
0250 bool PimDataBackupRestore::restoreStart(const QString &filename)
0251 {
0252     if (mStored.isEmpty()) {
0253         addDate();
0254         Q_EMIT addInfo(i18n("No data selected."));
0255         Q_EMIT jobFailed();
0256         deleteLater();
0257         return false;
0258     }
0259     if (!openArchive(filename, false)) {
0260         Q_EMIT addError(i18n("Unable to open file \"%1\".", filename));
0261         Q_EMIT jobFailed();
0262         deleteLater();
0263         return false;
0264     }
0265     Q_EMIT updateActions(true);
0266     mAction = Restore;
0267     mStoreIterator = mStored.constBegin();
0268     const int version = Utils::archiveVersion(mArchiveStorage->archive());
0269     if (version > Utils::currentArchiveVersion()) {
0270         if (!continueToRestore()) {
0271             return false;
0272         }
0273     }
0274     qCDebug(PIMDATAEXPORTERCORE_LOG) << " version " << version;
0275     AbstractImportExportJob::setArchiveVersion(version);
0276 
0277     addDate();
0278 
0279     Q_EMIT addInfo(i18n("Starting to restore data from \'%1\'", mArchiveStorage->filename()));
0280     Q_EMIT addEndLine();
0281     restoreNextStep();
0282     return true;
0283 }
0284 
0285 void PimDataBackupRestore::restoreFinished()
0286 {
0287     Q_EMIT addInfo(i18n("Restoring data from \'%1\' done.", mArchiveStorage->filename()));
0288     // At the end
0289     mArchiveStorage->closeArchive();
0290     delete mArchiveStorage;
0291     mArchiveStorage = nullptr;
0292     delete mImportExportData;
0293     mImportExportData = nullptr;
0294     Q_EMIT restoreDone();
0295     deleteLater();
0296 }
0297 
0298 void PimDataBackupRestore::executeJob()
0299 {
0300     addExportProgressIndicator();
0301     connect(mImportExportData, &AbstractImportExportJob::info, this, &PimDataBackupRestore::addInfo);
0302     connect(mImportExportData, &AbstractImportExportJob::error, this, &PimDataBackupRestore::addError);
0303     connect(mImportExportData, &AbstractImportExportJob::title, this, &PimDataBackupRestore::addTitle);
0304     connect(mImportExportData, &AbstractImportExportJob::endLine, this, &PimDataBackupRestore::addEndLine);
0305     connect(mImportExportData, &AbstractImportExportJob::jobFinished, this, &PimDataBackupRestore::jobFinished);
0306     connect(mImportExportData, &AbstractImportExportJob::needSynchronizeResource, this, &PimDataBackupRestore::needSyncResource);
0307     mImportExportData->start();
0308 }
0309 
0310 void PimDataBackupRestore::addExportProgressIndicator()
0311 {
0312     mImportExportData->setImportExportProgressIndicator(new ImportExportProgressIndicatorBase(this));
0313 }
0314 
0315 void PimDataBackupRestore::slotJobFinished()
0316 {
0317     ++mStoreIterator;
0318     Q_EMIT addEndLine();
0319     delete mImportExportData;
0320     mImportExportData = nullptr;
0321     switch (mAction) {
0322     case Backup:
0323         backupNextStep();
0324         break;
0325     case Restore:
0326         restoreNextStep();
0327         break;
0328     }
0329 }
0330 
0331 #include "moc_pimdatabackuprestore.cpp"