Quantum GIS API Documentation
1.7.4
|
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 /* $Id$ */ 00022 00023 #include <qgsnetworkaccessmanager.h> 00024 #include <qgslogger.h> 00025 00026 #include <QUrl> 00027 00028 #if QT_VERSION >= 0x40500 00029 class QgsNetworkProxyFactory : public QNetworkProxyFactory 00030 { 00031 public: 00032 QgsNetworkProxyFactory() {} 00033 virtual ~QgsNetworkProxyFactory() {} 00034 00035 virtual QList<QNetworkProxy> queryProxy( const QNetworkProxyQuery & query = QNetworkProxyQuery() ) 00036 { 00037 QgsNetworkAccessManager *nam = QgsNetworkAccessManager::instance(); 00038 00039 // iterate proxies factories and take first non empty list 00040 foreach( QNetworkProxyFactory *f, nam->proxyFactories() ) 00041 { 00042 QList<QNetworkProxy> proxies = f->queryProxy( query ); 00043 if ( proxies.size() > 0 ) 00044 return proxies; 00045 } 00046 00047 // no proxies from the proxy factor list check for excludes 00048 if ( query.queryType() != QNetworkProxyQuery::UrlRequest ) 00049 return QList<QNetworkProxy>() << nam->fallbackProxy(); 00050 00051 QString url = query.url().toString(); 00052 00053 foreach( QString exclude, nam->excludeList() ) 00054 { 00055 if ( url.startsWith( exclude ) ) 00056 { 00057 QgsDebugMsg( QString( "using default proxy for %1 [exclude %2]" ).arg( url ).arg( exclude ) ); 00058 return QList<QNetworkProxy>() << QNetworkProxy(); 00059 } 00060 } 00061 00062 QgsDebugMsg( QString( "using user proxy for %1" ).arg( url ) ); 00063 return QList<QNetworkProxy>() << nam->fallbackProxy(); 00064 } 00065 }; 00066 #endif 00067 00068 QgsNetworkAccessManager *QgsNetworkAccessManager::smNAM = 0; 00069 00070 QgsNetworkAccessManager *QgsNetworkAccessManager::instance() 00071 { 00072 if ( smNAM ) 00073 return smNAM; 00074 00075 smNAM = new QgsNetworkAccessManager(); 00076 00077 return smNAM; 00078 } 00079 00080 QgsNetworkAccessManager::QgsNetworkAccessManager( QObject *parent ) 00081 : QNetworkAccessManager( parent ) 00082 { 00083 #if QT_VERSION >= 0x40500 00084 setProxyFactory( new QgsNetworkProxyFactory() ); 00085 #endif 00086 } 00087 00088 QgsNetworkAccessManager::~QgsNetworkAccessManager() 00089 { 00090 } 00091 00092 #if QT_VERSION >= 0x40500 00093 void QgsNetworkAccessManager::insertProxyFactory( QNetworkProxyFactory *factory ) 00094 { 00095 mProxyFactories.insert( 0, factory ); 00096 } 00097 00098 void QgsNetworkAccessManager::removeProxyFactory( QNetworkProxyFactory *factory ) 00099 { 00100 mProxyFactories.removeAll( factory ); 00101 } 00102 00103 const QList<QNetworkProxyFactory *> QgsNetworkAccessManager::proxyFactories() const 00104 { 00105 return mProxyFactories; 00106 } 00107 #endif 00108 00109 const QStringList &QgsNetworkAccessManager::excludeList() const 00110 { 00111 return mExcludedURLs; 00112 } 00113 00114 const QNetworkProxy &QgsNetworkAccessManager::fallbackProxy() const 00115 { 00116 return mFallbackProxy; 00117 } 00118 00119 void QgsNetworkAccessManager::setFallbackProxyAndExcludes( const QNetworkProxy &proxy, const QStringList &excludes ) 00120 { 00121 mFallbackProxy = proxy; 00122 mExcludedURLs = excludes; 00123 } 00124 00125 QNetworkReply *QgsNetworkAccessManager::createRequest( QNetworkAccessManager::Operation op, const QNetworkRequest &req, QIODevice *outgoingData ) 00126 { 00127 emit requestAboutToBeCreated( op, req, outgoingData ); 00128 QNetworkReply *reply = QNetworkAccessManager::createRequest( op, req, outgoingData ); 00129 emit requestCreated( reply ); 00130 return reply; 00131 }