4444static QString PROVIDER_KEY = " grassraster" ;
4545static QString PROVIDER_DESCRIPTION = QString( " GRASS %1 raster provider" ).arg( GRASS_VERSION_MAJOR );
4646
47+ // Do not use warning dialogs, providers are also created on threads (rendering) where dialogs connot be used (constructing QPixmap icon)
48+
4749QgsGrassRasterProvider::QgsGrassRasterProvider ( QString const & uri )
4850 : QgsRasterDataProvider( uri )
4951 , mValid( false )
@@ -94,14 +96,21 @@ QgsGrassRasterProvider::QgsGrassRasterProvider( QString const & uri )
9496 mRasterValue .start ( mGisdbase , mLocation , mMapset , mMapName );
9597 // mValidNoDataValue = true;
9698
97- mCrs = QgsGrass::crs ( mGisdbase , mLocation );
99+ QString error;
100+ mCrs = QgsGrass::crs ( mGisdbase , mLocation , error );
101+ appendIfError ( error );
98102 QgsDebugMsg ( " mCrs: " + mCrs .toWkt () );
99103
100104 // the block size can change of course when the raster is overridden
101105 // ibut it is only called once when statistics are calculated
102- QgsGrass::size ( mGisdbase , mLocation , mMapset , mMapName , &mCols , &mRows );
106+ error.clear ();
107+ QgsGrass::size ( mGisdbase , mLocation , mMapset , mMapName , &mCols , &mRows , error );
108+ appendIfError ( error );
103109
104- mInfo = QgsGrass::info ( mGisdbase , mLocation , mMapset , mMapName , QgsGrassObject::Raster );
110+ error.clear ();
111+ mInfo = QgsGrass::info ( mGisdbase , mLocation , mMapset , mMapName , QgsGrassObject::Raster,
112+ " info" , QgsRectangle (), 0 , 0 , 3000 , error );
113+ appendIfError ( error );
105114
106115 mGrassDataType = mInfo [" TYPE" ].toInt ();
107116 QgsDebugMsg ( " mGrassDataType = " + QString::number ( mGrassDataType ) );
@@ -177,6 +186,7 @@ QImage* QgsGrassRasterProvider::draw( QgsRectangle const & viewExtent, int pixe
177186 QgsDebugMsg ( " pixelWidth = " + QString::number ( pixelWidth ) );
178187 QgsDebugMsg ( " pixelHeight = " + QString::number ( pixelHeight ) );
179188 QgsDebugMsg ( " viewExtent: " + viewExtent.toString () );
189+ clearLastError ();
180190
181191 QImage *image = new QImage ( pixelWidth, pixelHeight, QImage::Format_ARGB32 );
182192 image->fill ( QColor ( Qt::gray ).rgb () );
@@ -198,9 +208,9 @@ QImage* QgsGrassRasterProvider::draw( QgsRectangle const & viewExtent, int pixe
198208 }
199209 catch ( QgsGrass::Exception &e )
200210 {
201- QMessageBox::warning ( 0 , QObject::tr ( " Warning " ), QObject:: tr ( " Cannot draw raster" ) + " \n "
202- + e. what () );
203-
211+ QString error = tr ( " Cannot draw raster" ) + " : " + e. what ();
212+ QgsDebugMsg ( error );
213+ appendError ( error );
204214 // We don't set mValid to false, because the raster can be recreated and work next time
205215 return image;
206216 }
@@ -219,6 +229,7 @@ void QgsGrassRasterProvider::readBlock( int bandNo, int xBlock, int yBlock, void
219229{
220230 Q_UNUSED ( xBlock );
221231 QgsDebugMsg ( " Entered" );
232+ clearLastError ();
222233 // TODO: optimize, see extent()
223234
224235 QgsDebugMsg ( " yBlock = " + QString::number ( yBlock ) );
@@ -251,9 +262,9 @@ void QgsGrassRasterProvider::readBlock( int bandNo, int xBlock, int yBlock, void
251262 }
252263 catch ( QgsGrass::Exception &e )
253264 {
254- QMessageBox::warning ( 0 , QObject::tr ( " Warning " ), QObject:: tr ( " Cannot draw raster" ) + " \n "
255- + e. what () );
256-
265+ QString error = tr ( " Cannot read raster" ) + " : " + e. what ();
266+ QgsDebugMsg ( error );
267+ appendError ( error );
257268 // We don't set mValid to false, because the raster can be recreated and work next time
258269 }
259270 QgsDebugMsg ( QString ( " %1 bytes read from modules stdout" ).arg ( data.size () ) );
@@ -263,8 +274,9 @@ void QgsGrassRasterProvider::readBlock( int bandNo, int xBlock, int yBlock, void
263274 QgsDebugMsg ( QString ( " mCols = %1 mYBlockSize = %2 dataTypeSize = %3" ).arg ( mCols ).arg ( mYBlockSize ).arg ( dataTypeSize ( bandNo ) ) );
264275 if ( size != data.size () )
265276 {
266- QMessageBox::warning ( 0 , QObject::tr ( " Warning" ),
267- QString ( " %1 bytes expected but %2 byte were read from qgis.d.rast" ).arg ( size ).arg ( data.size () ) );
277+ QString error = tr ( " %1 bytes expected but %2 byte were read from qgis.d.rast" ).arg ( size ).arg ( data.size () );
278+ QgsDebugMsg ( error );
279+ appendError ( error );
268280 size = size < data.size () ? size : data.size ();
269281 }
270282 memcpy ( block, data.data (), size );
@@ -276,6 +288,7 @@ void QgsGrassRasterProvider::readBlock( int bandNo, QgsRectangle const & viewEx
276288 QgsDebugMsg ( " pixelWidth = " + QString::number ( pixelWidth ) );
277289 QgsDebugMsg ( " pixelHeight = " + QString::number ( pixelHeight ) );
278290 QgsDebugMsg ( " viewExtent: " + viewExtent.toString () );
291+ clearLastError ();
279292
280293 if ( pixelWidth <= 0 || pixelHeight <= 0 )
281294 return ;
@@ -298,8 +311,9 @@ void QgsGrassRasterProvider::readBlock( int bandNo, QgsRectangle const & viewEx
298311 }
299312 catch ( QgsGrass::Exception &e )
300313 {
301- QMessageBox::warning ( 0 , QObject::tr ( " Warning" ), QObject::tr ( " Cannot draw raster" ) + " \n "
302- + e.what () );
314+ QString error = tr ( " Cannot read raster" ) + " : " + e.what ();
315+ QgsDebugMsg ( error );
316+ appendError ( error );
303317
304318 // We don't set mValid to false, because the raster can be recreated and work next time
305319 return ;
@@ -310,8 +324,9 @@ void QgsGrassRasterProvider::readBlock( int bandNo, QgsRectangle const & viewEx
310324 int size = pixelWidth * pixelHeight * dataTypeSize ( bandNo );
311325 if ( size != data.size () )
312326 {
313- QMessageBox::warning ( 0 , QObject::tr ( " Warning" ),
314- QString ( " %1 bytes expected but %2 byte were read from qgis.d.rast" ).arg ( size ).arg ( data.size () ) );
327+ QString error = tr ( " %1 bytes expected but %2 byte were read from qgis.d.rast" ).arg ( size ).arg ( data.size () );
328+ QgsDebugMsg ( error );
329+ appendError ( error );
315330 size = size < data.size () ? size : data.size ();
316331 }
317332 memcpy ( block, data.data (), size );
@@ -341,9 +356,11 @@ QgsRasterBandStats QgsGrassRasterProvider::bandStatistics( int theBandNo, int th
341356 // 0.001 / cell should be sufficient using 0.005 to be sure + constant (ms)
342357 int timeout = 30000 + 0.005 * xSize () * ySize ();
343358
344- QHash<QString, QString> info = QgsGrass::info ( mGisdbase , mLocation , mMapset , mMapName , QgsGrassObject::Raster, " stats" , extent, sampleRows, sampleCols, timeout );
359+ QString error;
360+ QHash<QString, QString> info = QgsGrass::info ( mGisdbase , mLocation , mMapset , mMapName , QgsGrassObject::Raster,
361+ " stats" , extent, sampleRows, sampleCols, timeout, error );
345362
346- if ( info.isEmpty () )
363+ if ( info.isEmpty () || !error. isEmpty () )
347364 {
348365 return myRasterBandStats;
349366 }
@@ -381,7 +398,12 @@ QList<QgsColorRampShader::ColorRampItem> QgsGrassRasterProvider::colorTable( int
381398 // for now we just believe that they are continuous, i.e. end and beginning
382399 // of the ramp with the same value has the same color
383400 // we are also expecting ordered CT records in the list
384- QList<QgsGrass::Color> colors = QgsGrass::colors ( mGisdbase , mLocation , mMapset , mMapName );
401+ QString error;
402+ QList<QgsGrass::Color> colors = QgsGrass::colors ( mGisdbase , mLocation , mMapset , mMapName , error );
403+ if ( !error.isEmpty () )
404+ {
405+ return ct;
406+ }
385407 QList<QgsGrass::Color>::iterator i;
386408
387409 double v = 0.0 , r = 0.0 , g = 0.0 , b = 0.0 ;
@@ -419,7 +441,8 @@ QgsRectangle QgsGrassRasterProvider::extent()
419441 // The extend can change of course so we get always fresh, to avoid running always the module
420442 // we should save mExtent and mLastModified and check if the map was modified
421443
422- mExtent = QgsGrass::extent ( mGisdbase , mLocation , mMapset , mMapName , QgsGrassObject::Raster );
444+ QString error;
445+ mExtent = QgsGrass::extent ( mGisdbase , mLocation , mMapset , mMapName , QgsGrassObject::Raster, error );
423446
424447 QgsDebugMsg ( " Extent got" );
425448 return mExtent ;
@@ -561,14 +584,34 @@ bool QgsGrassRasterProvider::isValid()
561584 return mValid ;
562585}
563586
587+ void QgsGrassRasterProvider::setLastError ( QString error )
588+ {
589+ mLastErrorTitle = tr ( " GRASS raster provider" );
590+ mLastError = error;
591+ }
592+
593+ void QgsGrassRasterProvider::clearLastError ()
594+ {
595+ mLastErrorTitle .clear ();
596+ mLastError .clear ();
597+ }
598+
599+ void QgsGrassRasterProvider::appendIfError ( QString error )
600+ {
601+ if ( !error.isEmpty () )
602+ {
603+ appendError ( ERR ( error ) );
604+ }
605+ }
606+
564607QString QgsGrassRasterProvider::lastErrorTitle ()
565608{
566- return QString ( " Not implemented " ) ;
609+ return mLastErrorTitle ;
567610}
568611
569612QString QgsGrassRasterProvider::lastError ()
570613{
571- return QString ( " Not implemented " ) ;
614+ return mLastError ;
572615}
573616
574617QString QgsGrassRasterProvider::name () const
@@ -647,7 +690,16 @@ void QgsGrassRasterValue::start( QString gisdbase, QString location,
647690
648691 arguments.append ( " info=query" );
649692 arguments.append ( " rast=" + mMapName + " @" + mMapset );
650- mProcess = QgsGrass::startModule ( mGisdbase , mLocation , mMapset , module , arguments, mGisrcFile );
693+ try
694+ {
695+ mProcess = QgsGrass::startModule ( mGisdbase , mLocation , mMapset , module , arguments, mGisrcFile );
696+ }
697+ catch ( QgsGrass::Exception &e )
698+ {
699+ QString error = e.what ();
700+ Q_UNUSED ( error )
701+ QgsDebugMsg ( error );
702+ }
651703}
652704QgsGrassRasterValue::~QgsGrassRasterValue ()
653705{
0 commit comments