summaryrefslogtreecommitdiffstats
path: root/src/libs
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs')
-rw-r--r--src/libs/installer/packagemanagercore.cpp19
-rw-r--r--src/libs/installer/packagemanagercore.h9
-rw-r--r--src/libs/installer/packagemanagercore_p.cpp22
-rw-r--r--src/libs/installer/packagemanagercore_p.h2
-rw-r--r--src/libs/kdtools/kdupdaterupdateoperation.cpp5
5 files changed, 54 insertions, 3 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> &params
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;
diff --git a/src/libs/kdtools/kdupdaterupdateoperation.cpp b/src/libs/kdtools/kdupdaterupdateoperation.cpp
index 007173ec5..2807012d2 100644
--- a/src/libs/kdtools/kdupdaterupdateoperation.cpp
+++ b/src/libs/kdtools/kdupdaterupdateoperation.cpp
@@ -34,7 +34,7 @@
#include "kdupdaterupdateoperation.h"
-#include "kdupdaterapplication.h"
+#include "packagemanagercore.h"
#include <QDataStream>
#include <QDebug>
@@ -98,7 +98,8 @@ UpdateOperation::UpdateOperation()
*/
UpdateOperation::~UpdateOperation()
{
- if (Application *app = Application::instance())
+ using namespace QInstaller;
+ if (PackageManagerCore *app = PackageManagerCore::instance())
app->addFilesForDelayedDeletion(filesForDelayedDeletion());
}