Skip to content

Commit d05c31e

Browse files
committed
fix gml wkb assembly
1 parent 4a8b49b commit d05c31e

File tree

4 files changed

+33
-22
lines changed

4 files changed

+33
-22
lines changed

src/core/geometry/qgswkbptr.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ QgsWkbPtr::QgsWkbPtr( unsigned char *p, int size )
2121
mEnd = mP + size;
2222
}
2323

24+
void QgsWkbPtr::verifyBound( int size ) const
25+
{
26+
if ( !mP || mP + size > mEnd )
27+
throw QgsWkbException( "wkb access out of bounds" );
28+
}
29+
2430
QgsConstWkbPtr::QgsConstWkbPtr( const unsigned char *p, int size )
2531
{
2632
mP = const_cast< unsigned char * >( p );
@@ -42,3 +48,9 @@ QgsWKBTypes::Type QgsConstWkbPtr::readHeader() const
4248

4349
return static_cast<QgsWKBTypes::Type>( wkbType );
4450
}
51+
52+
void QgsConstWkbPtr::verifyBound( int size ) const
53+
{
54+
if ( !mP || mP + size > mEnd )
55+
throw QgsWkbException( "wkb access out of bounds" );
56+
}

src/core/geometry/qgswkbptr.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class CORE_EXPORT QgsWkbPtr
4040
unsigned char *mStart;
4141
unsigned char *mEnd;
4242

43-
void verifyBound( int size ) const { if ( !mP || mP + size > mEnd ) throw QgsWkbException( "wkb access out of bounds" ); }
43+
void verifyBound( int size ) const;
4444

4545
template<typename T> void read( T& v ) const
4646
{
@@ -93,7 +93,7 @@ class CORE_EXPORT QgsConstWkbPtr
9393
unsigned char *mEnd;
9494
mutable bool mEndianSwap;
9595

96-
void verifyBound( int size ) const { if ( !mP || mP + size > mEnd ) throw QgsWkbException( "wkb access out of bounds" ); }
96+
void verifyBound( int size ) const;
9797

9898
template<typename T> void read( T& v ) const
9999
{

src/core/qgsgml.cpp

+18-19
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ int QgsGml::getFeatures( const QString& uri, QGis::WkbType* wkbType, QgsRectangl
110110
QProgressDialog* progressDialog = nullptr;
111111
QWidget* mainWindow = nullptr;
112112
QWidgetList topLevelWidgets = qApp->topLevelWidgets();
113-
for ( QWidgetList::iterator it = topLevelWidgets.begin(); it != topLevelWidgets.end(); ++it )
113+
for ( QWidgetList::const_iterator it = topLevelWidgets.constBegin(); it != topLevelWidgets.constEnd(); ++it )
114114
{
115115
if (( *it )->objectName() == "QgisApp" )
116116
{
@@ -417,7 +417,7 @@ void QgsGml::endElement( const XML_Char* el )
417417
if ( theParseMode == QgsGml::geometry )
418418
{
419419
//directly add WKB point to the feature
420-
if ( getPointWKB( mCurrentWKB, *( pointList.begin() ) ) != 0 )
420+
if ( getPointWKB( mCurrentWKB, *( pointList.constBegin() ) ) != 0 )
421421
{
422422
//error
423423
}
@@ -430,7 +430,7 @@ void QgsGml::endElement( const XML_Char* el )
430430
else //multipoint, add WKB as fragment
431431
{
432432
QgsWkbPtr wkbPtr( nullptr, 0 );
433-
if ( getPointWKB( wkbPtr, *( pointList.begin() ) ) != 0 )
433+
if ( getPointWKB( wkbPtr, *( pointList.constBegin() ) ) != 0 )
434434
{
435435
//error
436436
}
@@ -739,7 +739,7 @@ int QgsGml::getLineWKB( QgsWkbPtr &wkbPtr, const QList<QgsPoint>& lineCoordinate
739739
fillPtr << mEndian << QGis::WKBLineString << lineCoordinates.size();
740740

741741
QList<QgsPoint>::const_iterator iter;
742-
for ( iter = lineCoordinates.begin(); iter != lineCoordinates.end(); ++iter )
742+
for ( iter = lineCoordinates.constBegin(); iter != lineCoordinates.constEnd(); ++iter )
743743
{
744744
fillPtr << iter->x() << iter->y();
745745
}
@@ -757,7 +757,7 @@ int QgsGml::getRingWKB( QgsWkbPtr &wkbPtr, const QList<QgsPoint>& ringCoordinate
757757
fillPtr << ringCoordinates.size();
758758

759759
QList<QgsPoint>::const_iterator iter;
760-
for ( iter = ringCoordinates.begin(); iter != ringCoordinates.end(); ++iter )
760+
for ( iter = ringCoordinates.constBegin(); iter != ringCoordinates.constEnd(); ++iter )
761761
{
762762
fillPtr << iter->x() << iter->y();
763763
}
@@ -772,12 +772,11 @@ int QgsGml::createMultiLineFromFragments()
772772

773773
QgsWkbPtr wkbPtr( mCurrentWKB, mCurrentWKBSize );
774774

775-
wkbPtr << mEndian << QGis::WKBMultiLineString << mCurrentWKBFragments.begin()->size();
776-
777-
QList<QgsWkbPtr>::iterator wkbIt = mCurrentWKBFragments.begin()->begin();
775+
wkbPtr << mEndian << QGis::WKBMultiLineString << mCurrentWKBFragments.constBegin()->size();
778776

779777
//copy (and delete) all the wkb fragments
780-
for ( ; wkbIt != mCurrentWKBFragments.begin()->end(); ++wkbIt )
778+
QList<QgsWkbPtr>::const_iterator wkbIt = mCurrentWKBFragments.constBegin()->constBegin();
779+
for ( ; wkbIt != mCurrentWKBFragments.constBegin()->constEnd(); ++wkbIt )
781780
{
782781
memcpy( wkbPtr, *wkbIt, wkbIt->size() );
783782
wkbPtr += wkbIt->size();
@@ -795,10 +794,10 @@ int QgsGml::createMultiPointFromFragments()
795794
mCurrentWKB = QgsWkbPtr( new unsigned char[mCurrentWKBSize], mCurrentWKBSize );
796795

797796
QgsWkbPtr wkbPtr( mCurrentWKB );
798-
wkbPtr << mEndian << QGis::WKBMultiPoint << mCurrentWKBFragments.begin()->size();
797+
wkbPtr << mEndian << QGis::WKBMultiPoint << mCurrentWKBFragments.constBegin()->size();
799798

800-
QList<QgsWkbPtr>::iterator wkbIt = mCurrentWKBFragments.begin()->begin();
801-
for ( ; wkbIt != mCurrentWKBFragments.begin()->end(); ++wkbIt )
799+
QList<QgsWkbPtr>::const_iterator wkbIt = mCurrentWKBFragments.constBegin()->constBegin();
800+
for ( ; wkbIt != mCurrentWKBFragments.constBegin()->constEnd(); ++wkbIt )
802801
{
803802
memcpy( wkbPtr, *wkbIt, wkbIt->size() );
804803
wkbPtr += wkbIt->size();
@@ -817,10 +816,10 @@ int QgsGml::createPolygonFromFragments()
817816
mCurrentWKB = QgsWkbPtr( new unsigned char[mCurrentWKBSize], mCurrentWKBSize );
818817

819818
QgsWkbPtr wkbPtr( mCurrentWKB );
820-
wkbPtr << mEndian << QGis::WKBPolygon << mCurrentWKBFragments.begin()->size();
819+
wkbPtr << mEndian << QGis::WKBPolygon << mCurrentWKBFragments.constBegin()->size();
821820

822-
QList<QgsWkbPtr>::iterator wkbIt = mCurrentWKBFragments.begin()->begin();
823-
for ( ; wkbIt != mCurrentWKBFragments.begin()->end(); ++wkbIt )
821+
QList<QgsWkbPtr>::const_iterator wkbIt = mCurrentWKBFragments.constBegin()->constBegin();
822+
for ( ; wkbIt != mCurrentWKBFragments.constBegin()->constEnd(); ++wkbIt )
824823
{
825824
memcpy( wkbPtr, *wkbIt, wkbIt->size() );
826825
wkbPtr += wkbIt->size();
@@ -845,15 +844,15 @@ int QgsGml::createMultiPolygonFromFragments()
845844
wkbPtr << ( char ) mEndian << QGis::WKBMultiPolygon << mCurrentWKBFragments.size();
846845

847846
//have outer and inner iterators
848-
QList< QList<QgsWkbPtr> >::iterator outerWkbIt = mCurrentWKBFragments.begin();
847+
QList< QList<QgsWkbPtr> >::const_iterator outerWkbIt = mCurrentWKBFragments.constBegin();
849848

850-
for ( ; outerWkbIt != mCurrentWKBFragments.end(); ++outerWkbIt )
849+
for ( ; outerWkbIt != mCurrentWKBFragments.constEnd(); ++outerWkbIt )
851850
{
852851
//new polygon
853852
wkbPtr << ( char ) mEndian << QGis::WKBPolygon << outerWkbIt->size();
854853

855-
QList<QgsWkbPtr>::iterator innerWkbIt = outerWkbIt->begin();
856-
for ( ; innerWkbIt != outerWkbIt->end(); ++innerWkbIt )
854+
QList<QgsWkbPtr>::const_iterator innerWkbIt = outerWkbIt->constBegin();
855+
for ( ; innerWkbIt != outerWkbIt->constEnd(); ++innerWkbIt )
857856
{
858857
memcpy( wkbPtr, *innerWkbIt, innerWkbIt->size() );
859858
wkbPtr += innerWkbIt->size();

src/core/qgsgml.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ class CORE_EXPORT QgsGml : public QObject
235235
* are used*/
236236
QList< QList<QgsWkbPtr> > mCurrentWKBFragments;
237237
QString mAttributeName;
238-
QgsApplication::endian_t mEndian;
238+
char mEndian;
239239
/** Coordinate separator for coordinate strings. Usually "," */
240240
QString mCoordinateSeparator;
241241
/** Tuple separator for coordinate strings. Usually " " */

0 commit comments

Comments
 (0)