diff options
Diffstat (limited to 'src/libs/installer')
-rw-r--r-- | src/libs/installer/packagemanagercore.cpp | 19 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore.h | 9 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore_p.cpp | 22 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore_p.h | 2 |
4 files changed, 51 insertions, 1 deletions
diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp index b349bd00a..e2e52a6db 100644 --- a/src/libs/installer/packagemanagercore.cpp +++ b/src/libs/installer/packagemanagercore.cpp @@ -335,6 +335,8 @@ static bool sNoForceInstallation = false; static bool sVirtualComponentsVisible = false; static bool sCreateLocalRepositoryFromBinary = false; +PackageManagerCore *PackageManagerCore::m_instance = 0; + static bool componentMatches(const Component *component, const QString &name, const QString &version = QString()) { @@ -718,6 +720,9 @@ bool PackageManagerCore::fileExists(const QString &filePath) const PackageManagerCore::PackageManagerCore() : d(new PackageManagerCorePrivate(this)) { + Q_ASSERT_X(m_instance == 0, Q_FUNC_INFO, "PackageManagerCore called more then once."); + m_instance = this; + Repository::registerMetaType(); // register, cause we stream the type as QVariant qRegisterMetaType<QInstaller::PackageManagerCore::Status>("QInstaller::PackageManagerCore::Status"); qRegisterMetaType<QInstaller::PackageManagerCore::WizardPage>("QInstaller::PackageManagerCore::WizardPage"); @@ -727,6 +732,9 @@ PackageManagerCore::PackageManagerCore(qint64 magicmaker, const QList<OperationB const QString &socketName, const QString &key, Protocol::Mode mode) : d(new PackageManagerCorePrivate(this, magicmaker, operations)) { + Q_ASSERT_X(m_instance == 0, Q_FUNC_INFO, "PackageManagerCore called more then once."); + m_instance = this; + Repository::registerMetaType(); // register, cause we stream the type as QVariant qRegisterMetaType<QInstaller::PackageManagerCore::Status>("QInstaller::PackageManagerCore::Status"); qRegisterMetaType<QInstaller::PackageManagerCore::WizardPage>("QInstaller::PackageManagerCore::WizardPage"); @@ -775,6 +783,7 @@ PackageManagerCore::~PackageManagerCore() QInstaller::VerboseWriter::instance()->setFileName(logFileName); } delete d; + m_instance = 0; RemoteClient::instance().setActive(false); RemoteClient::instance().shutdown(); @@ -2524,3 +2533,13 @@ ComponentModel *PackageManagerCore::componentModel(PackageManagerCore *core, con return model; } + +QStringList PackageManagerCore::filesForDelayedDeletion() const +{ + return d->m_filesForDelayedDeletion; +} + +void PackageManagerCore::addFilesForDelayedDeletion(const QStringList &files) +{ + d->m_filesForDelayedDeletion.append(files); +} diff --git a/src/libs/installer/packagemanagercore.h b/src/libs/installer/packagemanagercore.h index 04bee2f71..e768174bb 100644 --- a/src/libs/installer/packagemanagercore.h +++ b/src/libs/installer/packagemanagercore.h @@ -71,6 +71,11 @@ public: Protocol::Mode mode = Protocol::Mode::Production); ~PackageManagerCore(); + static PackageManagerCore *instance() { + Q_ASSERT_X(m_instance != 0, Q_FUNC_INFO, "PackageManagerCore call to instance before " + "constructor call."); return m_instance; + } + // status enum Status { Success = EXIT_SUCCESS, @@ -262,6 +267,9 @@ public: void setNeedsHardRestart(bool needsHardRestart = true); bool finishedWithSuccess() const; + QStringList filesForDelayedDeletion() const; + void addFilesForDelayedDeletion(const QStringList &files); + public Q_SLOTS: bool runInstaller(); bool runUninstaller(); @@ -338,6 +346,7 @@ private: private: PackageManagerCorePrivate *const d; friend class PackageManagerCorePrivate; + static PackageManagerCore *m_instance; private: // remove once we deprecate isSelected, setSelected etc... diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp index 3c86600dd..7d465cb0a 100644 --- a/src/libs/installer/packagemanagercore_p.cpp +++ b/src/libs/installer/packagemanagercore_p.cpp @@ -551,6 +551,7 @@ void PackageManagerCorePrivate::initialize(const QHash<QString, QString> ¶ms readMaintenanceConfigFiles(QCoreApplication::applicationDirPath()); #endif } + processFilesForDelayedDeletion(); foreach (Operation *currentOperation, m_performedOperationsOld) currentOperation->setValue(QLatin1String("installer"), QVariant::fromValue(m_core)); @@ -750,8 +751,9 @@ void PackageManagerCorePrivate::writeMaintenanceConfigFiles() foreach (const Repository &repo, m_data.settings().defaultRepositories()) repos.append(QVariant().fromValue(repo)); cfg.setValue(QLatin1String("DefaultRepositories"), repos); - cfg.sync(); + cfg.setValue(QLatin1String("FilesForDelayedDeletion"), m_filesForDelayedDeletion); + cfg.sync(); if (cfg.status() != QSettingsWrapper::NoError) { const QString reason = cfg.status() == QSettingsWrapper::AccessError ? tr("Access error") : tr("Format error"); @@ -811,6 +813,8 @@ void PackageManagerCorePrivate::readMaintenanceConfigFiles(const QString &target if (!repos.isEmpty()) m_data.settings().setDefaultRepositories(repos); + m_filesForDelayedDeletion = cfg.value(QLatin1String("FilesForDelayedDeletion")).toStringList(); + QFile file(targetDir + QLatin1String("/network.xml")); if (!file.open(QIODevice::ReadOnly)) return; @@ -2321,4 +2325,20 @@ void PackageManagerCorePrivate::handleMethodInvocationRequest(const QString &inv QMetaObject::invokeMethod(obj, qPrintable(invokableMethodName)); } +void PackageManagerCorePrivate::processFilesForDelayedDeletion() +{ + if (m_filesForDelayedDeletion.isEmpty()) + return; + + const QStringList filesForDelayedDeletion = std::move(m_filesForDelayedDeletion); + foreach (const QString &i, filesForDelayedDeletion) { + QFile file(i); //TODO: this should happen asnyc and report errors, I guess + if (file.exists() && !file.remove()) { + qWarning("Could not delete file %s: %s", qPrintable(i), + qPrintable(file.errorString())); + m_filesForDelayedDeletion << i; // try again next time + } + } +} + } // namespace QInstaller diff --git a/src/libs/installer/packagemanagercore_p.h b/src/libs/installer/packagemanagercore_p.h index d9609408c..3bcbf8ffa 100644 --- a/src/libs/installer/packagemanagercore_p.h +++ b/src/libs/installer/packagemanagercore_p.h @@ -201,6 +201,7 @@ public: Application m_updaterApplication; UpdateSourcesInfo m_updateSourcesInfo; std::shared_ptr<PackagesInfo> m_packagesInfo; + QStringList m_filesForDelayedDeletion; int m_status; QString m_error; @@ -253,6 +254,7 @@ private: LocalPackagesHash localInstalledPackages(); bool fetchMetaInformationFromRepositories(); bool addUpdateResourcesFromRepositories(bool parseChecksum); + void processFilesForDelayedDeletion(); private: PackageManagerCore *m_core; |