Skip to content

Commit d0c3f4f

Browse files
committed
Merge pull request #730 from palmerj/wfs_client_fixes
WFS client fixes
2 parents 133398b + b54c981 commit d0c3f4f

File tree

6 files changed

+68
-13
lines changed

6 files changed

+68
-13
lines changed

src/core/qgsgml.cpp

+23-1
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,16 @@ int QgsGml::getFeatures( const QString& uri, QGis::WkbType* wkbType, QgsRectangl
8585

8686
//find out if there is a QGIS main window. If yes, display a progress dialog
8787
QProgressDialog* progressDialog = 0;
88-
QWidget* mainWindow = qApp->activeWindow();
88+
QWidget* mainWindow = 0;
89+
QWidgetList topLevelWidgets = qApp->topLevelWidgets();
90+
for ( QWidgetList::iterator it = topLevelWidgets.begin(); it != topLevelWidgets.end(); ++it )
91+
{
92+
if (( *it )->objectName() == "QgisApp" )
93+
{
94+
mainWindow = *it;
95+
break;
96+
}
97+
}
8998
if ( mainWindow )
9099
{
91100
progressDialog = new QProgressDialog( tr( "Loading GML data\n%1" ).arg( mTypeName ), tr( "Abort" ), 0, 0, mainWindow );
@@ -119,9 +128,22 @@ int QgsGml::getFeatures( const QString& uri, QGis::WkbType* wkbType, QgsRectangl
119128
QCoreApplication::processEvents();
120129
}
121130

131+
QNetworkReply::NetworkError replyError = reply->error();
132+
QString replyErrorString = reply->errorString();
133+
122134
delete reply;
123135
delete progressDialog;
124136

137+
if ( replyError )
138+
{
139+
QgsMessageLog::logMessage(
140+
tr( "GML Getfeature network request failed with error: %1" ).arg( replyErrorString ),
141+
tr( "Network" ),
142+
QgsMessageLog::CRITICAL
143+
);
144+
return 1;
145+
}
146+
125147
if ( *mWkbType != QGis::WKBNoGeometry )
126148
{
127149
if ( mExtent.isEmpty() )

src/core/qgsmimedatautils.cpp

+39-7
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
* (at your option) any later version. *
1313
* *
1414
***************************************************************************/
15+
#include <QStringList>
16+
1517
#include "qgsmimedatautils.h"
1618

1719
#include "qgsdataitem.h"
@@ -39,20 +41,50 @@ QgsMimeDataUtils::Uri::Uri( QgsLayerItem* layerItem )
3941

4042
QgsMimeDataUtils::Uri::Uri( QString& encData )
4143
{
42-
QRegExp rx( "^([^:]+):([^:]+):([^:]+):(.+)" );
43-
if ( rx.indexIn( encData ) != -1 )
44+
QStringList parts;
45+
QChar split = ':';
46+
QChar escape = '\\';
47+
QString part;
48+
bool inEscape = false;
49+
for (int i = 0; i < encData.length(); ++i)
50+
{
51+
if (encData.at(i) == escape && !inEscape)
52+
{
53+
inEscape = true;
54+
}
55+
else if (encData.at(i) == split && !inEscape)
56+
{
57+
parts << part;
58+
part = "";
59+
}
60+
else
61+
{
62+
part += encData.at(i);
63+
inEscape = false;
64+
}
65+
}
66+
if (!part.isEmpty())
67+
{
68+
parts << part;
69+
}
70+
71+
if ( parts.size() == 4 )
4472
{
45-
layerType = rx.cap( 1 );
46-
providerKey = rx.cap( 2 );
47-
name = rx.cap( 3 );
48-
uri = rx.cap( 4 );
73+
layerType = parts[0];
74+
providerKey = parts[1];
75+
name = parts[2];
76+
uri = parts[3];
4977
QgsDebugMsg( "type: " + layerType + " key: " + providerKey + " name: " + name + " uri: " + uri );
5078
}
5179
}
5280

5381
QString QgsMimeDataUtils::Uri::data() const
5482
{
55-
return layerType + ":" + providerKey + ":" + name + ":" + uri;
83+
QString escapedName = name;
84+
QString escapeUri = uri;
85+
escapedName.replace(":", "\\:");
86+
escapeUri.replace(":", "\\:");
87+
return layerType + ":" + providerKey + ":" + escapedName + ":" + escapeUri;
5688
}
5789

5890
// -----

src/providers/wfs/qgswfsdataitems.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@
2424
#include <QCoreApplication>
2525

2626

27-
QgsWFSLayerItem::QgsWFSLayerItem( QgsDataItem* parent, QString name, QgsDataSourceURI uri, QString featureType, QString title )
27+
QgsWFSLayerItem::QgsWFSLayerItem( QgsDataItem* parent, QString name, QgsDataSourceURI uri, QString featureType, QString title, QString crsString )
2828
: QgsLayerItem( parent, title, parent->path() + "/" + name, QString(), QgsLayerItem::Vector, "WFS" )
2929
{
30-
mUri = QgsWFSCapabilities( uri.encodedUri() ).uriGetFeature( featureType );
30+
mUri = QgsWFSCapabilities( uri.encodedUri() ).uriGetFeature( featureType, crsString );
3131
mPopulated = true;
3232
mIcon = QgsApplication::getThemeIcon( "mIconWfs.svg" );
3333
}
@@ -74,7 +74,7 @@ QVector<QgsDataItem*> QgsWFSConnectionItem::createChildren()
7474
foreach ( const QgsWFSCapabilities::FeatureType& featureType, caps.featureTypes )
7575
{
7676
//QgsWFSLayerItem* layer = new QgsWFSLayerItem( this, mName, featureType.name, featureType.title );
77-
QgsWFSLayerItem* layer = new QgsWFSLayerItem( this, mName, uri, featureType.name, featureType.title );
77+
QgsWFSLayerItem* layer = new QgsWFSLayerItem( this, mName, uri, featureType.name, featureType.title, featureType.crslist.first() );
7878
layers.append( layer );
7979
}
8080
}

src/providers/wfs/qgswfsdataitems.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class QgsWFSConnectionItem : public QgsDataCollectionItem
6969
class QgsWFSLayerItem : public QgsLayerItem
7070
{
7171
public:
72-
QgsWFSLayerItem( QgsDataItem* parent, QString name, QgsDataSourceURI uri, QString featureType, QString title );
72+
QgsWFSLayerItem( QgsDataItem* parent, QString name, QgsDataSourceURI uri, QString featureType, QString title, QString crsString );
7373
~QgsWFSLayerItem();
7474

7575
};

src/providers/wfs/qgswfssourceselect.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,8 @@ void QgsWFSSourceSelect::capabilitiesReplyFinished()
207207
}
208208
// handle errors
209209
QMessageBox::critical( 0, title, mCapabilities->errorMessage() );
210+
211+
mAddButton->setEnabled( false );
210212
return;
211213
}
212214

src/providers/wfs/qgswfssourceselect.h

-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@ class QgsWFSSourceSelect: public QDialog, private Ui::QgsWFSSourceSelectBase
6060
The first string is the typename, the corresponding list
6161
stores the CRS for the typename in the form 'EPSG:XXXX'*/
6262
std::map<QString, std::list<QString> > mAvailableCRS;
63-
QAbstractButton* btnAdd;
6463
QgsWFSCapabilities* mCapabilities;
6564
QString mUri; // data source URI
6665
QgsWFSItemDelegate* mItemDelegate;

0 commit comments

Comments
 (0)