From 15cd8331ac337ae2e52bb55c3af5d1a929ea171f Mon Sep 17 00:00:00 2001 From: Martin Dobias Date: Thu, 19 Jan 2017 12:46:53 +0800 Subject: [PATCH] Make setEditable() return true/false to indicate success/error --- python/core/raster/qgsrasterdataprovider.sip | 9 +++++---- src/core/raster/qgsrasterdataprovider.h | 9 +++++---- src/providers/gdal/qgsgdalprovider.cpp | 11 ++++++----- src/providers/gdal/qgsgdalprovider.h | 2 +- tests/src/core/testqgsrasterblock.cpp | 13 ++++++++++--- 5 files changed, 27 insertions(+), 17 deletions(-) diff --git a/python/core/raster/qgsrasterdataprovider.sip b/python/core/raster/qgsrasterdataprovider.sip index 80c937aa754..02eb6769ecf 100644 --- a/python/core/raster/qgsrasterdataprovider.sip +++ b/python/core/raster/qgsrasterdataprovider.sip @@ -242,13 +242,14 @@ class QgsRasterDataProvider : QgsDataProvider, QgsRasterInterface /** Turns on/off editing mode of the provider. When in editing mode, it is possible * to overwrite data of the provider using writeBlock() calls. - * @note Only some providers support editing mode and even those may fail to turn turn - * the underlying data source into editing mode, so it is necessery to check afterwards - * with isEditable() whether the operation was successful. + * @note Only some providers support editing mode and even those may fail to turn + * the underlying data source into editing mode, so it is necessery to check the return + * value whether the operation was successful. + * @returns true if the switch to/from editing mode was successful * @see isEditable(), writeBlock() * @note added in QGIS 3.0 */ - virtual void setEditable( bool enabled ); + virtual bool setEditable( bool enabled ); /** Writes into the provider datasource*/ // TODO: add data type (may be defferent from band type) diff --git a/src/core/raster/qgsrasterdataprovider.h b/src/core/raster/qgsrasterdataprovider.h index a5eb0590000..7d0f7d4a9f3 100644 --- a/src/core/raster/qgsrasterdataprovider.h +++ b/src/core/raster/qgsrasterdataprovider.h @@ -360,13 +360,14 @@ class CORE_EXPORT QgsRasterDataProvider : public QgsDataProvider, public QgsRast /** Turns on/off editing mode of the provider. When in editing mode, it is possible * to overwrite data of the provider using writeBlock() calls. - * @note Only some providers support editing mode and even those may fail to turn turn - * the underlying data source into editing mode, so it is necessery to check afterwards - * with isEditable() whether the operation was successful. + * @note Only some providers support editing mode and even those may fail to turn + * the underlying data source into editing mode, so it is necessery to check the return + * value whether the operation was successful. + * @returns true if the switch to/from editing mode was successful * @see isEditable(), writeBlock() * @note added in QGIS 3.0 */ - virtual void setEditable( bool enabled ) { Q_UNUSED( enabled ); } + virtual bool setEditable( bool enabled ) { Q_UNUSED( enabled ); return false; } //! Writes into the provider datasource // TODO: add data type (may be defferent from band type) diff --git a/src/providers/gdal/qgsgdalprovider.cpp b/src/providers/gdal/qgsgdalprovider.cpp index 0d18a72e697..66ef2b74e6b 100644 --- a/src/providers/gdal/qgsgdalprovider.cpp +++ b/src/providers/gdal/qgsgdalprovider.cpp @@ -2933,16 +2933,16 @@ bool QgsGdalProvider::isEditable() const return mUpdate; } -void QgsGdalProvider::setEditable( bool enabled ) +bool QgsGdalProvider::setEditable( bool enabled ) { if ( enabled == mUpdate ) - return; + return false; if ( !mValid ) - return; + return false; if ( mGdalDataset != mGdalBaseDataset ) - return; // ignore the case of warped VRT for now (more complicated setup) + return false; // ignore the case of warped VRT for now (more complicated setup) closeDataset(); @@ -2954,12 +2954,13 @@ void QgsGdalProvider::setEditable( bool enabled ) { QString msg = QStringLiteral( "Cannot reopen GDAL dataset %1:\n%2" ).arg( dataSourceUri(), QString::fromUtf8( CPLGetLastErrorMsg() ) ); appendError( ERRMSG( msg ) ); - return; + return false; } //Since we are not a virtual warped dataset, mGdalDataSet and mGdalBaseDataset are supposed to be the same mGdalDataset = mGdalBaseDataset; mValid = true; + return true; } // pyramids resampling diff --git a/src/providers/gdal/qgsgdalprovider.h b/src/providers/gdal/qgsgdalprovider.h index 58a9b5971a0..5654f30bb1a 100644 --- a/src/providers/gdal/qgsgdalprovider.h +++ b/src/providers/gdal/qgsgdalprovider.h @@ -149,7 +149,7 @@ class QgsGdalProvider : public QgsRasterDataProvider, QgsGdalProviderBase static QMap supportedMimes(); bool isEditable() const override; - void setEditable( bool enabled ) override; + bool setEditable( bool enabled ) override; bool write( void* data, int band, int width, int height, int xOffset, int yOffset ) override; bool setNoDataValue( int bandNo, double noDataValue ) override; diff --git a/tests/src/core/testqgsrasterblock.cpp b/tests/src/core/testqgsrasterblock.cpp index a8bf98515c3..268ea1a47b4 100644 --- a/tests/src/core/testqgsrasterblock.cpp +++ b/tests/src/core/testqgsrasterblock.cpp @@ -184,15 +184,22 @@ void TestQgsRasterBlock::testWrite() res = rlayer->dataProvider()->writeBlock( block4, 1 ); QVERIFY( !res ); - // make the provider editable + // some sanity checks QVERIFY( !rlayer->dataProvider()->isEditable() ); - rlayer->dataProvider()->setEditable( true ); + res = rlayer->dataProvider()->setEditable( false ); + QVERIFY( !res ); + + // make the provider editable + res = rlayer->dataProvider()->setEditable( true ); + QVERIFY( res ); QVERIFY( rlayer->dataProvider()->isEditable() ); res = rlayer->dataProvider()->writeBlock( block4, 1 ); QVERIFY( res ); - rlayer->dataProvider()->setEditable( false ); + // finish the editing session + res = rlayer->dataProvider()->setEditable( false ); + QVERIFY( res ); QVERIFY( !rlayer->dataProvider()->isEditable() ); // verify the change is there