summaryrefslogtreecommitdiffstats
path: root/src/libs
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs')
-rw-r--r--src/libs/installer/componentmodel.cpp8
-rw-r--r--src/libs/installer/metadatajob.cpp126
-rw-r--r--src/libs/installer/metadatajob.h2
-rw-r--r--src/libs/installer/metadatajob_p.h1
-rw-r--r--src/libs/installer/packagemanagercore.cpp41
-rw-r--r--src/libs/installer/packagemanagercore.h1
-rw-r--r--src/libs/installer/packagemanagercore_p.cpp29
-rw-r--r--src/libs/installer/packagemanagercore_p.h6
-rw-r--r--src/libs/installer/packagemanagergui.cpp42
-rw-r--r--src/libs/installer/packagemanagergui.h1
-rw-r--r--src/libs/installer/productkeycheck.cpp5
-rw-r--r--src/libs/installer/productkeycheck.h1
-rw-r--r--src/libs/kdtools/job.cpp4
-rw-r--r--src/libs/kdtools/job.h1
14 files changed, 201 insertions, 67 deletions
diff --git a/src/libs/installer/componentmodel.cpp b/src/libs/installer/componentmodel.cpp
index 88465b85b..e0cc3fcd8 100644
--- a/src/libs/installer/componentmodel.cpp
+++ b/src/libs/installer/componentmodel.cpp
@@ -575,7 +575,13 @@ QSet<QModelIndex> ComponentModel::updateCheckedState(const ComponentSet &compone
// we can start in descending order to check node and tri-state nodes properly
for (int i = sortedNodes.count(); i > 0; i--) {
Component * const node = sortedNodes.at(i - 1);
- if (!node->isCheckable() || !node->isEnabled() || !node->autoDependencies().isEmpty())
+
+ bool checkable = true;
+ if (node->value(scCheckable, scTrue).toLower() == scFalse) {
+ checkable = false;
+ }
+
+ if ((!node->isCheckable() && checkable) || !node->isEnabled() || !node->autoDependencies().isEmpty())
continue;
Qt::CheckState newState = state;
diff --git a/src/libs/installer/metadatajob.cpp b/src/libs/installer/metadatajob.cpp
index 83f252349..ecc66f493 100644
--- a/src/libs/installer/metadatajob.cpp
+++ b/src/libs/installer/metadatajob.cpp
@@ -34,6 +34,7 @@
#include "proxycredentialsdialog.h"
#include "serverauthenticationdialog.h"
#include "settings.h"
+#include "testrepository.h"
#include <QTemporaryDir>
@@ -60,6 +61,7 @@ MetadataJob::MetadataJob(QObject *parent)
MetadataJob::~MetadataJob()
{
+ resetCompressedFetch();
reset();
}
@@ -118,19 +120,34 @@ void MetadataJob::doStart()
emitFinished();
}
} else {
- m_packages.clear();
+ resetCompressedFetch();
+
bool repositoriesFound = false;
- foreach (const Repository &repo, m_core->settings().repositories()) {
+ foreach (const Repository &repo, m_core->settings().temporaryRepositories()) {
if (repo.isCompressed() && repo.isEnabled() &&
productKeyCheck->isValidRepository(repo)) {
repositoriesFound = true;
startUnzipRepositoryTask(repo);
+
+ //Set the repository disabled so we don't handle it many times
+ Repository replacement = repo;
+ replacement.setEnabled(false);
+ Settings &s = m_core->settings();
+ QSet<Repository> temporaries = s.temporaryRepositories();
+ if (temporaries.contains(repo)) {
+ temporaries.remove(repo);
+ temporaries.insert(replacement);
+ s.setTemporaryRepositories(temporaries, true);
+ }
}
}
- if (!repositoriesFound)
+ if (!repositoriesFound) {
emitFinished();
- else
- emit infoMessage(this, tr("Unpacking compressed repositories..."));
+ }
+ else {
+ setProgressTotalAmount(0);
+ emit infoMessage(this, tr("Unpacking compressed repositories. This may take a while..."));
+ }
}
}
@@ -170,8 +187,61 @@ void MetadataJob::startUnzipRepositoryTask(const Repository &repo)
void MetadataJob::unzipRepositoryTaskFinished()
{
QFutureWatcher<void> *watcher = static_cast<QFutureWatcher<void> *>(sender());
+ int error = Job::NoError;
+ QString errorString;
try {
watcher->waitForFinished(); // trigger possible exceptions
+
+ QHashIterator<QFutureWatcher<void> *, QObject*> i(m_unzipRepositoryTasks);
+ while (i.hasNext()) {
+
+ i.next();
+ if (i.key() == watcher) {
+ UnzipArchiveTask *task = qobject_cast<UnzipArchiveTask*> (i.value());
+ QString url = task->target();
+
+ QUrl targetUrl = targetUrl.fromLocalFile(url);
+ Repository repo(targetUrl, false, true);
+ url = repo.url().toString() + QLatin1String("/Updates.xml");
+ TestRepository testJob(m_core);
+ testJob.setRepository(repo);
+ testJob.start();
+ testJob.waitForFinished();
+ error = testJob.error();
+ errorString = testJob.errorString();
+ if (error == Job::NoError) {
+ FileTaskItem item(url);
+ item.insert(TaskRole::UserRole, QVariant::fromValue(repo));
+ m_unzipRepositoryitems.append(item);
+ } else {
+ //Repository is not valid, remove it
+ Repository repository;
+ repository.setUrl(QUrl(task->archive()));
+ Settings &s = m_core->settings();
+ QSet<Repository> temporaries = s.temporaryRepositories();
+ foreach (Repository repository, temporaries) {
+ if (repository.url().toLocalFile() == task->archive()) {
+ temporaries.remove(repository);
+ }
+ }
+ s.setTemporaryRepositories(temporaries, false);
+ }
+ }
+ }
+ delete m_unzipRepositoryTasks.value(watcher);
+ m_unzipRepositoryTasks.remove(watcher);
+ delete watcher;
+
+ //One can specify many zipped repository items at once. As the repositories are
+ //unzipped one by one, we collect here all items before parsing xml files from those.
+ if (m_unzipRepositoryitems.count() > 0 && m_unzipRepositoryTasks.isEmpty()) {
+ startXMLTask(m_unzipRepositoryitems);
+ } else {
+ if (error != Job::NoError) {
+ emitFinishedWithError(QInstaller::DownloadError, errorString);
+ }
+ }
+
} catch (const UnzipArchiveException &e) {
reset();
emitFinishedWithError(QInstaller::ExtractionError, e.message());
@@ -182,31 +252,6 @@ void MetadataJob::unzipRepositoryTaskFinished()
reset();
emitFinishedWithError(QInstaller::DownloadError, tr("Unknown exception during extracting."));
}
-
- QHashIterator<QFutureWatcher<void> *, QObject*> i(m_unzipRepositoryTasks);
- while (i.hasNext()) {
- i.next();
- if (i.key() == watcher) {
- UnzipArchiveTask *task = qobject_cast<UnzipArchiveTask*> (i.value());
- QString url = task->target();
-
- QUrl targetUrl = targetUrl.fromLocalFile(url);
- Repository repo(targetUrl, false, true);
- url = repo.url().toString() + QLatin1String("/Updates.xml");
- FileTaskItem item(url);
- item.insert(TaskRole::UserRole, QVariant::fromValue(repo));
- m_unzipRepositoryitems.append(item);
- }
- }
-
- //One can specify many zipped repository items at once. As the repositories are
- //unzipped one by one, we collect here all items before parsing xml files from those.
- delete m_unzipRepositoryTasks.value(watcher);
- m_unzipRepositoryTasks.remove(watcher);
- delete watcher;
-
- if (m_unzipRepositoryitems.count() > 0 && m_unzipRepositoryTasks.isEmpty())
- startXMLTask(m_unzipRepositoryitems);
}
void MetadataJob::xmlTaskFinished()
@@ -284,6 +329,7 @@ void MetadataJob::xmlTaskFinished()
DownloadFileTask *const metadataTask = new DownloadFileTask(m_packages);
metadataTask->setProxyFactory(m_core->proxyFactory());
m_metadataTask.setFuture(QtConcurrent::run(&DownloadFileTask::doTask, metadataTask));
+ setProgressTotalAmount(100);
emit infoMessage(this, tr("Retrieving meta information from remote repository..."));
} else if (status == XmlDownloadRetry) {
QMetaObject::invokeMethod(this, "doStart", Qt::QueuedConnection);
@@ -299,13 +345,10 @@ void MetadataJob::unzipTaskFinished()
try {
watcher->waitForFinished(); // trigger possible exceptions
} catch (const UnzipArchiveException &e) {
- reset();
emitFinishedWithError(QInstaller::ExtractionError, e.message());
} catch (const QUnhandledException &e) {
- reset();
emitFinishedWithError(QInstaller::DownloadError, QLatin1String(e.what()));
} catch (...) {
- reset();
emitFinishedWithError(QInstaller::DownloadError, tr("Unknown exception during extracting."));
}
@@ -327,6 +370,11 @@ void MetadataJob::progressChanged(int progress)
setProcessedAmount(progress);
}
+void MetadataJob::setProgressTotalAmount(int maximum)
+{
+ setTotalAmount(maximum);
+}
+
void MetadataJob::metadataTaskFinished()
{
try {
@@ -374,6 +422,17 @@ void MetadataJob::reset()
try {
m_xmlTask.cancel();
m_metadataTask.cancel();
+ } catch (...) {}
+ m_tempDirDeleter.releaseAndDeleteAll();
+}
+
+void MetadataJob::resetCompressedFetch()
+{
+ setError(Job::NoError);
+ setErrorString(QString());
+ m_unzipRepositoryitems.clear();
+
+ try {
foreach (QFutureWatcher<void> *const watcher, m_unzipTasks.keys()) {
watcher->cancel();
watcher->deleteLater();
@@ -390,7 +449,6 @@ void MetadataJob::reset()
object->deleteLater();
m_unzipRepositoryTasks.clear();
} catch (...) {}
- m_tempDirDeleter.releaseAndDeleteAll();
}
MetadataJob::Status MetadataJob::parseUpdatesXml(const QList<FileTaskResult> &results)
diff --git a/src/libs/installer/metadatajob.h b/src/libs/installer/metadatajob.h
index 261ae295f..c6d5ad353 100644
--- a/src/libs/installer/metadatajob.h
+++ b/src/libs/installer/metadatajob.h
@@ -74,12 +74,14 @@ private slots:
void unzipTaskFinished();
void metadataTaskFinished();
void progressChanged(int progress);
+ void setProgressTotalAmount(int maximum);
void unzipRepositoryTaskFinished();
void startXMLTask(const QList<FileTaskItem> items);
private:
void startUnzipRepositoryTask(const Repository &repo);
void reset();
+ void resetCompressedFetch();
Status parseUpdatesXml(const QList<FileTaskResult> &results);
private:
diff --git a/src/libs/installer/metadatajob_p.h b/src/libs/installer/metadatajob_p.h
index 65be0a174..9160f4cc9 100644
--- a/src/libs/installer/metadatajob_p.h
+++ b/src/libs/installer/metadatajob_p.h
@@ -65,6 +65,7 @@ public:
: m_archive(arcive), m_targetDir(target)
{}
QString target() { return m_targetDir; }
+ QString archive() { return m_archive; }
void doTask(QFutureInterface<void> &fi)
{
fi.reportStarted();
diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp
index edd2460a8..c4ba5ae4a 100644
--- a/src/libs/installer/packagemanagercore.cpp
+++ b/src/libs/installer/packagemanagercore.cpp
@@ -1799,23 +1799,42 @@ ComponentModel *PackageManagerCore::updaterComponentModel() const
void PackageManagerCore::updateComponentsSilently()
{
+ //Check if there are processes running in the install
+ QStringList excludeFiles;
+ excludeFiles.append(maintenanceToolName());
+
+ QStringList runningProcesses = d->runningInstallerProcesses(excludeFiles);
+ if (!runningProcesses.isEmpty()) {
+ qDebug() << "Unable to update components. Please stop these processes: "
+ << runningProcesses << " and try again.";
+ return;
+ }
+
autoAcceptMessageBoxes();
+
+ //Prevent infinite loop if installation for some reason fails.
+ setMessageBoxAutomaticAnswer(QLatin1String("installationErrorWithRetry"), QMessageBox::Cancel);
+
fetchRemotePackagesTree();
//Mark all components to be installed
const QList<QInstaller::Component*> componentList = components(
ComponentType::Root | ComponentType::Descendants);
- foreach (Component *comp, componentList) {
- comp->setCheckState(Qt::Checked);
- }
- QString htmlOutput;
- bool componentsOk = calculateComponents(&htmlOutput);
- if (componentsOk) {
- if (runPackageUpdater())
- qDebug() << "Components updated successfully.";
- }
- else {
- qDebug() << htmlOutput;
+ if (componentList.count() == 0) {
+ qDebug() << "No updates available.";
+ } else {
+ foreach (Component *comp, componentList) {
+ comp->setCheckState(Qt::Checked);
+ }
+ QString htmlOutput;
+ bool componentsOk = calculateComponents(&htmlOutput);
+ if (componentsOk) {
+ if (runPackageUpdater())
+ qDebug() << "Components updated successfully.";
+ }
+ else {
+ qDebug() << htmlOutput;
+ }
}
}
diff --git a/src/libs/installer/packagemanagercore.h b/src/libs/installer/packagemanagercore.h
index 59be3e9ee..2a235bd44 100644
--- a/src/libs/installer/packagemanagercore.h
+++ b/src/libs/installer/packagemanagercore.h
@@ -290,6 +290,7 @@ Q_SIGNALS:
void finishButtonClicked();
void metaJobProgress(int progress);
+ void metaJobTotalProgress(int progress);
void metaJobInfoMessage(const QString &message);
void startAllComponentsReset();
diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp
index f29b65780..28d64d09c 100644
--- a/src/libs/installer/packagemanagercore_p.cpp
+++ b/src/libs/installer/packagemanagercore_p.cpp
@@ -581,6 +581,7 @@ void PackageManagerCorePrivate::initialize(const QHash<QString, QString> &params
m_metadataJob.setPackageManagerCore(m_core);
connect(&m_metadataJob, &Job::infoMessage, this, &PackageManagerCorePrivate::infoMessage);
connect(&m_metadataJob, &Job::progress, this, &PackageManagerCorePrivate::infoProgress);
+ connect(&m_metadataJob, &Job::totalProgress, this, &PackageManagerCorePrivate::totalProgress);
KDUpdater::FileDownloaderFactory::instance().setProxyFactory(m_core->proxyFactory());
}
@@ -2247,7 +2248,9 @@ bool PackageManagerCorePrivate::fetchMetaInformationFromCompressedRepositories()
case QInstaller::UserIgnoreError:
break; // we can simply ignore this error, the user knows about it
default:
- setStatus(PackageManagerCore::Failure, m_metadataJob.errorString());
+ //Do not change core status here, we can recover if there is invalid
+ //compressed repository
+ setStatus(m_core->status(), m_metadataJob.errorString());
return compressedRepoFetched;
}
}
@@ -2419,4 +2422,28 @@ void PackageManagerCorePrivate::processFilesForDelayedDeletion()
}
}
+void PackageManagerCorePrivate::findExecutablesRecursive(const QString &path, const QStringList &excludeFiles, QStringList *result)
+{
+ QString executable;
+ QDirIterator it(path, QDir::NoDotAndDotDot | QDir::Executable | QDir::Files | QDir::System, QDirIterator::Subdirectories );
+
+ while (it.hasNext()) {
+ executable = it.next();
+ foreach (QString exclude, excludeFiles) {
+ if (QDir::toNativeSeparators(executable.toLower())
+ != QDir::toNativeSeparators(exclude.toLower())) {
+ result->append(executable);
+ }
+ }
+ }
+}
+
+QStringList PackageManagerCorePrivate::runningInstallerProcesses(const QStringList &excludeFiles)
+{
+ QStringList resultFiles;
+ findExecutablesRecursive(QCoreApplication::applicationDirPath(), excludeFiles, &resultFiles);
+ return checkRunningProcessesFromList(resultFiles);
+}
+
+
} // namespace QInstaller
diff --git a/src/libs/installer/packagemanagercore_p.h b/src/libs/installer/packagemanagercore_p.h
index 7ba081539..21ab3fc40 100644
--- a/src/libs/installer/packagemanagercore_p.h
+++ b/src/libs/installer/packagemanagercore_p.h
@@ -209,6 +209,10 @@ private slots:
emit m_core->metaJobProgress(progress);
}
+ void totalProgress(quint64 total) {
+ emit m_core->metaJobTotalProgress(total);
+ }
+
void handleMethodInvocationRequest(const QString &invokableMethodName);
private:
@@ -230,6 +234,8 @@ private:
bool fetchMetaInformationFromCompressedRepositories();
bool addUpdateResourcesFromRepositories(bool parseChecksum, bool compressedRepository = false);
void processFilesForDelayedDeletion();
+ void findExecutablesRecursive(const QString &path, const QStringList &excludeFiles, QStringList *result);
+ QStringList runningInstallerProcesses(const QStringList &exludeFiles);
private:
PackageManagerCore *m_core;
diff --git a/src/libs/installer/packagemanagergui.cpp b/src/libs/installer/packagemanagergui.cpp
index 513b9d0e0..d31eb6a94 100644
--- a/src/libs/installer/packagemanagergui.cpp
+++ b/src/libs/installer/packagemanagergui.cpp
@@ -1323,6 +1323,7 @@ IntroductionPage::IntroductionPage(PackageManagerCore *core)
core->setCompleteUninstallation(core->isUninstaller());
connect(core, &PackageManagerCore::metaJobProgress, this, &IntroductionPage::onProgressChanged);
+ connect(core, &PackageManagerCore::metaJobTotalProgress, this, &IntroductionPage::setTotalProgress);
connect(core, &PackageManagerCore::metaJobInfoMessage, this, &IntroductionPage::setMessage);
connect(core, &PackageManagerCore::coreNetworkSettingsChanged,
this, &IntroductionPage::onCoreNetworkSettingsChanged);
@@ -1512,11 +1513,19 @@ void IntroductionPage::setMessage(const QString &msg)
*/
void IntroductionPage::onProgressChanged(int progress)
{
- m_progressBar->setRange(0, 100);
m_progressBar->setValue(progress);
}
/*!
+ Sets total \a progress value to progress bar.
+*/
+void IntroductionPage::setTotalProgress(int totalProgress)
+{
+ if (m_progressBar)
+ m_progressBar->setRange(0, totalProgress);
+}
+
+/*!
Displays the error message \a error on the page.
*/
void IntroductionPage::setErrorMessage(const QString &error)
@@ -1946,19 +1955,17 @@ public:
m_vlayout->addSpacing(50);
m_vlayout->addWidget(m_bspLabel);
-
m_progressBar = new QProgressBar();
m_progressBar->setRange(0, 0);
m_progressBar->hide();
m_vlayout->addWidget(m_progressBar);
m_progressBar->setObjectName(QLatin1String("CompressedInstallProgressBar"));
-
m_installCompressButton = new QPushButton;
connect(m_installCompressButton, &QAbstractButton::clicked,
this, &ComponentSelectionPage::Private::selectCompressedPackage);
m_installCompressButton->setObjectName(QLatin1String("InstallCompressedPackageButton"));
- m_installCompressButton->setText(ComponentSelectionPage::tr("&Browse QBSP or 7z files..."));
+ m_installCompressButton->setText(ComponentSelectionPage::tr("&Browse QBSP files"));
m_vlayout->addWidget(m_installCompressButton);
m_compressedButtonVisible = true;
}
@@ -2057,21 +2064,26 @@ public slots:
QSet<Repository> set;
foreach (QString fileName, fileNames) {
Repository repository = Repository::fromUserInput(fileName, true);
+ repository.setEnabled(true);
set.insert(repository);
}
if (set.count() > 0) {
m_progressBar->show();
- m_installCompressButton->setEnabled(false);
+ m_installCompressButton->hide();
QPushButton *const b = qobject_cast<QPushButton *>(q->gui()->button(QWizard::NextButton));
b->setEnabled(false);
m_core->settings().addTemporaryRepositories(set, false);
- m_core->fetchCompressedPackagesTree();
- updateTreeView();
+ if (!m_core->fetchCompressedPackagesTree()) {
+ setMessage(m_core->error());
+ }
+ else {
+ updateTreeView();
+ setMessage(ComponentSelectionPage::tr("To install new "\
+ "compressed repository, browse the repositories from your computer"));
+ }
m_progressBar->hide();
- m_bspLabel->setText(ComponentSelectionPage::tr("To install new "\
- "compressed repository, browse the repositories from your computer"));
- m_installCompressButton->setEnabled(true);
+ m_installCompressButton->show();
b->setEnabled(true);
}
}
@@ -2089,13 +2101,9 @@ public slots:
*/
void setMessage(const QString &msg)
{
- if (m_progressBar->isVisible()) {
+ QWizardPage *page = q->gui()->currentPage();
+ if (m_bspLabel && page && page->objectName() == QLatin1String("ComponentSelectionPage"))
m_bspLabel->setText(msg);
- }
- else {
- m_bspLabel->setText(ComponentSelectionPage::tr("To install new "\
- "compressed repository, browse the repositories from your computer"));
- }
}
void selectDefault()
@@ -2183,7 +2191,7 @@ void ComponentSelectionPage::entering()
QT_TR_NOOP("Please select the components you want to update."),
QT_TR_NOOP("Please select the components you want to install."),
QT_TR_NOOP("Please select the components you want to uninstall."),
- QT_TR_NOOP("Select the components to install. Deselect installed components to uninstall them.")
+ QT_TR_NOOP("Select the components to install. Deselect installed components to uninstall them. Any components already installed will not be updated.")
};
int index = 0;
diff --git a/src/libs/installer/packagemanagergui.h b/src/libs/installer/packagemanagergui.h
index fc7440647..238e22a62 100644
--- a/src/libs/installer/packagemanagergui.h
+++ b/src/libs/installer/packagemanagergui.h
@@ -224,6 +224,7 @@ public Q_SLOTS:
void onCoreNetworkSettingsChanged();
void setMessage(const QString &msg);
void onProgressChanged(int progress);
+ void setTotalProgress(int totalProgress);
void setErrorMessage(const QString &error);
Q_SIGNALS:
diff --git a/src/libs/installer/productkeycheck.cpp b/src/libs/installer/productkeycheck.cpp
index 4a8ce4677..c1dfe83d6 100644
--- a/src/libs/installer/productkeycheck.cpp
+++ b/src/libs/installer/productkeycheck.cpp
@@ -101,3 +101,8 @@ QList<int> ProductKeyCheck::registeredPages() const
{
return QList<int>();
}
+
+bool ProductKeyCheck::hasValidLicense() const
+{
+ return true;
+}
diff --git a/src/libs/installer/productkeycheck.h b/src/libs/installer/productkeycheck.h
index 221fdc7ef..b7e8c6d52 100644
--- a/src/libs/installer/productkeycheck.h
+++ b/src/libs/installer/productkeycheck.h
@@ -66,6 +66,7 @@ public:
bool isValidPackage(const QString &packageName) const;
QList<int> registeredPages() const;
+ bool hasValidLicense() const;
private:
ProductKeyCheck();
diff --git a/src/libs/kdtools/job.cpp b/src/libs/kdtools/job.cpp
index 7e36c295c..426aa1198 100644
--- a/src/libs/kdtools/job.cpp
+++ b/src/libs/kdtools/job.cpp
@@ -199,10 +199,8 @@ quint64 Job::processedAmount() const
void Job::setTotalAmount(quint64 amount)
{
- if (d->totalAmount == amount)
- return;
d->totalAmount = amount;
- emit progress(this, d->processedAmount, d->totalAmount);
+ emit totalProgress(d->totalAmount);
}
/*!
diff --git a/src/libs/kdtools/job.h b/src/libs/kdtools/job.h
index 0fe496943..200650259 100644
--- a/src/libs/kdtools/job.h
+++ b/src/libs/kdtools/job.h
@@ -86,6 +86,7 @@ Q_SIGNALS:
void infoMessage(Job *job, const QString &message);
void progress(Job *job, quint64 processed, quint64 total);
+ void totalProgress(quint64 total);
protected:
virtual void doStart() = 0;