2 changes: 1 addition & 1 deletion src/providers/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ ENDIF (SPATIALITE_FOUND OR WITH_INTERNAL_SPATIALITE)

IF (EXPAT_FOUND)
ADD_SUBDIRECTORY(gpx)
# ADD_SUBDIRECTORY(wfs) # TODO: enable when migrated to new api
ADD_SUBDIRECTORY(wfs)
ENDIF (EXPAT_FOUND)

IF (GRASS_FOUND)
Expand Down
1 change: 1 addition & 0 deletions src/providers/wfs/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ SET(WFS_SRCS
qgswfscapabilities.cpp
qgswfsdataitems.cpp
qgswfsdata.cpp
qgswfsfeatureiterator.cpp
qgswfssourceselect.cpp
qgswfsutils.cpp
)
Expand Down
5 changes: 4 additions & 1 deletion src/providers/wfs/qgswfsdata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,8 @@ void QgsWFSData::startElement( const XML_Char* el, const XML_Char** attr )
else if ( elementName == GML_NAMESPACE + NS_SEPARATOR + "featureMember" )
{
mCurrentFeature = new QgsFeature( mFeatureCount );
QgsAttributes attributes( mThematicAttributes.size() ); //add empty attributes
mCurrentFeature->setAttributes( attributes );
mParseModeStack.push( QgsWFSData::featureMember );
}
else if ( localName == mTypeName )
Expand Down Expand Up @@ -277,7 +279,8 @@ void QgsWFSData::endElement( const XML_Char* el )
var = QVariant( mStringCash );
break;
}
mCurrentFeature->addAttribute( att_it.value().first, QVariant( mStringCash ) );

mCurrentFeature->setAttribute( att_it.value().first, QVariant( mStringCash ) );
}
}
else if ( localName == mGeometryAttribute )
Expand Down
1 change: 1 addition & 0 deletions src/providers/wfs/qgswfsdata.h
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ class QgsWFSData: public QObject
/**This contains the character data if an important element has been encountered*/
QString mStringCash;
QgsFeature* mCurrentFeature;
QVector<QVariant> mCurrentAttributes; //attributes of current feature
QString mCurrentFeatureId;
int mFeatureCount;
/**The total WKB for a feature*/
Expand Down
88 changes: 88 additions & 0 deletions src/providers/wfs/qgswfsfeatureiterator.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
#include "qgswfsfeatureiterator.h"
#include "qgsspatialindex.h"
#include "qgswfsprovider.h"

QgsWFSFeatureIterator::QgsWFSFeatureIterator( QgsWFSProvider* provider, const QgsFeatureRequest& request ):
QgsAbstractFeatureIterator( request ), mProvider( provider )
{
//select ids
//get iterator
if ( !mProvider )
{
return;
}

if ( mProvider->mActiveIterator )
{
mProvider->mActiveIterator->close();
}
mProvider->mActiveIterator = this;

switch ( request.filterType() )
{
case QgsFeatureRequest::FilterRect:
if ( mProvider->mSpatialIndex )
{
mSelectedFeatures = mProvider->mSpatialIndex->intersects( request.filterRect() );
}
break;
case QgsFeatureRequest::FilterFid:
mSelectedFeatures.push_back( request.filterFid() );
break;
case QgsFeatureRequest::FilterNone:
mSelectedFeatures = mProvider->mFeatures.keys();
default: //QgsFeatureRequest::FilterNone
mSelectedFeatures = mProvider->mFeatures.keys();
}

mFeatureIterator = mSelectedFeatures.constBegin();
}

QgsWFSFeatureIterator::~QgsWFSFeatureIterator()
{

}

bool QgsWFSFeatureIterator::nextFeature( QgsFeature& f )
{
if ( !mProvider )
{
return false;
}

if ( mFeatureIterator == mSelectedFeatures.constEnd() )
{
return false;
}

QMap<QgsFeatureId, QgsFeature* >::iterator it = mProvider->mFeatures.find( *mFeatureIterator );
if ( it == mProvider->mFeatures.end() )
{
return false;
}
QgsFeature* fet = it.value();
mProvider->copyFeature( fet, f, !( mRequest.flags() & QgsFeatureRequest::NoGeometry ), mRequest.subsetOfAttributes() );
++mFeatureIterator;
return true;
}

bool QgsWFSFeatureIterator::rewind()
{
if ( !mProvider )
{
return false;
}

mFeatureIterator = mSelectedFeatures.constBegin();
}

bool QgsWFSFeatureIterator::close()
{
if ( !mProvider )
{
return false;
}
mProvider->mActiveIterator = 0;
mProvider = 0;
return true;
}
24 changes: 24 additions & 0 deletions src/providers/wfs/qgswfsfeatureiterator.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#ifndef QGSWFSFEATUREITERATOR_H
#define QGSWFSFEATUREITERATOR_H

#include "qgsfeatureiterator.h"

class QgsWFSProvider;

class QgsWFSFeatureIterator: public QgsAbstractFeatureIterator
{
public:
QgsWFSFeatureIterator( QgsWFSProvider* provider, const QgsFeatureRequest& request );
~QgsWFSFeatureIterator();

bool nextFeature( QgsFeature& f );
bool rewind();
bool close();

private:
QgsWFSProvider* mProvider;
QList<QgsFeatureId> mSelectedFeatures;
QList<QgsFeatureId>::const_iterator mFeatureIterator;
};

#endif // QGSWFSFEATUREITERATOR_H
Loading