Quantum GIS API Documentation  1.8
src/core/qgsnetworkaccessmanager.cpp
Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines