239 changes: 239 additions & 0 deletions src/providers/ows/qgsowsdataitems.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,239 @@
#include "qgsproviderregistry.h"
#include "qgsowsdataitems.h"
#include "qgsowsprovider.h"
#include "qgslogger.h"
#include "qgsdatasourceuri.h"
//#include "qgsowssourceselect.h"
#include "qgsowsconnection.h"
#include "qgsnewhttpconnection.h"

#include <QFileInfo>

// ---------------------------------------------------------------------------
QgsOWSConnectionItem::QgsOWSConnectionItem( QgsDataItem* parent, QString name, QString path )
: QgsDataCollectionItem( parent, name, path )
{
mIcon = QIcon( getThemePixmap( "mIconConnect.png" ) );
}

QgsOWSConnectionItem::~QgsOWSConnectionItem()
{
}

QVector<QgsDataItem*> QgsOWSConnectionItem::createChildren()
{
QgsDebugMsg( "Entered" );
QVector<QgsDataItem*> children;

QVector<QgsDataItem*> serviceItems;

int layerCount;
// Try to open with WMS,WFS,WCS
foreach( QString key, QStringList() << "wms" << "WFS" << "gdal" )
{
QgsDebugMsg( "Add connection for provider " + key );
QLibrary *library = QgsProviderRegistry::instance()->providerLibrary( key );
if ( !library ) continue;

dataItem_t * dItem = ( dataItem_t * ) cast_to_fptr( library->resolve( "dataItem" ) );
if ( !dItem )
{
QgsDebugMsg( library->fileName() + " does not have dataItem" );
continue;
}

QgsDataItem *item = dItem( mPath, this ); // empty path -> top level
if ( !item ) continue;

layerCount += item->rowCount();
if ( item->rowCount() > 0 )
{
QgsDebugMsg( "Add new item : " + item->name() );
serviceItems.append( item );
}
else
{
//delete item;
}
}

foreach( QgsDataItem* item, serviceItems )
{
QgsDebugMsg( QString("serviceItems.size = %1 layerCount = %2 rowCount = %3").arg(serviceItems.size()).arg(layerCount).arg(item->rowCount() ) );
if ( serviceItems.size() == 1 || layerCount <= 30 || item->rowCount() <= 10 )
{
// Add layers directly to OWS connection
foreach( QgsDataItem* subItem, item->children() )
{
item->removeChildItem ( subItem );
subItem->setParent ( this );
children.append( subItem );
}
delete item;
}
else // Add service
{
children.append( item );
}
}

return children;
}

bool QgsOWSConnectionItem::equal( const QgsDataItem *other )
{
if ( type() != other->type() )
{
return false;
}
const QgsOWSConnectionItem *o = dynamic_cast<const QgsOWSConnectionItem *>( other );
return ( mPath == o->mPath && mName == o->mName );
}

QList<QAction*> QgsOWSConnectionItem::actions()
{
QList<QAction*> lst;

QAction* actionEdit = new QAction( tr( "Edit..." ), this );
connect( actionEdit, SIGNAL( triggered() ), this, SLOT( editConnection() ) );
lst.append( actionEdit );

QAction* actionDelete = new QAction( tr( "Delete" ), this );
connect( actionDelete, SIGNAL( triggered() ), this, SLOT( deleteConnection() ) );
lst.append( actionDelete );

return lst;
}

void QgsOWSConnectionItem::editConnection()
{
/*
QgsNewHttpConnection nc( 0, "/Qgis/connections-ows/", mName );
if ( nc.exec() )
{
// the parent should be updated
mParent->refresh();
}
*/
}

void QgsOWSConnectionItem::deleteConnection()
{
/*
QgsOWSConnection::deleteConnection( "OWS", mName );
// the parent should be updated
mParent->refresh();
*/
}


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


QgsOWSRootItem::QgsOWSRootItem( QgsDataItem* parent, QString name, QString path )
: QgsDataCollectionItem( parent, name, path )
{
mIcon = QIcon( getThemePixmap( "mIconOws.png" ) );

populate();
}

QgsOWSRootItem::~QgsOWSRootItem()
{
}

QVector<QgsDataItem*>QgsOWSRootItem::createChildren()
{
QgsDebugMsg( "Entered" );
QVector<QgsDataItem*> connections;
// Combine all WMS,WFS,WCS connections
QMap<QString, QStringList> uris;
foreach( QString service, QStringList() << "WMS" << "WFS" << "WCS" )
{
foreach( QString connName, QgsOWSConnection::connectionList( service ) )
{
QgsOWSConnection connection( service, connName );

QString encodedUri = connection.uri().encodedUri();
QStringList labels = uris.value ( encodedUri );
if ( !labels.contains ( connName ) )
{
labels << connName;
}
uris[encodedUri] = labels;
}
}
foreach( QString encodedUri, uris.keys() )
{
QgsDataItem * conn = new QgsOWSConnectionItem( this, uris.value(encodedUri).join(" / "), encodedUri );
connections.append( conn );
}
return connections;
}

QList<QAction*> QgsOWSRootItem::actions()
{
QList<QAction*> lst;

/*
QAction* actionNew = new QAction( tr( "New Connection..." ), this );
connect( actionNew, SIGNAL( triggered() ), this, SLOT( newConnection() ) );
lst.append( actionNew );
*/
return lst;
}


QWidget * QgsOWSRootItem::paramWidget()
{
/*
QgsOWSSourceSelect *select = new QgsOWSSourceSelect( 0, 0, true, true );
connect( select, SIGNAL( connectionsChanged() ), this, SLOT( connectionsChanged() ) );
return select;
*/
return 0;
}
void QgsOWSRootItem::connectionsChanged()
{
refresh();
}

void QgsOWSRootItem::newConnection()
{
/*
QgsNewHttpConnection nc( 0, "/Qgis/connections-ows/" );
if ( nc.exec() )
{
refresh();
}
*/
}


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

static QStringList extensions = QStringList();
static QStringList wildcards = QStringList();

QGISEXTERN int dataCapabilities()
{
return QgsDataProvider::Net;
}

QGISEXTERN QgsDataItem * dataItem( QString thePath, QgsDataItem* parentItem )
{
if ( thePath.isEmpty() )
{
return new QgsOWSRootItem( parentItem, "OWS", "ows:" );
}

}

//QGISEXTERN QgsOWSSourceSelect * selectWidget( QWidget * parent, Qt::WFlags fl )
QGISEXTERN QDialog * selectWidget( QWidget * parent, Qt::WFlags fl )
{
//return new QgsOWSSourceSelect( parent, fl );
return 0;
}
42 changes: 42 additions & 0 deletions src/providers/ows/qgsowsdataitems.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#ifndef QGSOWSDATAITEMS_H
#define QGSOWSDATAITEMS_H

#include "qgsdataitem.h"
#include "qgsdatasourceuri.h"
class QgsOWSConnectionItem : public QgsDataCollectionItem
{
Q_OBJECT
public:
QgsOWSConnectionItem( QgsDataItem* parent, QString name, QString path );
~QgsOWSConnectionItem();

QVector<QgsDataItem*> createChildren();
virtual bool equal( const QgsDataItem *other );

virtual QList<QAction*> actions();

public slots:
void editConnection();
void deleteConnection();
};

class QgsOWSRootItem : public QgsDataCollectionItem
{
Q_OBJECT
public:
QgsOWSRootItem( QgsDataItem* parent, QString name, QString path );
~QgsOWSRootItem();

QVector<QgsDataItem*> createChildren();

virtual QList<QAction*> actions();

virtual QWidget * paramWidget();

public slots:
void connectionsChanged();

void newConnection();
};

#endif // QGSOWSDATAITEMS_H
65 changes: 65 additions & 0 deletions src/providers/ows/qgsowsprovider.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/***************************************************************************
qgsowsprovider.cpp - OWS meta provider for WMS,WFS,WCS in browser
-------------------
begin : 4/2012
copyright : (C) 2010 by Radim Blazek
email : radim dot blazek at gmail dot com
***************************************************************************/

/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#include "qgslogger.h"
#include "qgsowsprovider.h"
#include "qgsconfig.h"

#include <QString>

static QString PROVIDER_KEY = "ows";
static QString PROVIDER_DESCRIPTION = "OWS meta provider";

QgsOwsProvider::QgsOwsProvider( QString const & uri )
: QgsDataProvider( uri )
{
}

QgsOwsProvider::~QgsOwsProvider()
{
}

QGISEXTERN QgsOwsProvider * classFactory( const QString *uri )
{
return new QgsOwsProvider( *uri );
}

QString QgsOwsProvider::name() const
{
return PROVIDER_KEY;
}

QString QgsOwsProvider::description() const
{
return PROVIDER_DESCRIPTION;
}

QGISEXTERN QString providerKey()
{
return PROVIDER_KEY;
}

QGISEXTERN QString description()
{
return PROVIDER_DESCRIPTION;
}

QGISEXTERN bool isProvider()
{
return true;
}

66 changes: 66 additions & 0 deletions src/providers/ows/qgsowsprovider.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
/***************************************************************************
qgsowsprovider.h - OWS meta provider for WMS,WFS,WCS in browser
-------------------
begin : 4/2012
copyright : (C) 2012 by Radim Blazek
email : radim dot blazek at gmail dot com
***************************************************************************/

/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/

#ifndef QGSOWSPROVIDER_H
#define QGSOWSPROVIDER_H

#include "qgsdataprovider.h"
#include "qgscoordinatereferencesystem.h"
#include "qgsdataitem.h"
#include "qgsrectangle.h"

#include <QString>

/**
\brief Data provider for GDAL layers.
This provider implements the interface defined in the QgsDataProvider class
to provide access to spatial data residing in a GDAL layers.
*/
class QgsOwsProvider : public QgsDataProvider
{
Q_OBJECT

public:
/**
* Constructor for the provider.
*
* \param uri HTTP URL of the Web Server. If needed a proxy will be used
* otherwise we contact the host directly.
*
*/
QgsOwsProvider( QString const & uri = 0 );

//! Destructor
~QgsOwsProvider();

/* Pure virtuals */

QString name() const;

QString description() const;

QgsCoordinateReferenceSystem crs() { return QgsCoordinateReferenceSystem(); }

QgsRectangle extent() { return QgsRectangle(); }

bool isValid() { return false; }
};

#endif // QGSOWSPROVIDER_H
35 changes: 22 additions & 13 deletions src/providers/wfs/qgswfsdataitems.cpp
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
#include "qgswfsdataitems.h"

#include "qgswfsprovider.h"
#include "qgslogger.h"
#include "qgsnewhttpconnection.h"
#include "qgsowsconnection.h"
#include "qgswfscapabilities.h"
#include "qgswfsdataitems.h"
#include "qgswfsprovider.h"
#include "qgswfssourceselect.h"

#include "qgsnewhttpconnection.h"

#include <QSettings>
#include <QCoreApplication>

Expand All @@ -16,6 +15,8 @@ QgsWFSLayerItem::QgsWFSLayerItem( QgsDataItem* parent, QString name, QgsDataSour
{
mUri = QgsWFSCapabilities( uri.encodedUri() ).uriGetFeature( featureType );
mPopulated = true;
//mIcon = QIcon( getThemePixmap( "mIconVectorLayer.png" ) );
mIcon = QIcon( getThemePixmap( "mIconWfs.png" ) );
}

QgsWFSLayerItem::~QgsWFSLayerItem()
Expand All @@ -27,7 +28,7 @@ QgsWFSLayerItem::~QgsWFSLayerItem()
QgsWFSConnectionItem::QgsWFSConnectionItem( QgsDataItem* parent, QString name, QString path )
: QgsDataCollectionItem( parent, name, path ), mName( name ), mCapabilities( NULL )
{
mIcon = QIcon( getThemePixmap( "mIconConnect.png" ) );
mIcon = QIcon( getThemePixmap( "mIconWfs.png" ) );
}

QgsWFSConnectionItem::~QgsWFSConnectionItem()
Expand All @@ -38,9 +39,10 @@ QVector<QgsDataItem*> QgsWFSConnectionItem::createChildren()
{
mGotCapabilities = false;

QgsOWSConnection connection( "WFS", mName );
QgsDataSourceURI uri = connection.uri();
QString encodedUri = uri.encodedUri();
QString encodedUri = mPath;
QgsDataSourceURI uri;
uri.setEncodedUri ( encodedUri );
QgsDebugMsg( "encodedUri = " + encodedUri );

mCapabilities = new QgsWFSCapabilities( encodedUri );
connect( mCapabilities, SIGNAL( gotCapabilities() ), this, SLOT( gotCapabilities() ) );
Expand All @@ -65,7 +67,8 @@ QVector<QgsDataItem*> QgsWFSConnectionItem::createChildren()
}
else
{
layers.append( new QgsErrorItem( this, tr( "Failed to retrieve layers" ), mPath + "/error" ) );
//layers.append( new QgsErrorItem( this, tr( "Failed to retrieve layers" ), mPath + "/error" ) );
// TODO: show the error without adding child
}

mCapabilities->deleteLater();
Expand Down Expand Up @@ -136,7 +139,9 @@ QVector<QgsDataItem*> QgsWFSRootItem::createChildren()

foreach( QString connName, QgsOWSConnection::connectionList( "WFS" ) )
{
QgsDataItem * conn = new QgsWFSConnectionItem( this, connName, mPath + "/" + connName );
QgsOWSConnection connection( "WF", connName );
QgsDataItem * conn = new QgsWFSConnectionItem( this, connName, connection.uri().encodedUri() );
conn->setIcon ( QIcon( getThemePixmap( "mIconConnect.png" ) ) );
connections.append( conn );
}
return connections;
Expand Down Expand Up @@ -190,8 +195,12 @@ QGISEXTERN int dataCapabilities()

QGISEXTERN QgsDataItem * dataItem( QString thePath, QgsDataItem* parentItem )
{
Q_UNUSED( thePath );
QgsDebugMsg( "thePath = " + thePath );
if ( thePath.isEmpty() )
{
return new QgsWFSRootItem( parentItem, "WFS", "wfs:" );
}

return new QgsWFSRootItem( parentItem, "WFS", "wfs:" );
return new QgsWFSConnectionItem( parentItem, "WFS", thePath );
}

55 changes: 42 additions & 13 deletions src/providers/wms/qgswmsdataitems.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
QgsWMSConnectionItem::QgsWMSConnectionItem( QgsDataItem* parent, QString name, QString path )
: QgsDataCollectionItem( parent, name, path )
{
mIcon = QIcon( getThemePixmap( "mIconConnect.png" ) );
mIcon = QIcon( getThemePixmap( "mIconWms.png" ) );
}

QgsWMSConnectionItem::~QgsWMSConnectionItem()
Expand All @@ -23,18 +23,33 @@ QVector<QgsDataItem*> QgsWMSConnectionItem::createChildren()
{
QgsDebugMsg( "Entered" );
QVector<QgsDataItem*> children;
QgsWMSConnection connection( mName );
QgsWmsProvider *wmsProvider = connection.provider( );
if ( !wmsProvider )
return children;

QgsDataSourceURI uri = connection.uri();
QgsDebugMsg( "uri = " + uri.encodedUri() );
QString encodedUri = mPath;
QgsDataSourceURI uri;
uri.setEncodedUri ( encodedUri );
/*
if ( mPath.contains ( "url=" ) )
{
encodedUri = mPath;
uri.setEncodedUri ( encodedUri );
}
else
{
QgsWMSConnection connection( mName );
uri = connection.uri();
encodedUri = uri.encodedUri();
}
*/
QgsDebugMsg( "encodedUri = " + encodedUri );

QgsWmsProvider *wmsProvider = new QgsWmsProvider ( encodedUri );
if ( !wmsProvider ) return children;

// Attention: supportedLayers() gives tree leafes, not top level
if ( !wmsProvider->supportedLayers( mLayerProperties ) )
{
children.append( new QgsErrorItem( this, tr( "Failed to retrieve layers" ), mPath + "/error" ) );
//children.append( new QgsErrorItem( this, tr( "Failed to retrieve layers" ), mPath + "/error" ) );
// TODO: show the error without adding child
return children;
}

Expand Down Expand Up @@ -65,7 +80,12 @@ bool QgsWMSConnectionItem::equal( const QgsDataItem *other )
return false;
}
const QgsWMSConnectionItem *o = dynamic_cast<const QgsWMSConnectionItem *>( other );
return ( mPath == o->mPath && mName == o->mName && mConnInfo == o->mConnInfo );
if ( !o )
{
return false;
}

return ( mPath == o->mPath && mName == o->mName );
}

QList<QAction*> QgsWMSConnectionItem::actions()
Expand Down Expand Up @@ -126,7 +146,8 @@ QgsWMSLayerItem::QgsWMSLayerItem( QgsDataItem* parent, QString name, QString pat

if ( mChildren.size() == 0 )
{
mIcon = iconRaster();
//mIcon = iconRaster();
mIcon = QIcon( getThemePixmap( "mIconWms.png" ) );
}
mPopulated = true;
}
Expand Down Expand Up @@ -199,7 +220,11 @@ QVector<QgsDataItem*>QgsWMSRootItem::createChildren()

foreach( QString connName, QgsWMSConnection::connectionList() )
{
QgsDataItem * conn = new QgsWMSConnectionItem( this, connName, mPath + "/" + connName );
//QgsDataItem * conn = new QgsWMSConnectionItem( this, connName, mPath + "/" + connName );
QgsWMSConnection connection( connName );
QgsDataItem * conn = new QgsWMSConnectionItem( this, connName, connection.uri().encodedUri() );

conn->setIcon ( QIcon( getThemePixmap( "mIconConnect.png" ) ) );
connections.append( conn );
}
return connections;
Expand Down Expand Up @@ -253,7 +278,11 @@ QGISEXTERN int dataCapabilities()

QGISEXTERN QgsDataItem * dataItem( QString thePath, QgsDataItem* parentItem )
{
Q_UNUSED( thePath );
if ( thePath.isEmpty() )
{
return new QgsWMSRootItem( parentItem, "WMS", "wms:" );
}

return new QgsWMSRootItem( parentItem, "WMS", "wms:" );
// The path should contain encoded connection URI
return new QgsWMSConnectionItem( parentItem, "WMS", thePath );
}