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

0001 /*
0002    SPDX-FileCopyrightText: 2012-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #pragma once
0008 
0009 #include "pimdataexporter_export.h"
0010 #include "utils.h"
0011 #include <Akonadi/Collection>
0012 #include <QObject>
0013 #include <QStringList>
0014 
0015 class ArchiveStorage;
0016 class KArchiveDirectory;
0017 class QTemporaryDir;
0018 class KZip;
0019 class KArchiveFile;
0020 class KArchiveEntry;
0021 
0022 namespace PimCommon
0023 {
0024 class CreateResource;
0025 }
0026 class ImportExportProgressIndicatorBase;
0027 class PIMDATAEXPORTER_EXPORT AbstractImportExportJob : public QObject
0028 {
0029     Q_OBJECT
0030 public:
0031     friend class ImportMailFolderAttributeJob;
0032     explicit AbstractImportExportJob(QObject *parent, ArchiveStorage *archiveStorage, Utils::StoredTypes typeSelected, int numberOfStep);
0033     ~AbstractImportExportJob() override;
0034 
0035     virtual void start() = 0;
0036 
0037     [[nodiscard]] bool wasCanceled() const;
0038 
0039     static int archiveVersion();
0040     static void setArchiveVersion(int version);
0041 
0042     void setImportExportProgressIndicator(ImportExportProgressIndicatorBase *importExportProgressIndicator);
0043 
0044     ImportExportProgressIndicatorBase *importExportProgressIndicator() const;
0045 
0046     // Only for test
0047     void setTempDirName(const QString &tempDirName);
0048 
0049 Q_SIGNALS:
0050     void info(const QString &);
0051     void error(const QString &);
0052     void title(const QString &);
0053     void endLine();
0054     void needSynchronizeResource(const QString &name, const QString &identifier);
0055     void jobFinished();
0056     void exportAttributeDone();
0057 
0058 protected:
0059     virtual void slotNextStep();
0060 
0061 protected:
0062     void emitInfo(const QString &str);
0063     void emitError(const QString &str);
0064     virtual QString applicationName() const = 0;
0065     [[nodiscard]] QString generateInfo(const QString &info);
0066     void initializeListStep();
0067     virtual void startSynchronizeResources(const QStringList &listResourceToSync);
0068     void infoAboutNewResource(const QString &resourceName);
0069     void copyToDirectory(const KArchiveEntry *entry, const QString &dest);
0070     void extractZipFile(const KArchiveFile *file, const QString &source, const QString &destination, bool isStoredAsZippedArchive = true);
0071 
0072     qint64 convertRealPathToCollection(KConfigGroup &group, const QString &currentKey, bool addCollectionPrefix = false);
0073     void copyToFile(const KArchiveFile *archivefile, const QString &dest, const QString &filename, const QString &prefix);
0074     void initializeImportJob();
0075     void backupFile(const QString &filename, const QString &path, const QString &storedName);
0076     void backupConfigFile(const QString &configFileName);
0077     void backupUiRcFile(const QString &configFileName, const QString &applicationName);
0078     void restoreUiRcFile(const QString &configNameStr, const QString &applicationName);
0079 
0080     [[nodiscard]] int mergeConfigMessageBox(const QString &configName) const;
0081     [[nodiscard]] bool overwriteConfigMessageBox(const QString &configName) const;
0082 
0083     void backupResourceFile(const QString &agentIdentifier, const QString &defaultPath);
0084 
0085     [[nodiscard]] QStringList
0086     restoreResourceFile(const QString &resourceName, const QString &defaultPath, const QString &storePath, bool overwriteResources = false);
0087     virtual void addSpecificResourceSettings(const KSharedConfig::Ptr &resourceConfig, const QString &resourceName, QMap<QString, QVariant> &settings);
0088     void restoreConfigFile(const QString &configNameStr);
0089     [[nodiscard]] bool overwriteDirectoryMessageBox(const QString &directory) const;
0090     void overwriteDirectory(const QString &path, const KArchiveEntry *entry);
0091     virtual bool isAConfigFile(const QString &name) const;
0092     void searchAllFiles(const KArchiveDirectory *dir, const QString &prefix, const QString &searchEntryName);
0093     void storeArchiveInfoResources(const KArchiveDirectory *dir, const QString &prefix);
0094 
0095     bool copyArchiveFileTo(const KArchiveFile *file, const QString &destination);
0096     [[nodiscard]] Akonadi::Collection::Id convertPathToId(const QString &path);
0097 
0098     [[nodiscard]] KZip *archive() const;
0099 
0100     void increaseProgressDialog();
0101     void createProgressDialog(const QString &title = QString());
0102 
0103     void setProgressDialogLabel(const QString &text);
0104     void storeDirectory(const QString &subDirectory);
0105     void importDataSubdirectory(const QString &subdirectoryRelativePath);
0106 
0107     void convertCollectionListStrToAkonadiId(const KSharedConfig::Ptr &config, const QString &groupName, const QString &key, bool addCollectionPrefix);
0108     void convertRealPathToCollectionList(KConfigGroup &group, const QString &currentKey, bool addCollectionPrefix = true);
0109     [[nodiscard]] virtual Akonadi::Collection::Id convertFolderPathToCollectionId(const QString &path) = 0;
0110     virtual QString adaptNewResourceUrl(bool overwriteResources, const KSharedConfig::Ptr &resourceConfig, const QString &storePath) = 0;
0111     [[nodiscard]] virtual QString
0112     createResource(const QString &resources, const QString &name, const QMap<QString, QVariant> &settings, bool synchronizeTree) = 0;
0113 
0114     QHash<QString, Akonadi::Collection::Id> mHashConvertPathCollectionId;
0115     QList<ResourceFiles> mListResourceFile;
0116 
0117     QString mTempDirName;
0118     const Utils::StoredTypes mTypeSelected;
0119     ArchiveStorage *const mArchiveStorage;
0120     QTemporaryDir *mTempDir = nullptr;
0121     const KArchiveDirectory *mArchiveDirectory = nullptr;
0122     const int mNumberOfStep = -1;
0123     PimCommon::CreateResource *mCreateResource = nullptr;
0124     QStringList mAgentPaths;
0125     QList<Utils::StoredType> mListStep;
0126     QList<Utils::AkonadiInstanceInfo> mAkonadiInstanceInfo;
0127     int mIndex = -1;
0128     static int sArchiveVersion;
0129 
0130 private:
0131     void slotAllResourceSynchronized();
0132     void slotSynchronizeInstanceDone(const QString &, const QString &identifier);
0133     void slotSynchronizeInstanceFailed(const QString &instance);
0134     void slotTaskCanceled();
0135 
0136     ImportExportProgressIndicatorBase *mImportExportProgressIndicator = nullptr;
0137 };