197 changes: 54 additions & 143 deletions src/core/raster/qgsrasterlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ email : tim at linfiniti.com
***************************************************************************/

#include "qgsapplication.h"
#include "qgsdatasourceuri.h"
#include "qgslogger.h"
#include "qgsmessagelog.h"
#include "qgsmaplayerregistry.h"
Expand Down Expand Up @@ -80,6 +81,12 @@ typedef bool isvalidrasterfilename_t( QString const & theFileNameQString, QStrin
// doubles can take for the current system. (Yes, 20 was arbitrary.)
#define TINY_VALUE std::numeric_limits<double>::epsilon() * 20

QgsRasterLayer::QgsRasterLayer()
: QgsMapLayer( RasterLayer )
{
init();
mValid = false;
}

QgsRasterLayer::QgsRasterLayer(
QString const & path,
Expand All @@ -99,18 +106,12 @@ QgsRasterLayer::QgsRasterLayer(

// TODO, call constructor with provider key for now
init();
setDataProvider( "gdal", QStringList(), QStringList(), QString(), QString(), loadDefaultStyleFlag );
setDataProvider( "gdal" );

if ( mValid && loadDefaultStyleFlag )
{
bool defaultLoadedFlag = false;
loadDefaultStyle( defaultLoadedFlag );
// I'm no sure if this should be used somehow, in pre raster-providers there was
// only mLastViewPort init after this block, nothing to do with style
//if ( defaultLoadedFlag )
//{
//return;
//}
}
return;

Expand All @@ -121,15 +122,14 @@ QgsRasterLayer::QgsRasterLayer(
* @todo Rename into a general constructor when the old raster interface is retired
* parameter dummy is just there to distinguish this function signature from the old non-provider one.
*/
QgsRasterLayer::QgsRasterLayer( int dummy,
QString const & rasterLayerPath,
QString const & baseName,
QString const & providerKey,
QStringList const & layers,
QStringList const & styles,
QString const & format,
QString const & crs )
: QgsMapLayer( RasterLayer, baseName, rasterLayerPath )
QgsRasterLayer::QgsRasterLayer( const QString & uri,
const QString & baseName,
const QString & providerKey,
bool loadDefaultStyleFlag )
: QgsMapLayer( RasterLayer, baseName, uri )
// Constant that signals property not used.
, QSTRING_NOT_SET( "Not Set" )
, TRSTRING_NOT_SET( tr( "Not Set" ) )
, mStandardDeviations( 0 )
, mDataProvider( 0 )
, mEditable( false )
Expand All @@ -138,22 +138,15 @@ QgsRasterLayer::QgsRasterLayer( int dummy,
, mInvertColor( false )
, mModified( false )
, mProviderKey( providerKey )
, mLayers( layers )
, mStyles( styles )
, mFormat( format )
, mCrs( crs )
{
Q_UNUSED( dummy );

QgsDebugMsg( "(8 arguments) starting. with layer list of " +
layers.join( ", " ) + " and style list of " + styles.join( ", " ) + " and format of " +
format + " and CRS of " + crs );


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 );

if ( mValid && loadDefaultStyleFlag )
{
bool defaultLoadedFlag = false;
loadDefaultStyle( defaultLoadedFlag );
}

// Default for the popup menu
// TODO: popMenu = 0;
Expand All @@ -169,8 +162,6 @@ QgsRasterLayer::QgsRasterLayer( int dummy,

// TODO: Connect signals from the dataprovider to the qgisapp

QgsDebugMsg( "(8 arguments) exiting." );

emit statusChanged( tr( "QgsRasterLayer created" ) );
} // QgsRasterLayer ctor

Expand Down Expand Up @@ -2208,34 +2199,18 @@ QgsRasterDataProvider* QgsRasterLayer::loadProvider( QString theProviderKey, QSt
return myDataProvider;
}

void QgsRasterLayer::setDataProvider( QString const & provider,
QStringList const & layers,
QStringList const & styles,
QString const & format,
QString const & crs )
{
setDataProvider( provider, layers, styles, format, crs, false );
}

/** Copied from QgsVectorLayer::setDataProvider
* TODO: Make it work in the raster environment
*/
void QgsRasterLayer::setDataProvider( QString const & provider,
QStringList const & layers,
QStringList const & styles,
QString const & format,
QString const & theCrs,
bool loadDefaultStyleFlag )
void QgsRasterLayer::setDataProvider( QString const & provider )
{
Q_UNUSED( loadDefaultStyleFlag );
// XXX should I check for and possibly delete any pre-existing providers?
// XXX How often will that scenario occur?

mProviderKey = provider;
mValid = false; // assume the layer is invalid until we determine otherwise

// set the layer name (uppercase first character)

if ( ! mLayerName.isEmpty() ) // XXX shouldn't this happen in parent?
{
setLayerName( mLayerName );
Expand All @@ -2250,30 +2225,6 @@ void QgsRasterLayer::setDataProvider( QString const & provider,
return;
}


QgsDebugMsg( QString( "Instantiated the data provider plugin with layer list of %1 and style list of %2 and format of %3 and CRS of %4" )
.arg( layers.join( ", " ) )
.arg( styles.join( ", " ) )
.arg( format )
.arg( theCrs )
);
if ( !mDataProvider->isValid() )
{
if ( provider != "gdal" || !layers.isEmpty() || !styles.isEmpty() || !format.isNull() || !theCrs.isNull() )
{
QgsMessageLog::logMessage( tr( "Data provider is invalid (layers: %1, styles: %2, formats: %3)" )
.arg( layers.join( ", " ) )
.arg( styles.join( ", " ) )
.arg( format ),
tr( "Raster" ) );
}
return;
}

mDataProvider->addLayers( layers, styles );
mDataProvider->setImageEncoding( format );
mDataProvider->setImageCrs( theCrs );

setNoDataValue( mDataProvider->noDataValue() );

// get the extent
Expand All @@ -2299,16 +2250,7 @@ void QgsRasterLayer::setDataProvider( QString const & provider,
mDrawingStyle = MultiBandColor; //sensible default

// Setup source CRS
if ( mProviderKey == "wms" )
{
QgsCoordinateReferenceSystem crs;
crs.createFromOgcWmsCrs( theCrs );
setCrs( crs );
}
else
{
setCrs( QgsCoordinateReferenceSystem( mDataProvider->crs() ) );
}
setCrs( QgsCoordinateReferenceSystem( mDataProvider->crs() ) );

QString mySourceWkt = crs().toWkt();

Expand Down Expand Up @@ -3233,33 +3175,42 @@ bool QgsRasterLayer::readXml( const QDomNode& layer_node )

QDomNode rpNode = layer_node.namedItem( "rasterproperties" );

// Collect sublayer names and styles
mLayers.clear();
mStyles.clear();

if ( mProviderKey == "wms" )
{
QDomElement layerElement = rpNode.firstChildElement( "wmsSublayer" );
while ( !layerElement.isNull() )
// >>> BACKWARD COMPATIBILITY < 1.9
// The old WMS URI format does not contains all the informations, we add them here.
if ( !mDataSource.contains( "crs=" ) && !mDataSource.contains( "format=" ) )
{
// TODO: sublayer visibility - post-0.8 release timeframe
QgsDebugMsg( "Old WMS URI format detected -> adding params" );
QgsDataSourceURI uri;
uri.setEncodedUri( mDataSource );
QDomElement layerElement = rpNode.firstChildElement( "wmsSublayer" );
while ( !layerElement.isNull() )
{
// TODO: sublayer visibility - post-0.8 release timeframe

// collect name for the sublayer
mLayers += layerElement.namedItem( "name" ).toElement().text();
// collect name for the sublayer
uri.setParam( "layers", layerElement.namedItem( "name" ).toElement().text() );

// collect style for the sublayer
mStyles += layerElement.namedItem( "style" ).toElement().text();
// collect style for the sublayer
uri.setParam( "styles", layerElement.namedItem( "style" ).toElement().text() );

layerElement = layerElement.nextSiblingElement( "wmsSublayer" );
}
layerElement = layerElement.nextSiblingElement( "wmsSublayer" );
}

// Collect format
mFormat = rpNode.namedItem( "wmsFormat" ).toElement().text();
// Collect format
QDomNode formatNode = rpNode.namedItem( "wmsFormat" );
uri.setParam( "format", rpNode.namedItem( "wmsFormat" ).toElement().text() );

// WMS CRS URL param should not be mixed with that assigned to the layer.
// In the old WMS URI version there was no CRS and layer crs().authid() was used.
uri.setParam( "crs", crs().authid() );
mDataSource = uri.encodedUri();
}
// <<< BACKWARD COMPATIBILITY < 1.9
}

mCrs = crs().authid();
// Collect CRS
setDataProvider( mProviderKey, mLayers, mStyles, mFormat, mCrs );
setDataProvider( mProviderKey );

QString theError;
bool res = readSymbology( layer_node, theError );
Expand Down Expand Up @@ -3287,7 +3238,7 @@ bool QgsRasterLayer::readXml( const QDomNode& layer_node )
QgsDebugMsg( "data changed, reload provider" );
closeDataProvider();
init();
setDataProvider( mProviderKey, mLayers, mStyles, mFormat, mCrs );
setDataProvider( mProviderKey );
}
}

Expand All @@ -3312,46 +3263,6 @@ bool QgsRasterLayer::writeSymbology( QDomNode & layer_node, QDomDocument & docum

QStringList::const_iterator layerStyle = sls.begin();

if ( mProviderKey == "wms" )
{
// <rasterproperties><wmsSublayer>
for ( QStringList::const_iterator layerName = sl.begin();
layerName != sl.end();
++layerName )
{

QgsDebugMsg( QString( "<rasterproperties><wmsSublayer> %1" ).arg( layerName->toLocal8Bit().data() ) );

QDomElement sublayerElement = document.createElement( "wmsSublayer" );

// TODO: sublayer visibility - post-0.8 release timeframe

// <rasterproperties><wmsSublayer><name>
QDomElement sublayerNameElement = document.createElement( "name" );
QDomText sublayerNameText = document.createTextNode( *layerName );
sublayerNameElement.appendChild( sublayerNameText );
sublayerElement.appendChild( sublayerNameElement );

// <rasterproperties><wmsSublayer><style>
QDomElement sublayerStyleElement = document.createElement( "style" );
QDomText sublayerStyleText = document.createTextNode( *layerStyle );
sublayerStyleElement.appendChild( sublayerStyleText );
sublayerElement.appendChild( sublayerStyleElement );

rasterPropertiesElement.appendChild( sublayerElement );

// This assumes there are exactly the same number of "layerName"s as there are "layerStyle"s
++layerStyle;
}

// <rasterproperties><wmsFormat>
QDomElement formatElement = document.createElement( "wmsFormat" );
QDomText formatText =
document.createTextNode( mDataProvider->imageEncoding() );
formatElement.appendChild( formatText );
rasterPropertiesElement.appendChild( formatElement );
}

// <mDrawingStyle>
QDomElement drawStyleElement = document.createElement( "mDrawingStyle" );
QDomText drawStyleText = document.createTextNode( drawingStyleAsString() );
Expand Down Expand Up @@ -4652,7 +4563,7 @@ bool QgsRasterLayer::update()
QgsDebugMsg( "reload data" );
closeDataProvider();
init();
setDataProvider( mProviderKey, mLayers, mStyles, mFormat, mCrs );
setDataProvider( mProviderKey );
emit dataChanged();
}
return mValid;
Expand Down
38 changes: 9 additions & 29 deletions src/core/raster/qgsrasterlayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,9 @@ class CORE_EXPORT QgsRasterLayer : public QgsMapLayer
{
Q_OBJECT
public:
/** \brief Constructor. Provider is not set. */
QgsRasterLayer();

/** \brief This is the constructor for the RasterLayer class.
*
* The main tasks carried out by the constructor are:
Expand All @@ -186,20 +189,15 @@ class CORE_EXPORT QgsRasterLayer : public QgsMapLayer
*
* -
* */
QgsRasterLayer( const QString & path = QString::null,
QgsRasterLayer( const QString & path,
const QString & baseName = QString::null,
bool loadDefaultStyleFlag = true );

/** \brief [ data provider interface ] Constructor in provider mode */
QgsRasterLayer( int dummy,
const QString & baseName = QString(),
const QString & path = QString(),
const QString & providerLib = QString(),
const QStringList & layers = QStringList(),
const QStringList & styles = QStringList(),
const QString & format = QString(),
const QString & crs = QString() );

QgsRasterLayer( const QString & uri,
const QString & baseName,
const QString & providerKey,
bool loadDefaultStyleFlag = true );

/** \brief The destructor */
~QgsRasterLayer();
Expand Down Expand Up @@ -291,19 +289,8 @@ class CORE_EXPORT QgsRasterLayer : public QgsMapLayer
/** \brief Initialize default values */
void init();

// For backward compatibility (Python) get rid of it once python is updated
void setDataProvider( const QString & provider,
const QStringList & layers,
const QStringList & styles,
const QString & format,
const QString & crs );
/** [ data provider interface ] Set the data provider */
void setDataProvider( const QString & provider,
const QStringList & layers,
const QStringList & styles,
const QString & format,
const QString & crs,
bool loadDefaultStyleFlag );
void setDataProvider( const QString & provider );

static QLibrary* loadProviderLibrary( QString theProviderKey );
static QgsRasterDataProvider* loadProvider( QString theProviderKey, QString theDataSource = 0 );
Expand Down Expand Up @@ -919,13 +906,6 @@ class CORE_EXPORT QgsRasterLayer : public QgsMapLayer

/** \brief Flag indicating if the nodatavalue is valid*/
bool mValidNoDataValue;

/** WMS parameters */
/* TODO: put everything to URI */
QStringList mLayers;
QStringList mStyles;
QString mFormat;
QString mCrs;
};

/*#include <QColor>
Expand Down
3 changes: 1 addition & 2 deletions src/gui/qgisinterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,7 @@ class GUI_EXPORT QgisInterface : public QObject
virtual QgsRasterLayer* addRasterLayer( QString rasterLayerPath, QString baseName = QString() ) = 0;

//! Add a WMS layer
virtual QgsRasterLayer* addRasterLayer( const QString& url, const QString& layerName, const QString& providerKey, const QStringList& layers,
const QStringList& styles, const QString& format, const QString& crs ) = 0;
virtual QgsRasterLayer* addRasterLayer( const QString& url, const QString& layerName, const QString& providerKey ) = 0;

//! Add a project
virtual bool addProject( QString theProject ) = 0;
Expand Down
9 changes: 8 additions & 1 deletion src/mapserver/qgsremoteowsbuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
* *
***************************************************************************/

#include "qgsdatasourceuri.h"
#include "qgsremoteowsbuilder.h"
#include "qgshttptransaction.h"
#include "qgslogger.h"
Expand Down Expand Up @@ -206,7 +207,13 @@ QgsRasterLayer* QgsRemoteOWSBuilder::wmsLayerFromUrl( const QString& url, const
QgsDebugMsg( "layerList first item: " + layerList.at( 0 ) );
QgsDebugMsg( "styleList first item: " + styleList.at( 0 ) );

result = new QgsRasterLayer( 0, baseUrl, "", "wms", layerList, styleList, format, crs );
QgsDataSourceURI uri;
uri.setParam( "url", baseUrl );
uri.setParam( "format", format );
uri.setParam( "crs", crs );
uri.setParam( "layers", layerList );
uri.setParam( "styles", styleList );
result = new QgsRasterLayer( uri.encodedUri(), "", "wms" );
if ( !result->isValid() )
{
return 0;
Expand Down
3 changes: 1 addition & 2 deletions src/plugins/grass/qgsgrassbrowser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -154,8 +154,7 @@ void QgsGrassBrowser::addMap()
{
QgsDebugMsg( QString( "add raster: %1" ).arg( uri ) );
//mIface->addRasterLayer( uri, map );
mIface->addRasterLayer( uri, map, "grassraster", QStringList(), QStringList(),
QString(), QString() );
mIface->addRasterLayer( uri, map, "grassraster" );
}
else if ( type == QgsGrassModel::Vector )
{
Expand Down
3 changes: 1 addition & 2 deletions src/plugins/grass/qgsgrassmodule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1689,8 +1689,7 @@ void QgsGrassModule::viewOutput()
+ "/cellhd/" + map;

//mIface->addRasterLayer( uri, map );
mIface->addRasterLayer( uri, map, "grassraster", QStringList(), QStringList(),
QString(), QString() );
mIface->addRasterLayer( uri, map, "grassraster" );
}
}

Expand Down
3 changes: 1 addition & 2 deletions src/plugins/grass/qgsgrassplugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -421,8 +421,7 @@ void QgsGrassPlugin::addRaster()
name.replace( '/', ' ' );

//qGisInterface->addRasterLayer( uri, sel->map );
qGisInterface->addRasterLayer( uri, sel->map, "grassraster", QStringList(), QStringList(),
QString(), QString() );
qGisInterface->addRasterLayer( uri, sel->map, "grassraster" );
}
}

Expand Down
16 changes: 14 additions & 2 deletions src/providers/wms/qgswmsconnection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
//#include "qgisapp.h" //for getThemeIcon
//#include "qgscontexthelp.h"
//#include "qgscoordinatereferencesystem.h"
#include "qgsdatasourceuri.h"
//#include "qgsgenericprojectionselector.h"
//#include "qgslogger.h"
//#include "qgsmanageconnectionsdialog.h"
Expand Down Expand Up @@ -63,6 +64,7 @@ QgsWMSConnection::QgsWMSConnection( QString theConnName ) :
QStringList connStringParts;

mConnectionInfo = settings.value( key + "/url" ).toString();
mUri.setParam( "url", settings.value( key + "/url" ).toString() );

// Check for credentials and prepend to the connection info
QString username = settings.value( credentialsKey + "/username" ).toString();
Expand All @@ -76,6 +78,8 @@ QgsWMSConnection::QgsWMSConnection( QString theConnName ) :
password = QInputDialog::getText( 0, tr( "WMS Password for %1" ).arg( mConnName ), "Password", QLineEdit::Password );
}
mConnectionInfo = "username=" + username + ",password=" + password + ",url=" + mConnectionInfo;
mUri.setParam( "username", username );
mUri.setParam( "password", password );
}

bool ignoreGetMap = settings.value( key + "/ignoreGetMapURI", false ).toBool();
Expand All @@ -88,10 +92,13 @@ QgsWMSConnection::QgsWMSConnection( QString theConnName ) :
connArgs += "GetMap";
if ( ignoreGetFeatureInfo )
connArgs += ";";
mUri.setParam( "ignoreUrl", "GetMap" );
}
if ( ignoreGetFeatureInfo )
{
connArgs += "GetFeatureInfo";

mUri.setParam( "ignoreUrl", "GetFeatureInfo" );
}
if ( mConnectionInfo.startsWith( "username=" ) )
{
mConnectionInfo.prepend( connArgs + "," );
Expand All @@ -115,6 +122,11 @@ QString QgsWMSConnection::connectionInfo( )
return mConnectionInfo;
}

QgsDataSourceURI QgsWMSConnection::uri()
{
return mUri;
}

QgsWmsProvider * QgsWMSConnection::provider( )
{
// TODO: Create and bind to data provider
Expand All @@ -123,7 +135,7 @@ QgsWmsProvider * QgsWMSConnection::provider( )
QgsProviderRegistry * pReg = QgsProviderRegistry::instance();

QgsWmsProvider *wmsProvider =
( QgsWmsProvider* ) pReg->provider( "wms", mConnectionInfo );
( QgsWmsProvider* ) pReg->provider( "wms", mUri.encodedUri() );

return wmsProvider;
}
Expand Down
3 changes: 3 additions & 0 deletions src/providers/wms/qgswmsconnection.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

#ifndef QGSWMSCONNECTION_H
#define QGSWMSCONNECTION_H
#include "qgsdatasourceuri.h"
#include "qgisgui.h"
//#include "qgscontexthelp.h"

Expand Down Expand Up @@ -56,6 +57,8 @@ class QgsWMSConnection : public QObject
QString connectionInfo();
QString mConnName;
QString mConnectionInfo;
QgsDataSourceURI uri();
QgsDataSourceURI mUri;
};


Expand Down
43 changes: 18 additions & 25 deletions src/providers/wms/qgswmsdataitems.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

#include "qgslogger.h"

#include "qgsdatasourceuri.h"
#include "qgswmsconnection.h"
#include "qgswmssourceselect.h"

Expand All @@ -27,8 +28,8 @@ QVector<QgsDataItem*> QgsWMSConnectionItem::createChildren()
if ( !wmsProvider )
return children;

QString mConnInfo = connection.connectionInfo();
QgsDebugMsg( "mConnInfo = " + mConnInfo );
QgsDataSourceURI uri = connection.uri();
QgsDebugMsg( "uri = " + uri.encodedUri() );

// Attention: supportedLayers() gives tree leafes, not top level
if ( !wmsProvider->supportedLayers( mLayerProperties ) )
Expand All @@ -50,7 +51,7 @@ QVector<QgsDataItem*> QgsWMSConnectionItem::createChildren()
QgsDebugMsg( QString::number( layerProperty.orderId ) + " " + layerProperty.name + " " + layerProperty.title );
QString pathName = layerProperty.name.isEmpty() ? QString::number( layerProperty.orderId ) : layerProperty.name;

QgsWMSLayerItem * layer = new QgsWMSLayerItem( this, layerProperty.title, mPath + "/" + pathName, mCapabilitiesProperty, mConnInfo, layerProperty );
QgsWMSLayerItem * layer = new QgsWMSLayerItem( this, layerProperty.title, mPath + "/" + pathName, mCapabilitiesProperty, uri, layerProperty );

children.append( layer );
}
Expand Down Expand Up @@ -103,22 +104,23 @@ void QgsWMSConnectionItem::deleteConnection()

// ---------------------------------------------------------------------------

QgsWMSLayerItem::QgsWMSLayerItem( QgsDataItem* parent, QString name, QString path, QgsWmsCapabilitiesProperty capabilitiesProperty, QString connInfo, QgsWmsLayerProperty layerProperty )
QgsWMSLayerItem::QgsWMSLayerItem( QgsDataItem* parent, QString name, QString path, QgsWmsCapabilitiesProperty capabilitiesProperty, QgsDataSourceURI dataSourceUri, QgsWmsLayerProperty layerProperty )
: QgsLayerItem( parent, name, path, QString(), QgsLayerItem::Raster, "wms" ),
mCapabilitiesProperty( capabilitiesProperty ),
mConnInfo( connInfo ),
mDataSourceUri( dataSourceUri ),
mLayerProperty( layerProperty )
//mProviderKey ("wms"),
//mLayerType ( QgsLayerItem::Raster )
{
QgsDebugMsg( "uri = " + mDataSourceUri.encodedUri() );
mUri = createUri();
// Populate everything, it costs nothing, all info about layers is collected
foreach( QgsWmsLayerProperty layerProperty, mLayerProperty.layer )
{
// Attention, the name may be empty
QgsDebugMsg( QString::number( layerProperty.orderId ) + " " + layerProperty.name + " " + layerProperty.title );
QString pathName = layerProperty.name.isEmpty() ? QString::number( layerProperty.orderId ) : layerProperty.name;
QgsWMSLayerItem * layer = new QgsWMSLayerItem( this, layerProperty.title, mPath + "/" + pathName, mCapabilitiesProperty, mConnInfo, layerProperty );
QgsWMSLayerItem * layer = new QgsWMSLayerItem( this, layerProperty.title, mPath + "/" + pathName, mCapabilitiesProperty, mDataSourceUri, layerProperty );
mChildren.append( layer );
}

Expand All @@ -135,28 +137,16 @@ QgsWMSLayerItem::~QgsWMSLayerItem()

QString QgsWMSLayerItem::createUri()
{
QString uri;
if ( mLayerProperty.name.isEmpty() )
return uri; // layer collection

QString rasterLayerPath = mConnInfo;
QString baseName = mLayerProperty.name;
return ""; // layer collection

// Number of styles must match number of layers
QStringList layers;
layers << mLayerProperty.name;
QStringList styles;
if ( mLayerProperty.style.size() > 0 )
{
styles.append( mLayerProperty.style[0].name );
}
else
{
styles << ""; // TODO: use loadDefaultStyleFlag
}
mDataSourceUri.setParam( "layers", mLayerProperty.name );
QString style = mLayerProperty.style.size() > 0 ? mLayerProperty.style[0].name : "";
mDataSourceUri.setParam( "styles", style );

QString format;
// get first supporte by qt and server
// get first supported by qt and server
QVector<QgsWmsSupportedFormat> formats = QgsWmsProvider::supportedFormats();
foreach( QgsWmsSupportedFormat f, formats )
{
Expand All @@ -166,6 +156,8 @@ QString QgsWMSLayerItem::createUri()
break;
}
}
mDataSourceUri.setParam( "format", format );

QString crs;
// get first known if possible
QgsCoordinateReferenceSystem testCrs;
Expand All @@ -182,9 +174,10 @@ QString QgsWMSLayerItem::createUri()
{
crs = mLayerProperty.crs[0];
}
uri = rasterLayerPath + "|layers=" + layers.join( "," ) + "|styles=" + styles.join( "," ) + "|format=" + format + "|crs=" + crs;
mDataSourceUri.setParam( "crs", crs );
//uri = rasterLayerPath + "|layers=" + layers.join( "," ) + "|styles=" + styles.join( "," ) + "|format=" + format + "|crs=" + crs;

return uri;
return mDataSourceUri.encodedUri();
}

// ---------------------------------------------------------------------------
Expand Down
5 changes: 3 additions & 2 deletions src/providers/wms/qgswmsdataitems.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#define QGSWMSDATAITEMS_H

#include "qgsdataitem.h"
#include "qgsdatasourceuri.h"
#include "qgswmsprovider.h"

class QgsWMSConnectionItem : public QgsDataCollectionItem
Expand Down Expand Up @@ -32,13 +33,13 @@ class QgsWMSLayerItem : public QgsLayerItem
Q_OBJECT
public:
QgsWMSLayerItem( QgsDataItem* parent, QString name, QString path,
QgsWmsCapabilitiesProperty capabilitiesProperty, QString connInfo, QgsWmsLayerProperty layerProperties );
QgsWmsCapabilitiesProperty capabilitiesProperty, QgsDataSourceURI dataSourceUri, QgsWmsLayerProperty layerProperties );
~QgsWMSLayerItem();

QString createUri();

QgsWmsCapabilitiesProperty mCapabilitiesProperty;
QString mConnInfo;
QgsDataSourceURI mDataSourceUri;
QgsWmsLayerProperty mLayerProperty;
};

Expand Down
104 changes: 40 additions & 64 deletions src/providers/wms/qgswmsprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#include <cmath>

#include "qgscoordinatetransform.h"
#include "qgsdatasourceuri.h"
#include "qgsrasterlayer.h"
#include "qgsrectangle.h"
#include "qgscoordinatereferencesystem.h"
Expand Down Expand Up @@ -118,77 +119,48 @@ QgsWmsProvider::QgsWmsProvider( QString const &uri )
QgsDebugMsg( "exiting constructor." );
}

void QgsWmsProvider::parseUri( QString uri )
void QgsWmsProvider::parseUri( QString uriString )
{
// Strip off and store the user name and password (if they exist)
if ( !uri.startsWith( " http:" ) )
{
mTiled = false;
mTileWidth = 0;
mTileHeight = 0;
mResolutions.clear();
QgsDebugMsg( "uriString = " + uriString );
QgsDataSourceURI uri;
uri.setEncodedUri( uriString );

mIgnoreGetMapUrl = false;
mIgnoreGetFeatureInfoUrl = false;
mTiled = false;
mTileWidth = 0;
mTileHeight = 0;
mResolutions.clear();
mIgnoreGetMapUrl = false;
mIgnoreGetFeatureInfoUrl = false;

// uri potentially contains username and password
QStringList parts = uri.split( "," );
QStringListIterator iter( parts );
while ( iter.hasNext() )
{
QString item = iter.next();
QgsDebugMsg( "testing for creds: " + item );
if ( item.startsWith( "username=" ) )
{
mUserName = item.mid( 9 );
QgsDebugMsg( "set username to " + mUserName );
}
else if ( item.startsWith( "password=" ) )
{
mPassword = item.mid( 9 );
QgsDebugMsg( "set password to " + mPassword );
}
else if ( item.startsWith( "tiled=" ) )
{
QStringList params = item.mid( 6 ).split( ";" );
httpuri = uri.param( "url" );
QgsDebugMsg( "set httpuri to " + httpuri );

mTiled = true;
mTileWidth = params.takeFirst().toInt();
mTileHeight = params.takeFirst().toInt();
mUserName = uri.param( "username" );
QgsDebugMsg( "set username to " + mUserName );

mResolutions.clear();
foreach( QString r, params )
{
mResolutions << r.toDouble();
}
qSort( mResolutions );
}
else if ( item.startsWith( "featureCount=" ) )
{
mFeatureCount = item.mid( 13 ).toInt();
}
else if ( item.startsWith( "url=" ) )
{
// strip the authentication information from the front of the uri
httpuri = item.mid( 4 );
QgsDebugMsg( "set httpuri to " + httpuri );
}
else if ( item.startsWith( "ignoreUrl=" ) )
{
foreach( QString param, item.mid( 10 ).split( ";" ) )
{
if ( param == "GetMap" )
{
mIgnoreGetMapUrl = true;
}
else if ( param == "GetFeatureInfo" )
{
mIgnoreGetFeatureInfoUrl = true;
}
}
}
mPassword = uri.param( "password" );
QgsDebugMsg( "set password to " + mPassword );

addLayers( uri.params( "layers" ), uri.params( "styles" ) );
setImageEncoding( uri.param( "format" ) );
setImageCrs( uri.param( "crs" ) );

if ( uri.hasParam( "tileWidth" ) )
{
mTiled = true;
mTileWidth = uri.param( "tileWidth" ).toInt();
mTileHeight = uri.param( "tileHeight" ).toInt();
foreach( QString p, uri.params( "tileResolutions" ) )
{
mResolutions << p.toDouble();
}
qSort( mResolutions );
}

mFeatureCount = uri.param( "featureCount" ).toInt(); // default to 0

mIgnoreGetMapUrl = uri.params( "ignoreUrl" ).contains( "GetMap" );
mIgnoreGetFeatureInfoUrl = uri.params( "ignoreUrl" ).contains( "GetFeatureInfo" );
}

QString QgsWmsProvider::prepareUri( QString uri ) const
Expand Down Expand Up @@ -2274,6 +2246,7 @@ bool QgsWmsProvider::calculateExtent()
.arg( layers ).arg( styles ).arg( imageCrs ) );
for ( int i = 0; i < tilesetsSupported.size(); i++ )
{
QgsDebugMsg( "tilesetsSupported[i].crs = " + tilesetsSupported[i].crs + " imageCrs = " + imageCrs );
if ( tilesetsSupported[i].layers.join( "," ) == layers &&
tilesetsSupported[i].styles.join( "," ) == styles &&
tilesetsSupported[i].crs == imageCrs )
Expand Down Expand Up @@ -2304,6 +2277,7 @@ bool QgsWmsProvider::calculateExtent()

mCoordinateTransform = new QgsCoordinateTransform( qgisSrsSource, qgisSrsDest );
}
QgsDebugMsg( "imageCrs = " + imageCrs );

bool firstLayer = true; //flag to know if a layer is the first to be successfully transformed
for ( QStringList::Iterator it = activeSubLayers.begin();
Expand All @@ -2313,11 +2287,13 @@ bool QgsWmsProvider::calculateExtent()
QgsDebugMsg( "Sublayer Iterator: " + *it );
// This is the extent for the layer name in *it
QgsRectangle extent = extentForLayer.find( *it ).value();
QgsDebugMsg( "extent = " + extent.toString() );

// Convert to the user's CRS as required
try
{
extent = mCoordinateTransform->transformBoundingBox( extent, QgsCoordinateTransform::ForwardTransform );
QgsDebugMsg( "extent = " + extent.toString() );
}
catch ( QgsCsException &cse )
{
Expand Down
40 changes: 17 additions & 23 deletions src/providers/wms/qgswmssourceselect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "qgis.h" // GEO_EPSG_CRS_ID
#include "qgscontexthelp.h"
#include "qgscoordinatereferencesystem.h"
#include "qgsdatasourceuri.h"
#include "qgsgenericprojectionselector.h"
#include "qgslogger.h"
#include "qgsmanageconnectionsdialog.h"
Expand Down Expand Up @@ -407,6 +408,7 @@ void QgsWMSSourceSelect::on_btnConnect_clicked()
QgsWMSConnection connection( cmbConnections->currentText() );
QgsWmsProvider *wmsProvider = connection.provider( );
mConnectionInfo = connection.connectionInfo();
mUri = connection.uri();

if ( wmsProvider )
{
Expand Down Expand Up @@ -442,9 +444,8 @@ void QgsWMSSourceSelect::addClicked()
QStringList styles;
QString format;
QString crs;
QString connInfo = connectionInfo();

QString connArgs;
QgsDataSourceURI uri = mUri;

if ( lstTilesets->selectedItems().isEmpty() )
{
Expand All @@ -454,7 +455,8 @@ void QgsWMSSourceSelect::addClicked()

if ( mTileWidth->text().toInt() > 0 && mTileHeight->text().toInt() > 0 )
{
connArgs = QString( "tiled=%1;%2" ).arg( mTileWidth->text().toInt() ).arg( mTileHeight->text().toInt() );
uri.setParam( "tileWidth", mTileWidth->text() );
uri.setParam( "tileHeight", mTileHeight->text() );
}
}
else
Expand All @@ -465,35 +467,27 @@ void QgsWMSSourceSelect::addClicked()
format = item->data( Qt::UserRole + 2 ).toString();
crs = item->data( Qt::UserRole + 3 ).toString();

connArgs = QString( "tiled=%1;%2;%3" )
.arg( item->data( Qt::UserRole + 4 ).toInt() )
.arg( item->data( Qt::UserRole + 5 ).toInt() )
.arg( item->data( Qt::UserRole + 6 ).toStringList().join( ";" ) );
uri.setParam( "tileWidth", item->data( Qt::UserRole + 4 ).toString() );
uri.setParam( "tileHeight", item->data( Qt::UserRole + 5 ).toString() );
uri.setParam( "tileResolutions", item->data( Qt::UserRole + 6 ).toStringList() );
}
uri.setParam( "layers", layers );
uri.setParam( "styles", styles );
uri.setParam( "format", format );
uri.setParam( "crs", crs );

if ( mFeatureCount->text().toInt() > 0 )
{
if ( !connArgs.isEmpty() )
connArgs += ",";
connArgs += QString( "featureCount=%1" ).arg( mFeatureCount->text().toInt() );
uri.setParam( "featureCount", mFeatureCount->text() );
}

if ( !connArgs.isEmpty() )
{
if ( connInfo.startsWith( "username=" ) || connInfo.startsWith( "ignoreUrl=" ) )
{
connInfo.prepend( connArgs + "," );
}
else
{
connInfo.prepend( connArgs + ",url=" );
}
}
QgsDebugMsg( "crs = " + crs );

emit addRasterLayer( connInfo,
QgsDebugMsg( "uri = " + uri.encodedUri() );
emit addRasterLayer( uri.encodedUri(),
leLayerName->text().isEmpty() ? layers.join( "/" ) : leLayerName->text(),
"wms", layers, styles, format, crs );
"wms" );

}

void QgsWMSSourceSelect::enableLayersForCrs( QTreeWidgetItem *item )
Expand Down
8 changes: 3 additions & 5 deletions src/providers/wms/qgswmssourceselect.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#ifndef QGSWMSSOURCESELECT_H
#define QGSWMSSOURCESELECT_H
#include "ui_qgswmssourceselectbase.h"
#include "qgsdatasourceuri.h"
#include "qgisgui.h"
#include "qgscontexthelp.h"

Expand Down Expand Up @@ -172,6 +173,7 @@ class QgsWMSSourceSelect : public QDialog, private Ui::QgsWMSSourceSelectBase

//! URI for selected connection
QString mConnectionInfo;
QgsDataSourceURI mUri;

//! layer name derived from latest layer selection (updated as long it's not edited manually)
QString mLastLayerName;
Expand All @@ -198,11 +200,7 @@ class QgsWMSSourceSelect : public QDialog, private Ui::QgsWMSSourceSelectBase
signals:
void addRasterLayer( QString const & rasterLayerPath,
QString const & baseName,
QString const & providerKey,
QStringList const & layers,
QStringList const & styles,
QString const & format,
QString const & crs );
QString const & providerKey );
void connectionsChanged();
private slots:
void on_btnSearch_clicked();
Expand Down