From 8525ec7a17f68f7b2f4d335da2e620a1ecc1720d Mon Sep 17 00:00:00 2001 From: kh1 Date: Mon, 16 Apr 2012 14:08:38 +0200 Subject: Implement https support, reuse http downloader. Fixes Task-number: QTIFW-119 Change-Id: If374603834f5dfe9e7b51f41139cd3b78ad21c61 Reviewed-by: Richard J. Moore Reviewed-by: Niels Weber Reviewed-by: Tim Jenssen --- src/libs/kdtools/kdupdaterfiledownloader.cpp | 31 +++++++++++++++++++++- src/libs/kdtools/kdupdaterfiledownloader.h | 10 ++++--- src/libs/kdtools/kdupdaterfiledownloader_p.h | 5 +++- .../kdtools/kdupdaterfiledownloaderfactory.cpp | 12 ++++++++- 4 files changed, 51 insertions(+), 7 deletions(-) (limited to 'src/libs/kdtools') diff --git a/src/libs/kdtools/kdupdaterfiledownloader.cpp b/src/libs/kdtools/kdupdaterfiledownloader.cpp index 6494d72b2..67639dda6 100644 --- a/src/libs/kdtools/kdupdaterfiledownloader.cpp +++ b/src/libs/kdtools/kdupdaterfiledownloader.cpp @@ -36,7 +36,7 @@ #include #include #include - +#include #include #include @@ -320,6 +320,11 @@ QString KDUpdater::FileDownloader::scheme() const return d->scheme; } +void KDUpdater::FileDownloader::setScheme(const QString &scheme) +{ + d->scheme = scheme; +} + void KDUpdater::FileDownloader::setAutoRemoveDownloadedFile(bool val) { d->autoRemove = val; @@ -1081,6 +1086,11 @@ KDUpdater::HttpDownloader::HttpDownloader(QObject *parent) : KDUpdater::FileDownloader(QLatin1String("http"), parent) , d(new Private(this)) { +#ifndef QT_NO_OPENSSL + // TODO: once we switch to Qt5, use QT_NO_SSL instead of QT_NO_OPENSSL + connect(&d->manager, SIGNAL(sslErrors(QNetworkReply*, QList)), + this, SLOT(onSslErrors(QNetworkReply*, QList))); +#endif connect(&d->manager, SIGNAL(authenticationRequired(QNetworkReply*, QAuthenticator*)), this, SLOT(onAuthenticationRequired(QNetworkReply*, QAuthenticator*))); } @@ -1282,3 +1292,22 @@ void KDUpdater::HttpDownloader::onAuthenticationRequired(QNetworkReply *reply, Q authenticator->setPassword(this->authenticator().password()); } } + +#ifndef QT_NO_OPENSSL +// TODO: once we switch to Qt5, use QT_NO_SSL instead of QT_NO_OPENSSL +void KDUpdater::HttpDownloader::onSslErrors(QNetworkReply* reply, const QList &errors) +{ + Q_UNUSED(reply) + + QString errorString; + foreach (const QSslError &error, errors) { + if (!errorString.isEmpty()) + errorString += QLatin1String(", "); + errorString += error.errorString(); + } + qDebug() << errorString; + + if (!d->aborted) + httpDone(true); +} +#endif diff --git a/src/libs/kdtools/kdupdaterfiledownloader.h b/src/libs/kdtools/kdupdaterfiledownloader.h index bdba0a859..67467bff4 100644 --- a/src/libs/kdtools/kdupdaterfiledownloader.h +++ b/src/libs/kdtools/kdupdaterfiledownloader.h @@ -45,20 +45,22 @@ class KDTOOLS_EXPORT FileDownloader : public QObject Q_OBJECT Q_PROPERTY(bool autoRemoveDownloadedFile READ isAutoRemoveDownloadedFile WRITE setAutoRemoveDownloadedFile) Q_PROPERTY(QUrl url READ url WRITE setUrl) - Q_PROPERTY(QString scheme READ scheme) + Q_PROPERTY(QString scheme READ scheme WRITE setScheme) public: explicit FileDownloader(const QString &scheme, QObject *parent = 0); ~FileDownloader(); - void setUrl(const QUrl &url); QUrl url() const; + void setUrl(const QUrl &url); - void setSha1Sum(const QByteArray &sha1); QByteArray sha1Sum() const; + void setSha1Sum(const QByteArray &sha1); - QString errorString() const; QString scheme() const; + void setScheme(const QString &scheme); + + QString errorString() const; virtual bool canDownload() const = 0; virtual bool isDownloaded() const = 0; diff --git a/src/libs/kdtools/kdupdaterfiledownloader_p.h b/src/libs/kdtools/kdupdaterfiledownloader_p.h index 127c3f5d9..81b3c2c98 100644 --- a/src/libs/kdtools/kdupdaterfiledownloader_p.h +++ b/src/libs/kdtools/kdupdaterfiledownloader_p.h @@ -195,7 +195,10 @@ private Q_SLOTS: void httpDone(bool error); void httpReqFinished(); void onAuthenticationRequired(QNetworkReply *reply, QAuthenticator *authenticator); - +#ifndef QT_NO_OPENSSL + // TODO: once we switch to Qt5, use QT_NO_SSL instead of QT_NO_OPENSSL + void onSslErrors(QNetworkReply* reply, const QList &errors); +#endif private: void startDownload(const QUrl &url); diff --git a/src/libs/kdtools/kdupdaterfiledownloaderfactory.cpp b/src/libs/kdtools/kdupdaterfiledownloaderfactory.cpp index 8be508cc7..1862a27e5 100644 --- a/src/libs/kdtools/kdupdaterfiledownloaderfactory.cpp +++ b/src/libs/kdtools/kdupdaterfiledownloaderfactory.cpp @@ -23,6 +23,8 @@ #include "kdupdaterfiledownloaderfactory.h" #include "kdupdaterfiledownloader_p.h" +#include + /*! \internal \ingroup kdupdater @@ -64,6 +66,13 @@ FileDownloaderFactory::FileDownloaderFactory() registerFileDownloader(QLatin1String("ftp")); registerFileDownloader(QLatin1String("http")); registerFileDownloader(QLatin1String("resource")); + +#ifndef QT_NO_OPENSSL + // TODO: once we switch to Qt5, use QT_NO_SSL instead of QT_NO_OPENSSL + if (QSslSocket::supportsSsl()) + registerFileDownloader(QLatin1String("https")); +#endif + d->m_followRedirects = false; } @@ -98,6 +107,7 @@ FileDownloader *FileDownloaderFactory::create(const QString &scheme, QObject *pa FileDownloader *downloader = KDGenericFactory::create(scheme); if (downloader != 0) { downloader->setParent(parent); + downloader->setScheme(scheme); downloader->setFollowRedirects(d->m_followRedirects); if (d->m_factory) downloader->setProxyFactory(d->m_factory->clone()); @@ -108,5 +118,5 @@ FileDownloader *FileDownloaderFactory::create(const QString &scheme, QObject *pa /*! KDUpdater::FileDownloaderFactory::registerFileDownlooader Registers a new file downloader with the factory. If there is already a downloader with the same scheme, - the downloader is replaced. The ownership of the downloader is transfered to the factory. + the downloader is replaced. The ownership of the downloader is transferred to the factory. */ -- cgit v1.2.3