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"