Quantum GIS API Documentation
1.8
|
00001 /*************************************************************************** 00002 qgsnetworkaccessmanager.cpp 00003 This class implements a QNetworkManager with the ability to chain in 00004 own proxy factories. 00005 00006 ------------------- 00007 begin : 2010-05-08 00008 copyright : (C) 2010 by Juergen E. Fischer 00009 email : jef at norbit dot de 00010 00011 ***************************************************************************/ 00012 00013 /*************************************************************************** 00014 * * 00015 * This program is free software; you can redistribute it and/or modify * 00016 * it under the terms of the GNU General Public License as published by * 00017 * the Free Software Foundation; either version 2 of the License, or * 00018 * (at your option) any later version. * 00019 * * 00020 ***************************************************************************/ 00021 00022 #include <qgsnetworkaccessmanager.h> 00023 #include <qgslogger.h> 00024 00025 #include <QUrl> 00026 00027 #if QT_VERSION >= 0x40500 00028 class QgsNetworkProxyFactory : public QNetworkProxyFactory 00029 { 00030 public: 00031 QgsNetworkProxyFactory() {} 00032 virtual ~QgsNetworkProxyFactory() {} 00033 00034 virtual QList<QNetworkProxy> queryProxy( const QNetworkProxyQuery & query = QNetworkProxyQuery() ) 00035 { 00036 QgsNetworkAccessManager *nam = QgsNetworkAccessManager::instance(); 00037 00038 // iterate proxies factories and take first non empty list 00039 foreach( QNetworkProxyFactory *f, nam->proxyFactories() ) 00040 { 00041 QList<QNetworkProxy> proxies = f->queryProxy( query ); 00042 if ( proxies.size() > 0 ) 00043 return proxies; 00044 } 00045 00046 // no proxies from the proxy factor list check for excludes 00047 if ( query.queryType() != QNetworkProxyQuery::UrlRequest ) 00048 return QList<QNetworkProxy>() << nam->fallbackProxy(); 00049 00050 QString url = query.url().toString(); 00051 00052 foreach( QString exclude, nam->excludeList() ) 00053 { 00054 if ( url.startsWith( exclude ) ) 00055 { 00056 QgsDebugMsg( QString( "using default proxy for %1 [exclude %2]" ).arg( url ).arg( exclude ) ); 00057 return QList<QNetworkProxy>() << QNetworkProxy(); 00058 } 00059 } 00060 00061 QgsDebugMsg( QString( "using user proxy for %1" ).arg( url ) ); 00062 return QList<QNetworkProxy>() << nam->fallbackProxy(); 00063 } 00064 }; 00065 #endif 00066 00067 QgsNetworkAccessManager *QgsNetworkAccessManager::smNAM = 0; 00068 00069 QgsNetworkAccessManager *QgsNetworkAccessManager::instance() 00070 { 00071 if ( smNAM ) 00072 return smNAM; 00073 00074 smNAM = new QgsNetworkAccessManager(); 00075 00076 return smNAM; 00077 } 00078 00079 QgsNetworkAccessManager::QgsNetworkAccessManager( QObject *parent ) 00080 : QNetworkAccessManager( parent ) 00081 { 00082 #if QT_VERSION >= 0x40500 00083 setProxyFactory( new QgsNetworkProxyFactory() ); 00084 #endif 00085 } 00086 00087 QgsNetworkAccessManager::~QgsNetworkAccessManager() 00088 { 00089 } 00090 00091 #if QT_VERSION >= 0x40500 00092 void QgsNetworkAccessManager::insertProxyFactory( QNetworkProxyFactory *factory ) 00093 { 00094 mProxyFactories.insert( 0, factory ); 00095 } 00096 00097 void QgsNetworkAccessManager::removeProxyFactory( QNetworkProxyFactory *factory ) 00098 { 00099 mProxyFactories.removeAll( factory ); 00100 } 00101 00102 const QList<QNetworkProxyFactory *> QgsNetworkAccessManager::proxyFactories() const 00103 { 00104 return mProxyFactories; 00105 } 00106 #endif 00107 00108 const QStringList &QgsNetworkAccessManager::excludeList() const 00109 { 00110 return mExcludedURLs; 00111 } 00112 00113 const QNetworkProxy &QgsNetworkAccessManager::fallbackProxy() const 00114 { 00115 return mFallbackProxy; 00116 } 00117 00118 void QgsNetworkAccessManager::setFallbackProxyAndExcludes( const QNetworkProxy &proxy, const QStringList &excludes ) 00119 { 00120 mFallbackProxy = proxy; 00121 mExcludedURLs = excludes; 00122 } 00123 00124 QNetworkReply *QgsNetworkAccessManager::createRequest( QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *outgoingData ) 00125 { 00126 emit requestAboutToBeCreated( op, req, outgoingData ); 00127 QNetworkReply *reply = QNetworkAccessManager::createRequest( op, req, outgoingData ); 00128 emit requestCreated( reply ); 00129 return reply; 00130 }