summaryrefslogtreecommitdiffstats
path: root/installerbuilder
diff options
context:
space:
mode:
authorkh1 <karsten.heimrich@nokia.com>2012-02-15 15:23:52 +0100
committerKarsten Heimrich <karsten.heimrich@nokia.com>2012-02-15 15:56:30 +0100
commit53b0a241f369d92daf1be679fa05568c88f8b0f0 (patch)
treef7d9b5cc322285fb01d6b61da645505af0abfcb7 /installerbuilder
parent0be49ce19440387132b3a922c74748a9cfdc176a (diff)
Implement testing single repositories.
Supersedes: - http://codereview.qt-project.org/#change,14385 - http://codereview.qt-project.org/#change,14387 Change-Id: Ib05c9e3ab0aa3ad4212c3e1e789df2e7534c393f Reviewed-by: Tim Jenssen <tim.jenssen@nokia.com>
Diffstat (limited to 'installerbuilder')
-rw-r--r--installerbuilder/installerbase/settingsdialog.cpp147
-rw-r--r--installerbuilder/installerbase/settingsdialog.h39
-rw-r--r--installerbuilder/installerbase/settingsdialog.ui9
3 files changed, 191 insertions, 4 deletions
diff --git a/installerbuilder/installerbase/settingsdialog.cpp b/installerbuilder/installerbase/settingsdialog.cpp
index 08ab8c944..861330f4e 100644
--- a/installerbuilder/installerbase/settingsdialog.cpp
+++ b/installerbuilder/installerbase/settingsdialog.cpp
@@ -33,11 +33,123 @@
#include "settingsdialog.h"
#include "ui_settingsdialog.h"
+#include <kdupdaterfiledownloader.h>
+#include <kdupdaterfiledownloaderfactory.h>
#include <packagemanagercore.h>
+#include <QtCore/QFile>
+
#include <QtGui/QItemSelectionModel>
+#include <QtGui/QMessageBox>
#include <QtGui/QTreeWidget>
+#include <QtXml/QDomDocument>
+
+
+// -- TestRepositoryJob
+
+TestRepository::TestRepository(QObject *parent)
+ : KDJob(parent)
+ , m_downloader(0)
+{
+ setTimeout(10000);
+ setAutoDelete(false);
+ setCapabilities(Cancelable);
+}
+
+TestRepository::~TestRepository()
+{
+ if (m_downloader)
+ m_downloader->deleteLater();
+}
+
+void TestRepository::setRepository(const QInstaller::Repository &repository)
+{
+ cancel();
+
+ setError(NoError);
+ setErrorString(QString());
+ m_repository = repository;
+}
+
+void TestRepository::doStart()
+{
+ if (m_downloader)
+ m_downloader->deleteLater();
+
+ const QUrl url = m_repository.url();
+ if (url.isEmpty()) {
+ emitFinishedWithError(QInstaller::InvalidUrl, tr("Empty repository URL."));
+ return;
+ }
+
+ m_downloader = KDUpdater::FileDownloaderFactory::instance().create(url.scheme(), 0, QUrl(), this);
+ if (!m_downloader) {
+ emitFinishedWithError(QInstaller::InvalidUrl, tr("URL scheme not supported: %1 (%2).")
+ .arg(url.scheme(), url.toString()));
+ return;
+ }
+
+ QAuthenticator auth;
+ auth.setUser(m_repository.username());
+ auth.setPassword(m_repository.password());
+ m_downloader->setAuthenticator(auth);
+
+ connect(m_downloader, SIGNAL(downloadCompleted()), this, SLOT(downloadCompleted()));
+ connect(m_downloader, SIGNAL(downloadAborted(QString)), this, SLOT(downloadAborted(QString)),
+ Qt::QueuedConnection);
+
+ m_downloader->setAutoRemoveDownloadedFile(true);
+ m_downloader->setUrl(QUrl(url.toString() + QString::fromLatin1("/Updates.xml")));
+
+ m_downloader->download();
+}
+
+void TestRepository::doCancel()
+{
+ if (m_downloader) {
+ m_downloader->cancelDownload();
+ emitFinishedWithError(KDJob::Canceled, m_downloader->errorString());
+ }
+}
+
+void TestRepository::downloadCompleted()
+{
+ QString errorMsg;
+ int error = QInstaller::DownloadError;
+
+ if (m_downloader->isDownloaded()) {
+ QFile file(m_downloader->downloadedFileName());
+ if (file.exists() && file.open(QIODevice::ReadOnly)) {
+ QDomDocument doc;
+ QString errorMsg;
+ if (!doc.setContent(&file, &errorMsg)) {
+ error = QInstaller::InvalidUpdatesXml;
+ errorMsg = tr("Could not parse Updates.xml! Error: %1.");
+ } else {
+ error = NoError;
+ }
+ } else {
+ errorMsg = tr("Updates.xml could not be opened for reading!");
+ }
+ } else {
+ errorMsg = tr("Updates.xml could not be found on server!");
+ }
+
+ if (error > NoError)
+ emitFinishedWithError(error, errorMsg);
+ else
+ emitFinished();
+
+ m_downloader->deleteLater();
+ m_downloader = 0;
+}
+
+void TestRepository::downloadAborted(const QString &reason)
+{
+ emitFinishedWithError(QInstaller::DownloadError, reason);
+}
+
// -- PasswordDelegate
@@ -150,7 +262,7 @@ void RepositoryItem::setData(int column, int role, const QVariant &value)
m_repo.setPassword(value.toString());
break;
case 4:
- m_repo.setUrl(value.toUrl());
+ m_repo.setUrl(QUrl::fromUserInput(value.toString()));
break;
default:
break;
@@ -230,6 +342,7 @@ SettingsDialog::SettingsDialog(QInstaller::PackageManagerCore *core, QWidget *pa
connect(m_ui->m_useTmpRepositories, SIGNAL(clicked(bool)), this, SLOT(useTmpRepositories(bool)));
connect(m_ui->m_repositoriesView, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)),
this, SLOT(currentRepositoryChanged(QTreeWidgetItem*, QTreeWidgetItem*)));
+ connect(m_ui->m_testRepository, SIGNAL(clicked()), this, SLOT(testRepository()));
useTmpRepositories(settings.hasReplacementRepos());
m_ui->m_useTmpRepositories->setChecked(settings.hasReplacementRepos());
@@ -304,6 +417,37 @@ void SettingsDialog::addRepository()
}
}
+void SettingsDialog::testRepository()
+{
+ RepositoryItem *current = dynamic_cast<RepositoryItem*> (m_ui->m_repositoriesView->currentItem());
+ if (current && !m_rootItems.contains(current)) {
+ m_ui->tabWidget->setEnabled(false);
+ m_ui->buttonBox->setEnabled(false);
+
+ m_testRepository.setRepository(current->repository());
+ m_testRepository.start();
+ m_testRepository.waitForFinished();
+
+ if (m_testRepository.error() > KDJob::NoError) {
+ QMessageBox msgBox(this);
+ msgBox.setIcon(QMessageBox::Question);
+ msgBox.setWindowModality(Qt::WindowModal);
+ msgBox.setDetailedText(m_testRepository.errorString());
+ msgBox.setText(tr("There was an error testing this repository."));
+ msgBox.setInformativeText(tr("Do you want to disable the tested repository?"));
+
+ msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
+ msgBox.setDefaultButton(QMessageBox::Yes);
+
+ if (msgBox.exec() == QMessageBox::Yes)
+ current->setData(1, Qt::CheckStateRole, Qt::Unchecked);
+ }
+
+ m_ui->tabWidget->setEnabled(true);
+ m_ui->buttonBox->setEnabled(true);
+ }
+}
+
void SettingsDialog::updatePasswords()
{
m_showPasswords = !m_showPasswords;
@@ -335,6 +479,7 @@ void SettingsDialog::currentRepositoryChanged(QTreeWidgetItem *current, QTreeWid
Q_UNUSED(previous)
if (current) {
const int index = m_rootItems.at(0)->indexOfChild(current);
+ m_ui->m_testRepository->setEnabled(!m_rootItems.contains(current));
m_ui->m_removeRepository->setEnabled(!current->data(0, Qt::UserRole).toBool());
m_ui->m_addRepository->setEnabled((current != m_rootItems.at(0)) & (index == -1));
}
diff --git a/installerbuilder/installerbase/settingsdialog.h b/installerbuilder/installerbase/settingsdialog.h
index 77ec2cac7..e69809cee 100644
--- a/installerbuilder/installerbase/settingsdialog.h
+++ b/installerbuilder/installerbase/settingsdialog.h
@@ -34,6 +34,7 @@
#define SETTINGSDIALOG_H
#include <common/repository.h>
+#include <kdjob.h>
#include <settings.h>
#include <QtGui/QDialog>
@@ -45,14 +46,46 @@ class QLocale;
class QVariant;
QT_END_NAMESPACE
-namespace Ui {
- class SettingsDialog;
+namespace KDUpdater {
+ class FileDownloader;
}
namespace QInstaller {
class PackageManagerCore;
}
+namespace Ui {
+ class SettingsDialog;
+}
+
+
+// -- TestRepositoryJob
+
+class TestRepository : public KDJob
+{
+ Q_OBJECT
+
+public:
+
+ TestRepository(QObject *parent = 0);
+ ~TestRepository();
+
+ void setRepository(const QInstaller::Repository &repository);
+
+private:
+ void doStart();
+ void doCancel();
+
+private Q_SLOTS:
+ void downloadCompleted();
+ void downloadAborted(const QString &reason);
+
+private:
+ QInstaller::Repository m_repository;
+ KDUpdater::FileDownloader *m_downloader;
+};
+
+
// -- PasswordDelegate
class PasswordDelegate : public QStyledItemDelegate
@@ -116,6 +149,7 @@ signals:
private slots:
void addRepository();
+ void testRepository();
void updatePasswords();
void removeRepository();
void useTmpRepositories(bool use);
@@ -131,6 +165,7 @@ private:
QInstaller::PackageManagerCore *m_core;
bool m_showPasswords;
+ TestRepository m_testRepository;
QList<QTreeWidgetItem*> m_rootItems;
};
diff --git a/installerbuilder/installerbase/settingsdialog.ui b/installerbuilder/installerbase/settingsdialog.ui
index ac5b61805..d3ca959a6 100644
--- a/installerbuilder/installerbase/settingsdialog.ui
+++ b/installerbuilder/installerbase/settingsdialog.ui
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>491</width>
- <height>517</height>
+ <height>443</height>
</rect>
</property>
<property name="windowTitle">
@@ -365,6 +365,13 @@
</widget>
</item>
<item>
+ <widget class="QPushButton" name="m_testRepository">
+ <property name="text">
+ <string>Test</string>
+ </property>
+ </widget>
+ </item>
+ <item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>