diff options
author | kh1 <karsten.heimrich@nokia.com> | 2012-02-15 15:23:52 +0100 |
---|---|---|
committer | Karsten Heimrich <karsten.heimrich@nokia.com> | 2012-02-15 15:56:30 +0100 |
commit | 53b0a241f369d92daf1be679fa05568c88f8b0f0 (patch) | |
tree | f7d9b5cc322285fb01d6b61da645505af0abfcb7 /installerbuilder | |
parent | 0be49ce19440387132b3a922c74748a9cfdc176a (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.cpp | 147 | ||||
-rw-r--r-- | installerbuilder/installerbase/settingsdialog.h | 39 | ||||
-rw-r--r-- | installerbuilder/installerbase/settingsdialog.ui | 9 |
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> |