From 159098719b8e8f40d1bd663c61bdc51f883c645f Mon Sep 17 00:00:00 2001 From: "Jonas M. Gastal" Date: Thu, 22 Dec 2011 13:53:38 -0200 Subject: Using proper virtual functions instead of Q_INVOKABLE tricks. This mantains BC between version compiled with and without OPENSSL, which was the reason for the use of "runtime virtuals". Using proper virtuals should make code clearer. Change-Id: I24f141ebaab68c000c2d602b54addbae1679a424 Reviewed-by: Thiago Macieira --- src/network/access/qnetworkreply.cpp | 69 ++++++++++++++++++---------- src/network/access/qnetworkreply.h | 4 ++ src/network/access/qnetworkreplyhttpimpl.cpp | 4 +- src/network/access/qnetworkreplyhttpimpl_p.h | 17 +++---- src/network/access/qnetworkreplyimpl.cpp | 6 +-- src/network/access/qnetworkreplyimpl_p.h | 15 +++--- 6 files changed, 68 insertions(+), 47 deletions(-) diff --git a/src/network/access/qnetworkreply.cpp b/src/network/access/qnetworkreply.cpp index c38414ea44..db62f2935a 100644 --- a/src/network/access/qnetworkreply.cpp +++ b/src/network/access/qnetworkreply.cpp @@ -586,13 +586,7 @@ QVariant QNetworkReply::attribute(QNetworkRequest::Attribute code) const QSslConfiguration QNetworkReply::sslConfiguration() const { QSslConfiguration config; - - // determine if we support this extension - int id = metaObject()->indexOfMethod("sslConfigurationImplementation()"); - if (id != -1) { - void *arr[] = { &config, 0 }; - const_cast(this)->qt_metacall(QMetaObject::InvokeMetaMethod, id, arr); - } + sslConfigurationImplementation(config); return config; } @@ -602,15 +596,7 @@ QSslConfiguration QNetworkReply::sslConfiguration() const */ void QNetworkReply::setSslConfiguration(const QSslConfiguration &config) { - if (config.isNull()) - return; - - int id = metaObject()->indexOfMethod("setSslConfigurationImplementation(QSslConfiguration)"); - if (id != -1) { - QSslConfiguration copy(config); - void *arr[] = { 0, © }; - qt_metacall(QMetaObject::InvokeMetaMethod, id, arr); - } + setSslConfigurationImplementation(config); } /*! @@ -635,17 +621,52 @@ void QNetworkReply::setSslConfiguration(const QSslConfiguration &config) */ void QNetworkReply::ignoreSslErrors(const QList &errors) { - // do this cryptic trick, because we could not add a virtual method to this class later on - // since that breaks binary compatibility - int id = metaObject()->indexOfMethod("ignoreSslErrorsImplementation(QList)"); - if (id != -1) { - QList copy(errors); - void *arr[] = { 0, © }; - qt_metacall(QMetaObject::InvokeMetaMethod, id, arr); - } + ignoreSslErrorsImplementation(errors); } #endif +/*! + \fn void QNetworkReply::sslConfigurationImplementation(QSslConfiguration &configuration) const + \since 5.0 + + This virtual method is provided to enable overriding the behavior of + sslConfiguration(). sslConfiguration() is a public wrapper for this method. + The configuration will be returned in \a configuration. + + \sa sslConfiguration() +*/ +void QNetworkReply::sslConfigurationImplementation(QSslConfiguration &) const +{ +} + +/*! + \fn void QNetworkReply::setSslConfigurationImplementation(const QSslConfiguration &configuration) + \since 5.0 + + This virtual method is provided to enable overriding the behavior of + setSslConfiguration(). setSslConfiguration() is a public wrapper for this method. + If you override this method use \a configuration to set the SSL configuration. + + \sa sslConfigurationImplementation(), setSslConfiguration() +*/ +void QNetworkReply::setSslConfigurationImplementation(const QSslConfiguration &) +{ +} + +/*! + \fn void QNetworkReply::ignoreSslErrorsImplementation(const QList &errors) + \since 5.0 + + This virtual method is provided to enable overriding the behavior of + ignoreSslErrors(). ignoreSslErrors() is a public wrapper for this method. + \a errors contains the errors the user wishes ignored. + + \sa ignoreSslErrors() +*/ +void QNetworkReply::ignoreSslErrorsImplementation(const QList &) +{ +} + /*! If this function is called, SSL errors related to network connection will be ignored, including certificate validation diff --git a/src/network/access/qnetworkreply.h b/src/network/access/qnetworkreply.h index dadbe4c958..492336bbf6 100644 --- a/src/network/access/qnetworkreply.h +++ b/src/network/access/qnetworkreply.h @@ -169,6 +169,10 @@ protected: void setRawHeader(const QByteArray &headerName, const QByteArray &value); void setAttribute(QNetworkRequest::Attribute code, const QVariant &value); + virtual void sslConfigurationImplementation(QSslConfiguration &) const; + virtual void setSslConfigurationImplementation(const QSslConfiguration &); + virtual void ignoreSslErrorsImplementation(const QList &); + private: Q_DECLARE_PRIVATE(QNetworkReply) }; diff --git a/src/network/access/qnetworkreplyhttpimpl.cpp b/src/network/access/qnetworkreplyhttpimpl.cpp index 284b8c64dc..a8b0a3e514 100644 --- a/src/network/access/qnetworkreplyhttpimpl.cpp +++ b/src/network/access/qnetworkreplyhttpimpl.cpp @@ -410,10 +410,10 @@ void QNetworkReplyHttpImpl::setSslConfigurationImplementation(const QSslConfigur Q_UNUSED(newconfig); } -QSslConfiguration QNetworkReplyHttpImpl::sslConfigurationImplementation() const +void QNetworkReplyHttpImpl::sslConfigurationImplementation(QSslConfiguration &configuration) const { Q_D(const QNetworkReplyHttpImpl); - return d->sslConfiguration; + configuration = d->sslConfiguration; } #endif diff --git a/src/network/access/qnetworkreplyhttpimpl_p.h b/src/network/access/qnetworkreplyhttpimpl_p.h index 346cc6464c..6c0467add2 100644 --- a/src/network/access/qnetworkreplyhttpimpl_p.h +++ b/src/network/access/qnetworkreplyhttpimpl_p.h @@ -94,16 +94,6 @@ public: void setReadBufferSize(qint64 size); bool canReadLine () const; -#ifndef QT_NO_OPENSSL - void ignoreSslErrors(); - // ### Qt5 Add proper virtual - Q_INVOKABLE void ignoreSslErrorsImplementation(const QList &errors); - // ### Qt5 Add proper virtual - Q_INVOKABLE void setSslConfigurationImplementation(const QSslConfiguration &configuration); - // ### Qt5 Add proper virtual - Q_INVOKABLE QSslConfiguration sslConfigurationImplementation() const; -#endif - Q_DECLARE_PRIVATE(QNetworkReplyHttpImpl) Q_PRIVATE_SLOT(d_func(), void _q_startOperation()) Q_PRIVATE_SLOT(d_func(), void _q_cacheLoadReadyRead()) @@ -135,6 +125,13 @@ public: Q_PRIVATE_SLOT(d_func(), void emitReplyUploadProgress(qint64, qint64)) +#ifndef QT_NO_OPENSSL +protected: + void ignoreSslErrors(); + void ignoreSslErrorsImplementation(const QList &errors); + void setSslConfigurationImplementation(const QSslConfiguration &configuration); + void sslConfigurationImplementation(QSslConfiguration &configuration) const; +#endif signals: // To HTTP thread: diff --git a/src/network/access/qnetworkreplyimpl.cpp b/src/network/access/qnetworkreplyimpl.cpp index 8513207ef7..14b4f8b96d 100644 --- a/src/network/access/qnetworkreplyimpl.cpp +++ b/src/network/access/qnetworkreplyimpl.cpp @@ -930,13 +930,11 @@ void QNetworkReplyImpl::setReadBufferSize(qint64 size) } #ifndef QT_NO_OPENSSL -QSslConfiguration QNetworkReplyImpl::sslConfigurationImplementation() const +void QNetworkReplyImpl::sslConfigurationImplementation(QSslConfiguration &configuration) const { Q_D(const QNetworkReplyImpl); - QSslConfiguration config; if (d->backend) - d->backend->fetchSslConfiguration(config); - return config; + d->backend->fetchSslConfiguration(configuration); } void QNetworkReplyImpl::setSslConfigurationImplementation(const QSslConfiguration &config) diff --git a/src/network/access/qnetworkreplyimpl_p.h b/src/network/access/qnetworkreplyimpl_p.h index aa3af3864b..0b7664acc6 100644 --- a/src/network/access/qnetworkreplyimpl_p.h +++ b/src/network/access/qnetworkreplyimpl_p.h @@ -87,13 +87,6 @@ public: virtual qint64 readData(char *data, qint64 maxlen); virtual bool event(QEvent *); -#ifndef QT_NO_OPENSSL - Q_INVOKABLE QSslConfiguration sslConfigurationImplementation() const; - Q_INVOKABLE void setSslConfigurationImplementation(const QSslConfiguration &configuration); - virtual void ignoreSslErrors(); - Q_INVOKABLE virtual void ignoreSslErrorsImplementation(const QList &errors); -#endif - Q_DECLARE_PRIVATE(QNetworkReplyImpl) Q_PRIVATE_SLOT(d_func(), void _q_startOperation()) Q_PRIVATE_SLOT(d_func(), void _q_copyReadyRead()) @@ -104,6 +97,14 @@ public: Q_PRIVATE_SLOT(d_func(), void _q_networkSessionConnected()) Q_PRIVATE_SLOT(d_func(), void _q_networkSessionFailed()) #endif + +#ifndef QT_NO_OPENSSL +protected: + void sslConfigurationImplementation(QSslConfiguration &configuration) const; + void setSslConfigurationImplementation(const QSslConfiguration &configuration); + virtual void ignoreSslErrors(); + virtual void ignoreSslErrorsImplementation(const QList &errors); +#endif }; class QNetworkReplyImplPrivate: public QNetworkReplyPrivate -- cgit v1.2.3