Skip to content

Commit

Permalink
another fix for gml wkb assembly (fixes #14315)
Browse files Browse the repository at this point in the history
  • Loading branch information
jef-n committed Feb 16, 2016
1 parent 1ffccf0 commit d2679d6
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 19 deletions.
2 changes: 0 additions & 2 deletions src/core/geometry/qgsgeometry.cpp
Expand Up @@ -235,8 +235,6 @@ QgsGeometry* QgsGeometry::fromRect( const QgsRectangle& rect )


void QgsGeometry::fromWkb( unsigned char *wkb, int length ) void QgsGeometry::fromWkb( unsigned char *wkb, int length )
{ {
Q_UNUSED( length );

detach( false ); detach( false );


if ( d->geometry ) if ( d->geometry )
Expand Down
28 changes: 14 additions & 14 deletions src/core/qgsgml.cpp
Expand Up @@ -377,10 +377,10 @@ void QgsGml::endElement( const XML_Char* el )
else if ( theParseMode == feature && localName == mTypeName ) else if ( theParseMode == feature && localName == mTypeName )
{ {
Q_ASSERT( mCurrentFeature ); Q_ASSERT( mCurrentFeature );
if ( mCurrentWKBSize > 0 ) if ( mCurrentWKB.size() > 0 )
{ {
QgsGeometry *g = new QgsGeometry(); QgsGeometry *g = new QgsGeometry();
g->fromWkb( mCurrentWKB, mCurrentWKBSize ); g->fromWkb( mCurrentWKB, mCurrentWKB.size() );
mCurrentFeature->setGeometry( g ); mCurrentFeature->setGeometry( g );
mCurrentWKB = QgsWkbPtr( nullptr, 0 ); mCurrentWKB = QgsWkbPtr( nullptr, 0 );
} }
Expand Down Expand Up @@ -767,10 +767,10 @@ int QgsGml::getRingWKB( QgsWkbPtr &wkbPtr, const QList<QgsPoint>& ringCoordinate


int QgsGml::createMultiLineFromFragments() int QgsGml::createMultiLineFromFragments()
{ {
mCurrentWKBSize = 1 + 2 * sizeof( int ) + totalWKBFragmentSize(); int size = 1 + 2 * sizeof( int ) + totalWKBFragmentSize();
mCurrentWKB = QgsWkbPtr( new unsigned char[mCurrentWKBSize], mCurrentWKBSize ); mCurrentWKB = QgsWkbPtr( new unsigned char[size], size );


QgsWkbPtr wkbPtr( mCurrentWKB, mCurrentWKBSize ); QgsWkbPtr wkbPtr( mCurrentWKB );


wkbPtr << mEndian << QGis::WKBMultiLineString << mCurrentWKBFragments.constBegin()->size(); wkbPtr << mEndian << QGis::WKBMultiLineString << mCurrentWKBFragments.constBegin()->size();


Expand All @@ -790,8 +790,8 @@ int QgsGml::createMultiLineFromFragments()


int QgsGml::createMultiPointFromFragments() int QgsGml::createMultiPointFromFragments()
{ {
mCurrentWKBSize = 1 + 2 * sizeof( int ) + totalWKBFragmentSize(); int size = 1 + 2 * sizeof( int ) + totalWKBFragmentSize();
mCurrentWKB = QgsWkbPtr( new unsigned char[mCurrentWKBSize], mCurrentWKBSize ); mCurrentWKB = QgsWkbPtr( new unsigned char[size], size );


QgsWkbPtr wkbPtr( mCurrentWKB ); QgsWkbPtr wkbPtr( mCurrentWKB );
wkbPtr << mEndian << QGis::WKBMultiPoint << mCurrentWKBFragments.constBegin()->size(); wkbPtr << mEndian << QGis::WKBMultiPoint << mCurrentWKBFragments.constBegin()->size();
Expand All @@ -812,8 +812,8 @@ int QgsGml::createMultiPointFromFragments()


int QgsGml::createPolygonFromFragments() int QgsGml::createPolygonFromFragments()
{ {
mCurrentWKBSize = 1 + 2 * sizeof( int ) + totalWKBFragmentSize(); int size = 1 + 2 * sizeof( int ) + totalWKBFragmentSize();
mCurrentWKB = QgsWkbPtr( new unsigned char[mCurrentWKBSize], mCurrentWKBSize ); mCurrentWKB = QgsWkbPtr( new unsigned char[size], size );


QgsWkbPtr wkbPtr( mCurrentWKB ); QgsWkbPtr wkbPtr( mCurrentWKB );
wkbPtr << mEndian << QGis::WKBPolygon << mCurrentWKBFragments.constBegin()->size(); wkbPtr << mEndian << QGis::WKBPolygon << mCurrentWKBFragments.constBegin()->size();
Expand All @@ -833,12 +833,12 @@ int QgsGml::createPolygonFromFragments()


int QgsGml::createMultiPolygonFromFragments() int QgsGml::createMultiPolygonFromFragments()
{ {
mCurrentWKBSize = 0; int size = 0;
mCurrentWKBSize += 1 + 2 * sizeof( int ); size += 1 + 2 * sizeof( int );
mCurrentWKBSize += totalWKBFragmentSize(); size += totalWKBFragmentSize();
mCurrentWKBSize += mCurrentWKBFragments.size() * ( 1 + 2 * sizeof( int ) ); //fragments are just the rings size += mCurrentWKBFragments.size() * ( 1 + 2 * sizeof( int ) ); //fragments are just the rings


mCurrentWKB = QgsWkbPtr( new unsigned char[mCurrentWKBSize], mCurrentWKBSize ); mCurrentWKB = QgsWkbPtr( new unsigned char[size], size );


QgsWkbPtr wkbPtr( mCurrentWKB ); QgsWkbPtr wkbPtr( mCurrentWKB );
wkbPtr << ( char ) mEndian << QGis::WKBMultiPolygon << mCurrentWKBFragments.size(); wkbPtr << ( char ) mEndian << QGis::WKBMultiPolygon << mCurrentWKBFragments.size();
Expand Down
4 changes: 1 addition & 3 deletions src/core/qgsgml.h
Expand Up @@ -170,7 +170,7 @@ class CORE_EXPORT QgsGml : public QObject
int getRingWKB( QgsWkbPtr &wkbPtr, const QList<QgsPoint>& ringCoordinates ) const; int getRingWKB( QgsWkbPtr &wkbPtr, const QList<QgsPoint>& ringCoordinates ) const;
/** Creates a multiline from the information in mCurrentWKBFragments and /** Creates a multiline from the information in mCurrentWKBFragments and
* mCurrentWKBFragmentSizes. Assign the result. The multiline is in * mCurrentWKBFragmentSizes. Assign the result. The multiline is in
* mCurrentWKB and mCurrentWKBSize. The function deletes the memory in * mCurrentWKB. The function deletes the memory in
* mCurrentWKBFragments. Returns 0 in case of success. * mCurrentWKBFragments. Returns 0 in case of success.
*/ */
int createMultiLineFromFragments(); int createMultiLineFromFragments();
Expand Down Expand Up @@ -226,8 +226,6 @@ class CORE_EXPORT QgsGml : public QObject
int mFeatureCount; int mFeatureCount;
/** The total WKB for a feature*/ /** The total WKB for a feature*/
QgsWkbPtr mCurrentWKB; QgsWkbPtr mCurrentWKB;
/** The total WKB size for a feature*/
int mCurrentWKBSize;
QgsRectangle mCurrentExtent; QgsRectangle mCurrentExtent;
/** WKB intermediate storage during parsing. For points and lines, no /** WKB intermediate storage during parsing. For points and lines, no
* intermediate WKB is stored at all. For multipoints and multilines and * intermediate WKB is stored at all. For multipoints and multilines and
Expand Down

0 comments on commit d2679d6

Please sign in to comment.