Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgswkbptr.cpp 3 : : --------------------- 4 : : begin : May 2015 5 : : copyright : (C) 2015 by Marco Hugentobler 6 : : email : marco dot hugentobler at sourcepole dot ch 7 : : *************************************************************************** 8 : : * * 9 : : * This program is free software; you can redistribute it and/or modify * 10 : : * it under the terms of the GNU General Public License as published by * 11 : : * the Free Software Foundation; either version 2 of the License, or * 12 : : * (at your option) any later version. * 13 : : * * 14 : : ***************************************************************************/ 15 : : #include "qgswkbptr.h" 16 : : #include "qgsapplication.h" 17 : : 18 : 160 : QgsWkbPtr::QgsWkbPtr( QByteArray &wkb ) 19 : : { 20 : 160 : mP = reinterpret_cast<unsigned char *>( wkb.data() ); 21 : 160 : mStart = mP; 22 : 160 : mEnd = mP + wkb.length(); 23 : 160 : } 24 : : 25 : 2 : QgsWkbPtr::QgsWkbPtr( unsigned char *p, int size ) 26 : : { 27 : 2 : mP = p; 28 : 2 : mStart = mP; 29 : 2 : mEnd = mP + size; 30 : 2 : } 31 : : 32 : 1720 : void QgsWkbPtr::verifyBound( int size ) const 33 : : { 34 : 1720 : if ( !mP || mP + size > mEnd ) 35 : 0 : throw QgsWkbException( QStringLiteral( "wkb access out of bounds" ) ); 36 : 1720 : } 37 : : 38 : 56 : QgsConstWkbPtr::QgsConstWkbPtr( const QByteArray &wkb ) 39 : : { 40 : 56 : mP = reinterpret_cast< unsigned char * >( const_cast<char *>( wkb.constData() ) ); 41 : 56 : mEnd = mP + wkb.length(); 42 : 56 : mEndianSwap = false; 43 : 56 : mWkbType = QgsWkbTypes::Unknown; 44 : 56 : } 45 : : 46 : 17 : QgsConstWkbPtr::QgsConstWkbPtr( const unsigned char *p, int size ) 47 : : { 48 : 17 : mP = const_cast< unsigned char * >( p ); 49 : 17 : mEnd = mP + size; 50 : 17 : mEndianSwap = false; 51 : 17 : mWkbType = QgsWkbTypes::Unknown; 52 : 17 : } 53 : : 54 : 205 : QgsWkbTypes::Type QgsConstWkbPtr::readHeader() const 55 : : { 56 : 205 : if ( !mP ) 57 : 1 : return QgsWkbTypes::Unknown; 58 : : 59 : : char wkbEndian; 60 : 204 : *this >> wkbEndian; 61 : 204 : mEndianSwap = wkbEndian != QgsApplication::endian(); 62 : : 63 : : int wkbType; 64 : 204 : *this >> wkbType; 65 : 204 : mWkbType = static_cast<QgsWkbTypes::Type>( wkbType ); 66 : : 67 : 204 : return mWkbType; 68 : 204 : } 69 : : 70 : 1378 : void QgsConstWkbPtr::verifyBound( int size ) const 71 : : { 72 : 1378 : if ( !mP || mP + size > mEnd ) 73 : 4 : throw QgsWkbException( QStringLiteral( "wkb access out of bounds" ) ); 74 : 1378 : } 75 : : 76 : 0 : const QgsConstWkbPtr &QgsConstWkbPtr::operator>>( QPointF &point ) const 77 : : { 78 : 0 : read( point.rx() ); 79 : 0 : read( point.ry() ); 80 : 0 : return *this; 81 : : } 82 : : 83 : 0 : const QgsConstWkbPtr &QgsConstWkbPtr::operator>>( QPolygonF &points ) const 84 : : { 85 : 0 : int skipZM = ( QgsWkbTypes::coordDimensions( mWkbType ) - 2 ) * sizeof( double ); 86 : : Q_ASSERT( skipZM >= 0 ); 87 : : 88 : : unsigned int nPoints; 89 : 0 : read( nPoints ); 90 : : 91 : 0 : points.resize( nPoints ); 92 : 0 : QPointF *ptr = points.data(); 93 : : 94 : 0 : for ( unsigned int i = 0; i < nPoints; ++i, ++ptr ) 95 : : { 96 : 0 : read( ptr->rx() ); 97 : 0 : read( ptr->ry() ); 98 : 0 : mP += skipZM; 99 : 0 : } 100 : 0 : return *this; 101 : : }