Skip to content

Commit 06f864f

Browse files
author
mhugent
committed
Some modifications for portable WFS support: Moved QgsHttpTransaction to the core library, moved GetCapabilities methods from the wfs provider to the plugin (to class QgsWFSSourceSelect)
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@5918 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 7e7985d commit 06f864f

File tree

10 files changed

+115
-108
lines changed

10 files changed

+115
-108
lines changed

src/core/Makefile.am

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ libqgis_coreHEADERS = \
6161
qgsfield.h \
6262
qgsgeometry.h \
6363
qgsgeometryvertexindex.h \
64+
qgshttptransaction.h \
6465
qgslabelattributes.h \
6566
qgsline.h \
6667
qgslinesymbol.h \
@@ -95,6 +96,7 @@ libqgis_coreHEADERS = \
9596
libqgis_core_la_MOC = \
9697
qgscontexthelp.moc.cpp \
9798
qgsdataprovider.moc.cpp \
99+
qgshttptransaction.moc.cpp \
98100
qgsrasterdataprovider.moc.cpp
99101

100102
libqgis_core_la_SOURCES =\
@@ -114,6 +116,7 @@ libqgis_core_la_SOURCES =\
114116
qgsfield.cpp \
115117
qgsgeometry.cpp \
116118
qgsgeometryvertexindex.cpp \
119+
qgshttptransaction.cpp \
117120
qgslabelattributes.cpp \
118121
qgsline.cpp \
119122
qgslinesymbol.cpp \

src/plugins/wfs/Makefile.am

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,7 @@ BUILT_SOURCES = $(plugin_MOC) $(plugin_UI)
5959
wfsplugin_la_LIBADD = $(QT_LDADD) \
6060
$(GDAL_LDADD) \
6161
../../core/libqgis_core.la \
62-
../../gui/libqgis_gui.la \
63-
../../providers/wfs/libwfsprovider.la
62+
../../gui/libqgis_gui.la
6463

6564
wfsplugin_la_CFLAGS = $(CFLAGS) $(EXTRA_CFLAGS) $(DEBUG_QGIS)
6665
wfsplugin_la_CXXFLAGS = $(CXXFLAGS) \

src/plugins/wfs/qgswfssourceselect.cpp

Lines changed: 90 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,16 @@
1717

1818
#include "qgisiface.h"
1919
#include "qgswfssourceselect.h"
20-
#include "../../providers/wfs/qgswfsprovider.h"
2120
#include "qgsnewhttpconnection.h"
2221
#include "qgslayerprojectionselector.h"
22+
#include "qgshttptransaction.h"
23+
#include <QDomDocument>
2324
#include <QListWidgetItem>
2425
#include <QMessageBox>
2526
#include <QSettings>
2627

28+
static const QString WFS_NAMESPACE = "http://www.opengis.net/wfs";
29+
2730
QgsWFSSourceSelect::QgsWFSSourceSelect(QWidget* parent, QgisIface* iface): QDialog(parent), mIface(iface)
2831
{
2932
setupUi(this);
@@ -75,6 +78,91 @@ void QgsWFSSourceSelect::populateConnectionList()
7578
}
7679
}
7780

81+
int QgsWFSSourceSelect::getCapabilities(const QString& uri, QgsWFSSourceSelect::REQUEST_ENCODING e, std::list<QString>& typenames, std::list< std::list<QString> >& crs)
82+
{
83+
switch(e)
84+
{
85+
case QgsWFSSourceSelect::GET:
86+
return getCapabilitiesGET(uri, typenames, crs);
87+
case QgsWFSSourceSelect::POST:
88+
return getCapabilitiesPOST(uri, typenames, crs);
89+
case QgsWFSSourceSelect::SOAP:
90+
return getCapabilitiesSOAP(uri, typenames, crs);
91+
}
92+
return 1;
93+
}
94+
95+
int QgsWFSSourceSelect::getCapabilitiesGET(const QString& uri, std::list<QString>& typenames, std::list< std::list<QString> >& crs)
96+
{
97+
QString request = uri + "SERVICE=WFS&REQUEST=GetCapabilities&VERSION=1.1.1";
98+
QByteArray result;
99+
QgsHttpTransaction http(request);
100+
http.getSynchronously(result);
101+
102+
QDomDocument capabilitiesDocument;
103+
if(!capabilitiesDocument.setContent(result, true))
104+
{
105+
return 1; //error
106+
}
107+
108+
109+
110+
//get the <FeatureType> elements
111+
QDomNodeList featureTypeList = capabilitiesDocument.elementsByTagNameNS(WFS_NAMESPACE, "FeatureType");
112+
for(unsigned int i = 0; i < featureTypeList.length(); ++i)
113+
{
114+
QDomElement featureTypeElem = featureTypeList.at(i).toElement();
115+
std::list<QString> featureSRSList; //SRS list for this feature
116+
117+
//Name
118+
QDomNodeList nameList = featureTypeElem.elementsByTagNameNS(WFS_NAMESPACE, "Name");
119+
if(nameList.length() > 0)
120+
{
121+
typenames.push_back(nameList.at(0).toElement().text());
122+
}
123+
124+
//DefaultSRS is always the first entry in the feature crs list
125+
QDomNodeList defaultSRSList = featureTypeElem.elementsByTagNameNS(WFS_NAMESPACE, "DefaultSRS");
126+
if(defaultSRSList.length() > 0)
127+
{
128+
featureSRSList.push_back(defaultSRSList.at(0).toElement().text());
129+
}
130+
131+
//OtherSRS
132+
QDomNodeList otherSRSList = featureTypeElem.elementsByTagNameNS(WFS_NAMESPACE, "OtherSRS");
133+
for(unsigned int i = 0; i < otherSRSList.length(); ++i)
134+
{
135+
featureSRSList.push_back(otherSRSList.at(i).toElement().text());
136+
}
137+
138+
//Support <SRS> for compatibility with older versions
139+
QDomNodeList srsList = featureTypeElem.elementsByTagNameNS(WFS_NAMESPACE, "SRS");
140+
for(unsigned int i = 0; i < srsList.length(); ++i)
141+
{
142+
featureSRSList.push_back(srsList.at(i).toElement().text());
143+
}
144+
145+
crs.push_back(featureSRSList);
146+
}
147+
148+
149+
//print out result for a test
150+
QString resultString(result);
151+
qWarning(resultString);
152+
153+
return 0;
154+
}
155+
156+
int QgsWFSSourceSelect::getCapabilitiesPOST(const QString& uri, std::list<QString>& typenames, std::list< std::list<QString> >& crs)
157+
{
158+
return 1; //soon...
159+
}
160+
161+
int QgsWFSSourceSelect::getCapabilitiesSOAP(const QString& uri, std::list<QString>& typenames, std::list< std::list<QString> >& crs)
162+
{
163+
return 1; //soon...
164+
}
165+
78166
void QgsWFSSourceSelect::addEntryToServerList()
79167
{
80168
QgsNewHttpConnection *nc = new QgsNewHttpConnection(this, "/Qgis/connections-wfs/");
@@ -121,7 +209,7 @@ void QgsWFSSourceSelect::connectToServer()
121209
//make a GetCapabilities request
122210
std::list<QString> typenames;
123211
std::list< std::list<QString> > crsList;
124-
if(QgsWFSProvider::getCapabilities(mUri, QgsWFSProvider::GET, typenames, crsList) != 0)
212+
if(getCapabilities(mUri, QgsWFSSourceSelect::GET, typenames, crsList) != 0)
125213
{
126214
qWarning("error during GetCapabilities request");
127215
}

src/plugins/wfs/qgswfssourceselect.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,14 @@ class QgsWFSSourceSelect: public QDialog, private Ui::QgsWFSSourceSelectBase
2727
{
2828
Q_OBJECT
2929
public:
30+
31+
enum REQUEST_ENCODING
32+
{
33+
GET,
34+
POST,
35+
SOAP /*Note that this goes also through HTTP POST but additionally uses soap envelope and friends*/
36+
};
37+
3038
QgsWFSSourceSelect(QWidget* parent, QgisIface* iface);
3139
~QgsWFSSourceSelect();
3240

@@ -41,6 +49,17 @@ class QgsWFSSourceSelect: public QDialog, private Ui::QgsWFSSourceSelectBase
4149
std::map<QString, std::list<QString> > mAvailableCRS;
4250
void populateConnectionList();
4351

52+
/**Makes a GetCapabilities and returns the typenamse and crs supported by the server.
53+
@param typenames a list of layers provided by the server
54+
@param a list of crs supported by the server. The place in the list corresponds to the \
55+
typenames list (means that the crs list at position 0 is a crs for typename at position 0 etc.)
56+
@return 0 in case of success*/
57+
int getCapabilities(const QString& uri, QgsWFSSourceSelect::REQUEST_ENCODING e, std::list<QString>& typenames, std::list< std::list<QString> >& crs);
58+
//encoding specific methods of getCapabilities
59+
int getCapabilitiesGET(const QString& uri, std::list<QString>& typenames, std::list< std::list<QString> >& crs);
60+
int getCapabilitiesPOST(const QString& uri, std::list<QString>& typenames, std::list< std::list<QString> >& crs);
61+
int getCapabilitiesSOAP(const QString& uri, std::list<QString>& typenames, std::list< std::list<QString> >& crs);
62+
4463
private slots:
4564
void addEntryToServerList();
4665
void modifyEntryOfServerList();

src/providers/wfs/Makefile.am

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,10 @@ INCLUDES = -I../../core/ -I../../gui/ -I../../ui
33
%.moc.cpp: %.h
44
$(MOC) -o $@ $<
55

6-
libwfsprovider_MOC = qgshttptransaction.moc.cpp
7-
86
plugindir = ${pkglibdir}
97
plugin_LTLIBRARIES = libwfsprovider.la
108

11-
libwfsprovider_la_SOURCES = qgswfsprovider.cpp qgshttptransaction.cpp $(libwfsprovider_MOC)
9+
libwfsprovider_la_SOURCES = qgswfsprovider.cpp $(libwfsprovider_MOC)
1210

1311
BUILT_SOURCES = $(wfsprovider_MOC)
1412

src/providers/wfs/qgswfsprovider.cpp

Lines changed: 0 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -246,20 +246,6 @@ void QgsWFSProvider::select(QgsRect *mbr, bool useIntersect)
246246
mFeatureIterator = mSelectedFeatures->begin();
247247
}
248248

249-
int QgsWFSProvider::getCapabilities(const QString& uri, QgsWFSProvider::REQUEST_ENCODING e, std::list<QString>& typenames, std::list< std::list<QString> >& crs)
250-
{
251-
switch(e)
252-
{
253-
case QgsWFSProvider::GET:
254-
return getCapabilitiesGET(uri, typenames, crs);
255-
case QgsWFSProvider::POST:
256-
return getCapabilitiesPOST(uri, typenames, crs);
257-
case QgsWFSProvider::SOAP:
258-
return getCapabilitiesSOAP(uri, typenames, crs);
259-
}
260-
return 1;
261-
}
262-
263249
int QgsWFSProvider::getFeature(const QString& uri)
264250
{
265251
//GET or SOAP?
@@ -319,77 +305,6 @@ int QgsWFSProvider::describeFeatureType(const QString& uri, std::vector<QgsField
319305
return 1;
320306
}
321307

322-
int QgsWFSProvider::getCapabilitiesGET(const QString& uri, std::list<QString>& typenames, std::list< std::list<QString> >& crs)
323-
{
324-
QString request = uri + "SERVICE=WFS&REQUEST=GetCapabilities&VERSION=1.1.1";
325-
QByteArray result;
326-
QgsHttpTransaction http(request);
327-
http.getSynchronously(result);
328-
329-
QDomDocument capabilitiesDocument;
330-
if(!capabilitiesDocument.setContent(result, true))
331-
{
332-
return 1; //error
333-
}
334-
335-
336-
337-
//get the <FeatureType> elements
338-
QDomNodeList featureTypeList = capabilitiesDocument.elementsByTagNameNS(WFS_NAMESPACE, "FeatureType");
339-
for(unsigned int i = 0; i < featureTypeList.length(); ++i)
340-
{
341-
QDomElement featureTypeElem = featureTypeList.at(i).toElement();
342-
std::list<QString> featureSRSList; //SRS list for this feature
343-
344-
//Name
345-
QDomNodeList nameList = featureTypeElem.elementsByTagNameNS(WFS_NAMESPACE, "Name");
346-
if(nameList.length() > 0)
347-
{
348-
typenames.push_back(nameList.at(0).toElement().text());
349-
}
350-
351-
//DefaultSRS is always the first entry in the feature crs list
352-
QDomNodeList defaultSRSList = featureTypeElem.elementsByTagNameNS(WFS_NAMESPACE, "DefaultSRS");
353-
if(defaultSRSList.length() > 0)
354-
{
355-
featureSRSList.push_back(defaultSRSList.at(0).toElement().text());
356-
}
357-
358-
//OtherSRS
359-
QDomNodeList otherSRSList = featureTypeElem.elementsByTagNameNS(WFS_NAMESPACE, "OtherSRS");
360-
for(unsigned int i = 0; i < otherSRSList.length(); ++i)
361-
{
362-
featureSRSList.push_back(otherSRSList.at(i).toElement().text());
363-
}
364-
365-
//Support <SRS> for compatibility with older versions
366-
QDomNodeList srsList = featureTypeElem.elementsByTagNameNS(WFS_NAMESPACE, "SRS");
367-
for(unsigned int i = 0; i < srsList.length(); ++i)
368-
{
369-
featureSRSList.push_back(srsList.at(i).toElement().text());
370-
}
371-
372-
crs.push_back(featureSRSList);
373-
}
374-
375-
376-
//print out result for a test
377-
QString resultString(result);
378-
qWarning(resultString);
379-
380-
return 0;
381-
}
382-
383-
int QgsWFSProvider::getCapabilitiesPOST(const QString& uri, std::list<QString>& typenames, std::list< std::list<QString> >& crs)
384-
{
385-
return 1; //soon...
386-
}
387-
388-
int QgsWFSProvider::getCapabilitiesSOAP(const QString& uri, std::list<QString>& typenames, std::list< std::list<QString> >& crs)
389-
{
390-
return 1; //soon...
391-
}
392-
393308
int QgsWFSProvider::getFeatureGET(const QString& uri, const QString& geometryAttribute)
394309
{
395310
//assemble request string

src/providers/wfs/qgswfsprovider.h

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,6 @@ class QgsWFSProvider: public QgsVectorDataProvider
6565
results. Posibilities are GET, POST, SOAP*/
6666
void setEncoding(QgsWFSProvider::REQUEST_ENCODING e) {mEncoding = e;}
6767

68-
/**Makes a GetCapabilities and returns the typenamse and crs supported by the server. This function is static because it is usually used from dialogs when no WFS provider object yet exists.
69-
@param typenames a list of layers provided by the server
70-
@param a list of crs supported by the server. The place in the list corresponds to the \
71-
typenames list (means that the crs list at position 0 is a crs for typename at position 0 etc.)
72-
@return 0 in case of success*/
73-
static int getCapabilities(const QString& uri, QgsWFSProvider::REQUEST_ENCODING e, std::list<QString>& typenames, std::list< std::list<QString> >& crs);
74-
7568
/**Makes a GetFeatures, receives the features from the wfs server (as GML), converts them to QgsFeature and \
7669
stores them in a vector*/
7770
int getFeature(const QString& uri);
@@ -113,10 +106,6 @@ class QgsWFSProvider: public QgsVectorDataProvider
113106
/**Collects information about the field types. Is called internally from QgsWFSProvider::getFeature*/
114107
int describeFeatureType(const QString& uri, std::vector<QgsField>& fields);
115108

116-
//encoding specific methods of getCapabilities
117-
static int getCapabilitiesGET(const QString& uri, std::list<QString>& typenames, std::list< std::list<QString> >& crs);
118-
static int getCapabilitiesPOST(const QString& uri, std::list<QString>& typenames, std::list< std::list<QString> >& crs);
119-
static int getCapabilitiesSOAP(const QString& uri, std::list<QString>& typenames, std::list< std::list<QString> >& crs);
120109
//encoding specific methods of getFeature
121110
int getFeatureGET(const QString& uri, const QString& geometryAttribute);
122111
int getFeaturePOST(const QString& uri, const QString& geometryAttribute);

src/providers/wms/Makefile.am

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,13 @@ plugin_LTLIBRARIES = wmsprovider.la
1010
## non-uic files generated from MOC
1111

1212
wmsprovider_MOC = qgswmsprovider.moc.cpp \
13-
qgshttptransaction.moc.cpp \
1413
../../core/qgsdataprovider.moc.cpp \
1514
../../core/qgsrasterdataprovider.moc.cpp
1615

1716
wmsprovider_la_SOURCES = \
1817
qgswmsprovider.cpp \
1918
qgswmsprovider.moc.cpp \
20-
qgswmsprovider.h \
21-
qgshttptransaction.cpp \
22-
qgshttptransaction.moc.cpp \
23-
qgshttptransaction.h
19+
qgswmsprovider.h
2420

2521
BUILT_SOURCES = $(wmsprovider_MOC)
2622

0 commit comments

Comments
 (0)