Quantum GIS API Documentation  1.7.4
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 /*  $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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines