[QGIS Commit] r15747 - in trunk/qgis: python/core src/app src/core src/core/raster src/providers/wms

svn_qgis at osgeo.org svn_qgis at osgeo.org
Sun Apr 17 09:58:59 EDT 2011


Author: jef
Date: 2011-04-17 06:58:59 -0700 (Sun, 17 Apr 2011)
New Revision: 15747

Modified:
   trunk/qgis/python/core/qgsdataprovider.sip
   trunk/qgis/src/app/qgisapp.cpp
   trunk/qgis/src/app/qgisapp.h
   trunk/qgis/src/app/qgisappinterface.cpp
   trunk/qgis/src/app/qgswmssourceselect.cpp
   trunk/qgis/src/app/qgswmssourceselect.h
   trunk/qgis/src/core/qgsdataprovider.h
   trunk/qgis/src/core/raster/qgsrasterlayer.cpp
   trunk/qgis/src/core/raster/qgsrasterlayer.h
   trunk/qgis/src/providers/wms/qgswmsprovider.cpp
   trunk/qgis/src/providers/wms/qgswmsprovider.h
Log:
fix #7: GetCapabilities no done twice anymore

Modified: trunk/qgis/python/core/qgsdataprovider.sip
===================================================================
--- trunk/qgis/python/core/qgsdataprovider.sip	2011-04-17 13:40:25 UTC (rev 15746)
+++ trunk/qgis/python/core/qgsdataprovider.sip	2011-04-17 13:58:59 UTC (rev 15747)
@@ -60,6 +60,12 @@
       */
       virtual QgsRectangle extent() = 0;
 
+      /**
+       * Set the extent of the layer
+       * @param extent the layer extent
+       * @note added in 1.8
+       */
+      virtual void setExtent( QgsRectangle extent );
       
       /**
        * Returns true if this is a valid layer. It is up to individual providers

Modified: trunk/qgis/src/app/qgisapp.cpp
===================================================================
--- trunk/qgis/src/app/qgisapp.cpp	2011-04-17 13:40:25 UTC (rev 15746)
+++ trunk/qgis/src/app/qgisapp.cpp	2011-04-17 13:58:59 UTC (rev 15747)
@@ -6278,7 +6278,8 @@
   QStringList const & layers,
   QStringList const & styles,
   QString const &format,
-  QString const &crs )
+  QString const &crs,
+  QgsRectangle extent )
 {
   QgsDebugMsg( "about to get library for " + providerKey );
 
@@ -6307,7 +6308,7 @@
                + " and CRS of " + crs );
 
   // TODO: Remove the 0 when the raster layer becomes a full provider gateway.
-  layer = new QgsRasterLayer( 0, rasterLayerPath, baseName, providerKey, layers, styles, format, crs );
+  layer = new QgsRasterLayer( 0, rasterLayerPath, baseName, providerKey, layers, styles, format, crs, extent );
 
   QgsDebugMsg( "Constructed new layer." );
 

Modified: trunk/qgis/src/app/qgisapp.h
===================================================================
--- trunk/qgis/src/app/qgisapp.h	2011-04-17 13:40:25 UTC (rev 15746)
+++ trunk/qgis/src/app/qgisapp.h	2011-04-17 13:58:59 UTC (rev 15747)
@@ -123,7 +123,8 @@
                                     QStringList const & layers,
                                     QStringList const & styles,
                                     QString const & format,
-                                    QString const & crs );
+                                    QString const & crs,
+                                    QgsRectangle extent );
 
     /** open a raster layer for the given file
       @returns false if unable to open a raster layer for rasterFile

Modified: trunk/qgis/src/app/qgisappinterface.cpp
===================================================================
--- trunk/qgis/src/app/qgisappinterface.cpp	2011-04-17 13:40:25 UTC (rev 15746)
+++ trunk/qgis/src/app/qgisappinterface.cpp	2011-04-17 13:58:59 UTC (rev 15747)
@@ -111,7 +111,7 @@
 QgsRasterLayer* QgisAppInterface::addRasterLayer( const QString& url, const QString& baseName, const QString& providerKey,
     const QStringList& layers, const QStringList& styles, const QString& format, const QString& crs )
 {
-  return qgis->addRasterLayer( url, baseName, providerKey, layers, styles, format, crs );
+  return qgis->addRasterLayer( url, baseName, providerKey, layers, styles, format, crs, QgsRectangle() );
 }
 
 

Modified: trunk/qgis/src/app/qgswmssourceselect.cpp
===================================================================
--- trunk/qgis/src/app/qgswmssourceselect.cpp	2011-04-17 13:40:25 UTC (rev 15746)
+++ trunk/qgis/src/app/qgswmssourceselect.cpp	2011-04-17 13:58:59 UTC (rev 15747)
@@ -53,6 +53,7 @@
 
 QgsWMSSourceSelect::QgsWMSSourceSelect( QWidget * parent, Qt::WFlags fl )
     : QDialog( parent, fl )
+    , mWmsProvider( 0 )
     , mCurrentTileset( 0 )
 {
   setupUi( this );
@@ -163,9 +164,10 @@
   QSettings settings;
   QgsDebugMsg( "saving geometry" );
   settings.setValue( "/Windows/WMSSourceSelect/geometry", saveGeometry() );
+
+  delete mWmsProvider;
 }
 
-
 void QgsWMSSourceSelect::populateConnectionList()
 {
   QSettings settings;
@@ -281,12 +283,12 @@
   return item;
 }
 
-bool QgsWMSSourceSelect::populateLayerList( QgsWmsProvider *wmsProvider )
+bool QgsWMSSourceSelect::populateLayerList()
 {
   mCRSs.clear();
 
   QVector<QgsWmsLayerProperty> layers;
-  if ( !wmsProvider->supportedLayers( layers ) )
+  if ( !mWmsProvider->supportedLayers( layers ) )
     return false;
 
   foreach( QAbstractButton *b, mImageFormatGroup->buttons() )
@@ -294,7 +296,7 @@
     b->setHidden( true );
   }
 
-  foreach( QString encoding, wmsProvider->supportedImageEncodings() )
+  foreach( QString encoding, mWmsProvider->supportedImageEncodings() )
   {
     int id = mMimeMap.value( encoding, -1 );
     if ( id < 0 )
@@ -311,7 +313,7 @@
   QMap<int, QgsNumericSortTreeWidgetItem *> items;
   QMap<int, int> layerParents;
   QMap<int, QStringList> layerParentNames;
-  wmsProvider->layerParents( layerParents, layerParentNames );
+  mWmsProvider->layerParents( layerParents, layerParentNames );
 
   lstLayers->clear();
   lstLayers->setSortingEnabled( true );
@@ -348,10 +350,10 @@
   lstLayers->sortByColumn( 0, Qt::AscendingOrder );
 
   QVector<QgsWmsTileSetProfile> tilesets;
-  wmsProvider->supportedTileSets( tilesets );
+  mWmsProvider->supportedTileSets( tilesets );
 
   tabServers->setTabEnabled( tabServers->indexOf( tabTilesets ), tilesets.size() > 0 );
-  if( tabServers->isTabEnabled( tabServers->indexOf( tabTilesets ) ) )
+  if ( tabServers->isTabEnabled( tabServers->indexOf( tabTilesets ) ) )
     tabServers->setCurrentWidget( tabTilesets );
 
   if ( tilesets.size() > 0 )
@@ -472,24 +474,23 @@
   // load the server data provider plugin
   QgsProviderRegistry * pReg = QgsProviderRegistry::instance();
 
-  QgsWmsProvider *wmsProvider =
-    ( QgsWmsProvider* ) pReg->getProvider( "wms", mConnectionInfo );
+  delete mWmsProvider;
 
-  if ( wmsProvider )
+  mWmsProvider = static_cast< QgsWmsProvider * >( pReg->getProvider( "wms", mConnectionInfo ) );
+
+  if ( mWmsProvider )
   {
     QApplication::setOverrideCursor( Qt::WaitCursor );
 
-    connect( wmsProvider, SIGNAL( statusChanged( QString ) ), this, SLOT( showStatusMessage( QString ) ) );
+    connect( mWmsProvider, SIGNAL( statusChanged( QString ) ), this, SLOT( showStatusMessage( QString ) ) );
 
     // WMS Provider all set up; let's get some layers
 
-    if ( !populateLayerList( wmsProvider ) )
+    if ( !populateLayerList() )
     {
-      showError( wmsProvider );
+      showError();
     }
 
-    delete wmsProvider;
-
     QApplication::restoreOverrideCursor();
   }
   else
@@ -540,9 +541,14 @@
     }
   }
 
+  // set the layers to retrieve the correct extent
+  mWmsProvider->addLayers( layers, styles );
+  mWmsProvider->setImageEncoding( format );
+  mWmsProvider->setImageCrs( crs );
+
   QgisApp::instance()->addRasterLayer( connInfo,
                                        leLayerName->text().isEmpty() ? layers.join( "/" ) : leLayerName->text(),
-                                       "wms", layers, styles, format, crs );
+                                       "wms", layers, styles, format, crs, mWmsProvider->extent() );
 }
 
 void QgsWMSSourceSelect::enableLayersForCrs( QTreeWidgetItem *item )
@@ -995,18 +1001,18 @@
 }
 
 
-void QgsWMSSourceSelect::showError( QgsWmsProvider * wms )
+void QgsWMSSourceSelect::showError()
 {
   QgsMessageViewer * mv = new QgsMessageViewer( this );
-  mv->setWindowTitle( wms->lastErrorTitle() );
+  mv->setWindowTitle( mWmsProvider->lastErrorTitle() );
 
-  if ( wms->lastErrorFormat() == "text/html" )
+  if ( mWmsProvider->lastErrorFormat() == "text/html" )
   {
-    mv->setMessageAsHtml( wms->lastError() );
+    mv->setMessageAsHtml( mWmsProvider->lastError() );
   }
   else
   {
-    mv->setMessageAsPlainText( tr( "Could not understand the response.  The %1 provider said:\n%2" ).arg( wms->name() ).arg( wms->lastError() ) );
+    mv->setMessageAsPlainText( tr( "Could not understand the response.  The %1 provider said:\n%2" ).arg( mWmsProvider->name() ).arg( mWmsProvider->lastError() ) );
   }
   mv->showMessage( true ); // Is deleted when closed
 }

Modified: trunk/qgis/src/app/qgswmssourceselect.h
===================================================================
--- trunk/qgis/src/app/qgswmssourceselect.h	2011-04-17 13:40:25 UTC (rev 15746)
+++ trunk/qgis/src/app/qgswmssourceselect.h	2011-04-17 13:58:59 UTC (rev 15747)
@@ -21,6 +21,7 @@
 #include "ui_qgswmssourceselectbase.h"
 #include "qgisgui.h"
 #include "qgscontexthelp.h"
+#include "qgsrectangle.h"
 
 #include <QStringList>
 #include <QPushButton>
@@ -84,7 +85,7 @@
     void showStatusMessage( QString const &theMessage );
 
     //! show whatever error is exposed by the QgsWmsProvider.
-    void showError( QgsWmsProvider *wms );
+    void showError();
 
     //! Stores the selected datasource whenerver it is changed
     void on_cmbConnections_activated( int );
@@ -143,7 +144,7 @@
      * \retval false if the layers could not be retrieved or parsed -
      *         see mWmsProvider->errorString() for more info
      */
-    bool populateLayerList( QgsWmsProvider *wmsProvider );
+    bool populateLayerList();
 
     //! create an item including possible parents
     QgsNumericSortTreeWidgetItem *createItem( int id,
@@ -186,6 +187,7 @@
     QString selectedImageEncoding();
 
     QList<QTreeWidgetItem*> mCurrentSelection;
+    QgsWmsProvider *mWmsProvider;
     QTableWidgetItem* mCurrentTileset;
 
   private slots:

Modified: trunk/qgis/src/core/qgsdataprovider.h
===================================================================
--- trunk/qgis/src/core/qgsdataprovider.h	2011-04-17 13:40:25 UTC (rev 15746)
+++ trunk/qgis/src/core/qgsdataprovider.h	2011-04-17 13:58:59 UTC (rev 15747)
@@ -22,7 +22,8 @@
 #include <QString>
 #include <QStringList>
 
-class QgsRectangle;
+#include <qgsrectangle.h>
+
 class QgsCoordinateReferenceSystem;
 
 
@@ -90,6 +91,15 @@
      */
     virtual QgsRectangle extent() = 0;
 
+    /**
+     * Set the extent of the layer
+     * @param extent the layer extent
+     * @note added in 1.8
+     */
+    virtual void setExtent( QgsRectangle extent )
+    {
+      // NOP by default
+    }
 
     /**
      * Returns true if this is a valid layer. It is up to individual providers

Modified: trunk/qgis/src/core/raster/qgsrasterlayer.cpp
===================================================================
--- trunk/qgis/src/core/raster/qgsrasterlayer.cpp	2011-04-17 13:40:25 UTC (rev 15746)
+++ trunk/qgis/src/core/raster/qgsrasterlayer.cpp	2011-04-17 13:58:59 UTC (rev 15747)
@@ -99,7 +99,7 @@
 
   // TODO, call constructor with provider key for now
   init();
-  setDataProvider( "gdal", QStringList(), QStringList(), QString(), QString(), loadDefaultStyleFlag );
+  setDataProvider( "gdal", QStringList(), QStringList(), QString(), QString(), loadDefaultStyleFlag, QgsRectangle() );
   return;
 
 
@@ -116,7 +116,8 @@
                                 QStringList const & layers,
                                 QStringList const & styles,
                                 QString const & format,
-                                QString const & crs )
+                                QString const & crs,
+                                QgsRectangle extent )
     : QgsMapLayer( RasterLayer, baseName, rasterLayerPath )
     , mStandardDeviations( 0 )
     , mDataProvider( 0 )
@@ -135,7 +136,7 @@
   init();
   // if we're given a provider type, try to create and bind one to this layer
   bool loadDefaultStyleFlag = false ; // ???
-  setDataProvider( providerKey, layers, styles, format, crs, loadDefaultStyleFlag );
+  setDataProvider( providerKey, layers, styles, format, crs, loadDefaultStyleFlag, extent );
 
   // Default for the popup menu
   // TODO: popMenu = 0;
@@ -2246,7 +2247,7 @@
                                       QString const & format,
                                       QString const & crs )
 {
-  setDataProvider( provider, layers, styles, format, crs, false );
+  setDataProvider( provider, layers, styles, format, crs, false, QgsRectangle() );
 }
 
 /** Copied from QgsVectorLayer::setDataProvider
@@ -2257,7 +2258,8 @@
                                       QStringList const & styles,
                                       QString const & format,
                                       QString const & crs,
-                                      bool loadDefaultStyleFlag )
+                                      bool loadDefaultStyleFlag,
+                                      QgsRectangle extent )
 {
   // XXX should I check for and possibly delete any pre-existing providers?
   // XXX How often will that scenario occur?
@@ -2281,7 +2283,6 @@
     return;
   }
 
-
   QgsDebugMsg( "Instantiated the data provider plugin"
                + QString( " with layer list of " ) + layers.join( ", " )
                + " and style list of " + styles.join( ", " )
@@ -2298,8 +2299,18 @@
 
   setNoDataValue( mDataProvider->noDataValue() );
 
-  // get the extent
-  QgsRectangle mbr = mDataProvider->extent();
+  QgsRectangle mbr;
+  if ( mDataProvider && !extent.isEmpty() )
+  {
+    // set the extent
+    mDataProvider->setExtent( extent );
+    mbr = extent;
+  }
+  else
+  {
+    // get the extent
+    mbr = mDataProvider->extent();
+  }
 
   // show the extent
   QString s = mbr.toString();
@@ -4423,6 +4434,7 @@
 bool QgsRasterLayer::update()
 {
   QgsDebugMsg( "entered." );
+
   // Check if data changed
   //if ( mLastModified < QgsRasterLayer::lastModified( source() ) )
   //{

Modified: trunk/qgis/src/core/raster/qgsrasterlayer.h
===================================================================
--- trunk/qgis/src/core/raster/qgsrasterlayer.h	2011-04-17 13:40:25 UTC (rev 15746)
+++ trunk/qgis/src/core/raster/qgsrasterlayer.h	2011-04-17 13:58:59 UTC (rev 15747)
@@ -207,7 +207,8 @@
                     const QStringList & layers = QStringList(),
                     const QStringList & styles = QStringList(),
                     const QString & format = QString(),
-                    const QString & crs = QString() );
+                    const QString & crs = QString(),
+                    const QgsRectangle extent = QgsRectangle() );
 
 
     /** \brief The destructor */
@@ -312,7 +313,8 @@
                           const QStringList & styles,
                           const QString & format,
                           const QString & crs,
-                          bool loadDefaultStyleFlag );
+                          bool loadDefaultStyleFlag,
+                          QgsRectangle extent );
 
     static QLibrary* loadProviderLibrary( QString theProviderKey );
     static QgsRasterDataProvider* loadProvider( QString theProviderKey, QString theDataSource = 0 );

Modified: trunk/qgis/src/providers/wms/qgswmsprovider.cpp
===================================================================
--- trunk/qgis/src/providers/wms/qgswmsprovider.cpp	2011-04-17 13:40:25 UTC (rev 15746)
+++ trunk/qgis/src/providers/wms/qgswmsprovider.cpp	2011-04-17 13:58:59 UTC (rev 15747)
@@ -899,7 +899,7 @@
 
     QNetworkRequest request( url );
     setAuthorization( request );
-    request.setAttribute( QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferNetwork );
+    request.setAttribute( QNetworkRequest::CacheLoadControlAttribute, forceRefresh ? QNetworkRequest::PreferNetwork : QNetworkRequest::PreferCache );
     request.setAttribute( QNetworkRequest::CacheSaveControlAttribute, true );
 
     QgsDebugMsg( QString( "getcapabilities: %1" ).arg( url ) );
@@ -978,6 +978,9 @@
       return;
     }
 
+    QgsDebugMsg( QString( "getcapabilities from cache: %1" )
+                 .arg( mCapabilitiesReply->attribute( QNetworkRequest::SourceIsFromCacheAttribute ).toBool() ? "yes" : "no" ) );
+
     httpcapabilitiesresponse = mCapabilitiesReply->readAll();
 
     if ( httpcapabilitiesresponse.isEmpty() )
@@ -2028,8 +2031,12 @@
   QgsDebugMsg( "exiting." );
 }
 
+void QgsWmsProvider::setExtent( QgsRectangle extent )
+{
+  layerExtent = extent;
+  extentDirty = false;
+}
 
-
 QgsRectangle QgsWmsProvider::extent()
 {
   if ( extentDirty )
@@ -2170,7 +2177,6 @@
   QgsDebugMsg( "exiting with '"  + layerExtent.toString() + "'." );
 
   return true;
-
 }
 
 

Modified: trunk/qgis/src/providers/wms/qgswmsprovider.h
===================================================================
--- trunk/qgis/src/providers/wms/qgswmsprovider.h	2011-04-17 13:40:25 UTC (rev 15746)
+++ trunk/qgis/src/providers/wms/qgswmsprovider.h	2011-04-17 13:58:59 UTC (rev 15747)
@@ -464,6 +464,11 @@
     //void readBlock( int bandNo, QgsRectangle  const & viewExtent, int width, int height, QgsCoordinateReferenceSystem theSrcCRS, QgsCoordinateReferenceSystem theDestCRS, void *data );
 
 
+    /**
+     *  preset the extent to prevent and extra GetCapabilities request
+     */
+    virtual void setExtent( QgsRectangle extent );
+
     /** Return the extent for this data layer
     */
     virtual QgsRectangle extent();



More information about the QGIS-commit mailing list