[QGIS Commit] r14559 - in branches/raster-providers/src: core core/raster providers providers/gdal providers/grass

svn_qgis at osgeo.org svn_qgis at osgeo.org
Fri Nov 12 11:34:45 EST 2010


Author: rblazek
Date: 2010-11-12 08:34:45 -0800 (Fri, 12 Nov 2010)
New Revision: 14559

Added:
   branches/raster-providers/src/providers/gdal/
   branches/raster-providers/src/providers/gdal/CMakeLists.txt
   branches/raster-providers/src/providers/gdal/qgsgdalprovider.cpp
   branches/raster-providers/src/providers/gdal/qgsgdalprovider.h
Modified:
   branches/raster-providers/src/core/qgsrasterdataprovider.cpp
   branches/raster-providers/src/core/qgsrasterdataprovider.h
   branches/raster-providers/src/core/raster/qgsrasterlayer.cpp
   branches/raster-providers/src/core/raster/qgsrasterlayer.h
   branches/raster-providers/src/providers/grass/qgsgrassrasterprovider.cpp
   branches/raster-providers/src/providers/grass/qgsgrassrasterprovider.h
Log:
initial gdal driver implementation

Modified: branches/raster-providers/src/core/qgsrasterdataprovider.cpp
===================================================================
--- branches/raster-providers/src/core/qgsrasterdataprovider.cpp	2010-11-12 16:33:33 UTC (rev 14558)
+++ branches/raster-providers/src/core/qgsrasterdataprovider.cpp	2010-11-12 16:34:45 UTC (rev 14559)
@@ -31,6 +31,58 @@
 {
 }
 
+//
+//Random Static convenience function
+//
+/////////////////////////////////////////////////////////
+//TODO: Change these to private function or make seprate class
+// convenience function for building metadata() HTML table cells
+// convenience function for creating a string list from a C style string list
+QStringList QgsRasterDataProvider::cStringList2Q_( char ** stringList )
+{
+  QStringList strings;
+
+  // presume null terminated string list
+  for ( size_t i = 0; stringList[i]; ++i )
+  {
+    strings.append( stringList[i] );
+  }
+
+  return strings;
+
+} // cStringList2Q_
+
+
+QString QgsRasterDataProvider::makeTableCell( QString const & value )
+{
+  return "<p>\n" + value + "</p>\n";
+} // makeTableCell_
+
+
+
+// convenience function for building metadata() HTML table cells
+QString QgsRasterDataProvider::makeTableCells( QStringList const & values )
+{
+  QString s( "<tr>" );
+
+  for ( QStringList::const_iterator i = values.begin();
+        i != values.end();
+        ++i )
+  {
+    s += QgsRasterDataProvider::makeTableCell( *i );
+  }
+
+  s += "</tr>";
+
+  return s;
+} // makeTableCell_
+
+QString QgsRasterDataProvider::metadata()
+{
+  QString s;
+  return s;
+}
+
 QString QgsRasterDataProvider::capabilitiesString() const
 {
   QStringList abilitiesList;

Modified: branches/raster-providers/src/core/qgsrasterdataprovider.h
===================================================================
--- branches/raster-providers/src/core/qgsrasterdataprovider.h	2010-11-12 16:33:33 UTC (rev 14558)
+++ branches/raster-providers/src/core/qgsrasterdataprovider.h	2010-11-12 16:34:45 UTC (rev 14559)
@@ -22,6 +22,7 @@
 #define QGSRASTERDATAPROVIDER_H
 
 #include "qgslogger.h"
+#include "qgsrectangle.h"
 #include "qgsdataprovider.h"
 #include "qgscolorrampshader.h"
 
@@ -306,13 +307,31 @@
       @note: this method was added in version 1.2*/
     void setDpi( int dpi ) {mDpi = dpi;}
 
+    /** \brief Is the NoDataValue Valid */
+    bool isNoDataValueValid() const { return mValidNoDataValue; }
 
+    static QStringList cStringList2Q_( char ** stringList );
+
+    static QString makeTableCell( QString const & value );
+    static QString makeTableCells( QStringList const & values );
+
+
   protected:
     /**Dots per intch. Extended WMS (e.g. QGIS mapserver) support DPI dependent output and therefore
     are suited for printing. A value of -1 means it has not been set
     @note: this member has been added in version 1.2*/
     int mDpi;
 
+    /** \brief Cell value representing no data. e.g. -9999  */
+    double mNoDataValue;
+
+    /** \brief Flag indicating if the nodatavalue is valid*/
+    bool mValidNoDataValue;
+
+
+    QgsRectangle mExtent;
+    
+
 };
 
 #endif

Modified: branches/raster-providers/src/core/raster/qgsrasterlayer.cpp
===================================================================
--- branches/raster-providers/src/core/raster/qgsrasterlayer.cpp	2010-11-12 16:33:33 UTC (rev 14558)
+++ branches/raster-providers/src/core/raster/qgsrasterlayer.cpp	2010-11-12 16:34:45 UTC (rev 14559)
@@ -89,7 +89,13 @@
     , mHeight( std::numeric_limits<int>::max() )
     , mInvertColor( false )
 {
+  QgsDebugMsg("Entered");
 
+  // TODO, call constructor with provider key for now
+  setDataProvider( "gdal", QStringList(), QStringList(), QString(), QString() );
+  return;
+
+  // TODO: add this somewhere - in another constructor
   mRasterType = QgsRasterLayer::GrayOrUndefined;
 
   mRedBandName = TRSTRING_NOT_SET;
@@ -192,22 +198,9 @@
                layers.join( ", " ) +  " and style list of " + styles.join( ", " ) + " and format of " +
                format +  " and CRS of " + crs );
 
-  mBandCount = 0;
-  mRasterShader = new QgsRasterShader();
 
-  // Initialise the affine transform matrix
-  mGeoTransform[0] =  0;
-  mGeoTransform[1] =  1;
-  mGeoTransform[2] =  0;
-  mGeoTransform[3] =  0;
-  mGeoTransform[4] =  0;
-  mGeoTransform[5] = -1;
-
   // if we're given a provider type, try to create and bind one to this layer
-  if ( ! providerKey.isEmpty() )
-  {
-    setDataProvider( providerKey, layers, styles, format, crs );
-  }
+  setDataProvider( providerKey, layers, styles, format, crs );
 
   // Default for the popup menu
   // TODO: popMenu = 0;
@@ -275,7 +268,7 @@
 void QgsRasterLayer::buildSupportedRasterFileFilter( QString & theFileFiltersString )
 {
   // first get the GDAL driver manager
-  registerGdalDrivers();
+  //registerGdalDrivers();
 
   // then iterate through all of the supported drivers, adding the
   // corresponding file filter
@@ -447,8 +440,11 @@
 bool QgsRasterLayer::isValidRasterFileName( QString const & theFileNameQString, QString & retErrMsg )
 {
   GDALDatasetH myDataset;
-  registerGdalDrivers();
+  //registerGdalDrivers();
 
+  // TODO
+  return true;
+
   CPLErrorReset();
 
   //open the file using gdal making sure we have handled locale properly
@@ -503,64 +499,6 @@
 
 
 
-void QgsRasterLayer::registerGdalDrivers()
-{
-  if ( GDALGetDriverCount() == 0 )
-    GDALAllRegister();
-}
-
-
-
-
-//////////////////////////////////////////////////////////
-//
-//Random Static convenience function
-//
-/////////////////////////////////////////////////////////
-//TODO: Change these to private function or make seprate class
-// convenience function for building metadata() HTML table cells
-static QString makeTableCell_( QString const & value )
-{
-  return "<p>\n" + value + "</p>\n";
-} // makeTableCell_
-
-
-
-// convenience function for building metadata() HTML table cells
-static QString makeTableCells_( QStringList const & values )
-{
-  QString s( "<tr>" );
-
-  for ( QStringList::const_iterator i = values.begin();
-        i != values.end();
-        ++i )
-  {
-    s += makeTableCell_( *i );
-  }
-
-  s += "</tr>";
-
-  return s;
-} // makeTableCell_
-
-
-
-// convenience function for creating a string list from a C style string list
-static QStringList cStringList2Q_( char ** stringList )
-{
-  QStringList strings;
-
-  // presume null terminated string list
-  for ( size_t i = 0; stringList[i]; ++i )
-  {
-    strings.append( stringList[i] );
-  }
-
-  return strings;
-
-} // cStringList2Q_
-
-
 // typedef for the QgsDataProvider class factory
 typedef QgsDataProvider * classFactoryFunction_t( const QString * );
 
@@ -2609,173 +2547,80 @@
   QString myMetadata ;
   myMetadata += "<p class=\"glossy\">" + tr( "Driver:" ) + "</p>\n";
   myMetadata += "<p>";
-  if ( mProviderKey.isEmpty() )
+  myMetadata += mDataProvider->description();
+  myMetadata += "</p>\n";
+
+  // Insert provider-specific (e.g. WMS-specific) metadata
+  // crashing
+  //QString s =  mDataProvider->metadata();
+  //QgsDebugMsg( s );
+  myMetadata += mDataProvider->metadata();
+
+  myMetadata += "<p class=\"glossy\">";
+  myMetadata += tr( "No Data Value" );
+  myMetadata += "</p>\n";
+  myMetadata += "<p>";
+  if ( mValidNoDataValue )
   {
-    myMetadata += QString( GDALGetDescription( GDALGetDatasetDriver( mGdalDataset ) ) );
-    myMetadata += "<br>";
-    myMetadata += QString( GDALGetMetadataItem( GDALGetDatasetDriver( mGdalDataset ), GDAL_DMD_LONGNAME, NULL ) );
+    myMetadata += QString::number( mNoDataValue );
   }
   else
   {
-    myMetadata += mDataProvider->description();
+    myMetadata += "*" + tr( "NoDataValue not set" ) + "*";
   }
   myMetadata += "</p>\n";
 
-  if ( !mProviderKey.isEmpty() )
+  myMetadata += "</p>\n";
+  myMetadata += "<p class=\"glossy\">";
+  myMetadata += tr( "Data Type:" );
+  myMetadata += "</p>\n";
+  myMetadata += "<p>";
+  //just use the first band
+  switch ( mDataProvider->dataType( 1 ) )
   {
-    // Insert provider-specific (e.g. WMS-specific) metadata
-    myMetadata += mDataProvider->metadata();
+    case GDT_Byte:
+      myMetadata += tr( "GDT_Byte - Eight bit unsigned integer" );
+      break;
+    case GDT_UInt16:
+      myMetadata += tr( "GDT_UInt16 - Sixteen bit unsigned integer " );
+      break;
+    case GDT_Int16:
+      myMetadata += tr( "GDT_Int16 - Sixteen bit signed integer " );
+      break;
+    case GDT_UInt32:
+      myMetadata += tr( "GDT_UInt32 - Thirty two bit unsigned integer " );
+      break;
+    case GDT_Int32:
+      myMetadata += tr( "GDT_Int32 - Thirty two bit signed integer " );
+      break;
+    case GDT_Float32:
+      myMetadata += tr( "GDT_Float32 - Thirty two bit floating point " );
+      break;
+    case GDT_Float64:
+      myMetadata += tr( "GDT_Float64 - Sixty four bit floating point " );
+      break;
+    case GDT_CInt16:
+      myMetadata += tr( "GDT_CInt16 - Complex Int16 " );
+      break;
+    case GDT_CInt32:
+      myMetadata += tr( "GDT_CInt32 - Complex Int32 " );
+      break;
+    case GDT_CFloat32:
+      myMetadata += tr( "GDT_CFloat32 - Complex Float32 " );
+      break;
+    case GDT_CFloat64:
+      myMetadata += tr( "GDT_CFloat64 - Complex Float64 " );
+      break;
+    default:
+      myMetadata += tr( "Could not determine raster data type." );
   }
-  else
-  {
+  myMetadata += "</p>\n";
 
-    // my added code (MColetti)
+  myMetadata += "<p class=\"glossy\">";
+  myMetadata += tr( "Pyramid overviews:" );
+  myMetadata += "</p>\n";
+  myMetadata += "<p>";
 
-    myMetadata += "<p class=\"glossy\">";
-    myMetadata += tr( "Dataset Description" );
-    myMetadata += "</p>\n";
-    myMetadata += "<p>";
-    myMetadata += QFile::decodeName( GDALGetDescription( mGdalDataset ) );
-    myMetadata += "</p>\n";
-
-
-    char ** GDALmetadata = GDALGetMetadata( mGdalDataset, NULL );
-
-    if ( GDALmetadata )
-    {
-      QStringList metadata = cStringList2Q_( GDALmetadata );
-      myMetadata += makeTableCells_( metadata );
-    }
-    else
-    {
-      QgsDebugMsg( "dataset has no metadata" );
-    }
-
-    for ( int i = 1; i <= GDALGetRasterCount( mGdalDataset ); ++i )
-    {
-      myMetadata += "<p class=\"glossy\">" + tr( "Band %1" ).arg( i ) + "</p>\n";
-      GDALRasterBandH gdalBand = GDALGetRasterBand( mGdalDataset, i );
-      GDALmetadata = GDALGetMetadata( gdalBand, NULL );
-
-      if ( GDALmetadata )
-      {
-        QStringList metadata = cStringList2Q_( GDALmetadata );
-        myMetadata += makeTableCells_( metadata );
-      }
-      else
-      {
-        QgsDebugMsg( "band " + QString::number( i ) + " has no metadata" );
-      }
-
-      char ** GDALcategories = GDALGetRasterCategoryNames( gdalBand );
-
-      if ( GDALcategories )
-      {
-        QStringList categories = cStringList2Q_( GDALcategories );
-        myMetadata += makeTableCells_( categories );
-      }
-      else
-      {
-        QgsDebugMsg( "band " + QString::number( i ) + " has no categories" );
-      }
-
-    }
-
-    // end my added code
-
-    myMetadata += "<p class=\"glossy\">";
-    myMetadata += tr( "Dimensions:" );
-    myMetadata += "</p>\n";
-    myMetadata += "<p>";
-    myMetadata += tr( "X: %1 Y: %2 Bands: %3" )
-                  .arg( GDALGetRasterXSize( mGdalDataset ) )
-                  .arg( GDALGetRasterYSize( mGdalDataset ) )
-                  .arg( GDALGetRasterCount( mGdalDataset ) );
-    myMetadata += "</p>\n";
-
-    //just use the first band
-    GDALRasterBandH myGdalBand = GDALGetRasterBand( mGdalDataset, 1 );
-
-    myMetadata += "<p class=\"glossy\">";
-    myMetadata += tr( "No Data Value" );
-    myMetadata += "</p>\n";
-    myMetadata += "<p>";
-    if ( mValidNoDataValue )
-    {
-      myMetadata += QString::number( mNoDataValue );
-    }
-    else
-    {
-      myMetadata += "*" + tr( "NoDataValue not set" ) + "*";
-    }
-    myMetadata += "</p>\n";
-
-    myMetadata += "</p>\n";
-    myMetadata += "<p class=\"glossy\">";
-    myMetadata += tr( "Data Type:" );
-    myMetadata += "</p>\n";
-    myMetadata += "<p>";
-    switch ( GDALGetRasterDataType( myGdalBand ) )
-    {
-      case GDT_Byte:
-        myMetadata += tr( "GDT_Byte - Eight bit unsigned integer" );
-        break;
-      case GDT_UInt16:
-        myMetadata += tr( "GDT_UInt16 - Sixteen bit unsigned integer " );
-        break;
-      case GDT_Int16:
-        myMetadata += tr( "GDT_Int16 - Sixteen bit signed integer " );
-        break;
-      case GDT_UInt32:
-        myMetadata += tr( "GDT_UInt32 - Thirty two bit unsigned integer " );
-        break;
-      case GDT_Int32:
-        myMetadata += tr( "GDT_Int32 - Thirty two bit signed integer " );
-        break;
-      case GDT_Float32:
-        myMetadata += tr( "GDT_Float32 - Thirty two bit floating point " );
-        break;
-      case GDT_Float64:
-        myMetadata += tr( "GDT_Float64 - Sixty four bit floating point " );
-        break;
-      case GDT_CInt16:
-        myMetadata += tr( "GDT_CInt16 - Complex Int16 " );
-        break;
-      case GDT_CInt32:
-        myMetadata += tr( "GDT_CInt32 - Complex Int32 " );
-        break;
-      case GDT_CFloat32:
-        myMetadata += tr( "GDT_CFloat32 - Complex Float32 " );
-        break;
-      case GDT_CFloat64:
-        myMetadata += tr( "GDT_CFloat64 - Complex Float64 " );
-        break;
-      default:
-        myMetadata += tr( "Could not determine raster data type." );
-    }
-    myMetadata += "</p>\n";
-
-    myMetadata += "<p class=\"glossy\">";
-    myMetadata += tr( "Pyramid overviews:" );
-    myMetadata += "</p>\n";
-    myMetadata += "<p>";
-
-    if ( GDALGetOverviewCount( myGdalBand ) > 0 )
-    {
-      int myOverviewInt;
-      for ( myOverviewInt = 0;
-            myOverviewInt < GDALGetOverviewCount( myGdalBand );
-            myOverviewInt++ )
-      {
-        GDALRasterBandH myOverview;
-        myOverview = GDALGetOverview( myGdalBand, myOverviewInt );
-        myMetadata += "<p>X : " + QString::number( GDALGetRasterBandXSize( myOverview ) );
-        myMetadata += ",Y " + QString::number( GDALGetRasterBandYSize( myOverview ) ) + "</p>";
-      }
-    }
-    myMetadata += "</p>\n";
-  }  // if (mProviderKey.isEmpty())
-
   myMetadata += "<p class=\"glossy\">";
   myMetadata += tr( "Layer Spatial Reference System: " );
   myMetadata += "</p>\n";
@@ -2794,140 +2639,110 @@
   myMetadata += "</p>\n";
 #endif
 
-  if ( mProviderKey.isEmpty() )
+  //
+  // Add the stats for each band to the output table
+  //
+  int myBandCountInt = bandCount();
+  for ( int myIteratorInt = 1; myIteratorInt <= myBandCountInt; ++myIteratorInt )
   {
-    if ( GDALGetGeoTransform( mGdalDataset, mGeoTransform ) != CE_None )
+    QgsDebugMsg( "Raster properties : checking if band " + QString::number( myIteratorInt ) + " has stats? " );
+    //band name
+    myMetadata += "<p class=\"glossy\">\n";
+    myMetadata += tr( "Band" );
+    myMetadata += "</p>\n";
+    myMetadata += "<p>";
+    myMetadata += bandName( myIteratorInt );
+    myMetadata += "</p>\n";
+    //band number
+    myMetadata += "<p>";
+    myMetadata += tr( "Band No" );
+    myMetadata += "</p>\n";
+    myMetadata += "<p>\n";
+    myMetadata += QString::number( myIteratorInt );
+    myMetadata += "</p>\n";
+
+    //check if full stats for this layer have already been collected
+    if ( !hasStatistics( myIteratorInt ) )  //not collected
     {
-      // if the raster does not have a valid transform we need to use
-      // a pixel size of (1,-1), but GDAL returns (1,1)
-      mGeoTransform[5] = -1;
+      QgsDebugMsg( ".....no" );
+
+      myMetadata += "<p>";
+      myMetadata += tr( "No Stats" );
+      myMetadata += "</p>\n";
+      myMetadata += "<p>\n";
+      myMetadata += tr( "No stats collected yet" );
+      myMetadata += "</p>\n";
     }
-    else
+    else                    // collected - show full detail
     {
-      myMetadata += "<p class=\"glossy\">";
-      myMetadata += tr( "Origin:" );
+      QgsDebugMsg( ".....yes" );
+
+      QgsRasterBandStats myRasterBandStats = bandStatistics( myIteratorInt );
+      //Min Val
+      myMetadata += "<p>";
+      myMetadata += tr( "Min Val" );
       myMetadata += "</p>\n";
+      myMetadata += "<p>\n";
+      myMetadata += QString::number( myRasterBandStats.minimumValue, 'f', 10 );
+      myMetadata += "</p>\n";
+
+      // Max Val
       myMetadata += "<p>";
-      myMetadata += QString::number( mGeoTransform[0] );
-      myMetadata += ",";
-      myMetadata += QString::number( mGeoTransform[3] );
+      myMetadata += tr( "Max Val" );
       myMetadata += "</p>\n";
+      myMetadata += "<p>\n";
+      myMetadata += QString::number( myRasterBandStats.maximumValue, 'f', 10 );
+      myMetadata += "</p>\n";
 
-      myMetadata += "<p class=\"glossy\">";
-      myMetadata += tr( "Pixel Size:" );
+      // Range
+      myMetadata += "<p>";
+      myMetadata += tr( "Range" );
       myMetadata += "</p>\n";
+      myMetadata += "<p>\n";
+      myMetadata += QString::number( myRasterBandStats.range, 'f', 10 );
+      myMetadata += "</p>\n";
+
+      // Mean
       myMetadata += "<p>";
-      myMetadata += QString::number( mGeoTransform[1] );
-      myMetadata += ",";
-      myMetadata += QString::number( mGeoTransform[5] );
+      myMetadata += tr( "Mean" );
       myMetadata += "</p>\n";
-    }
+      myMetadata += "<p>\n";
+      myMetadata += QString::number( myRasterBandStats.mean, 'f', 10 );
+      myMetadata += "</p>\n";
 
-    //
-    // Add the stats for each band to the output table
-    //
-    int myBandCountInt = bandCount();
-    for ( int myIteratorInt = 1; myIteratorInt <= myBandCountInt; ++myIteratorInt )
-    {
-      QgsDebugMsg( "Raster properties : checking if band " + QString::number( myIteratorInt ) + " has stats? " );
-      //band name
-      myMetadata += "<p class=\"glossy\">\n";
-      myMetadata += tr( "Band" );
+      //sum of squares
+      myMetadata += "<p>";
+      myMetadata += tr( "Sum of squares" );
       myMetadata += "</p>\n";
+      myMetadata += "<p>\n";
+      myMetadata += QString::number( myRasterBandStats.sumOfSquares, 'f', 10 );
+      myMetadata += "</p>\n";
+
+      //standard deviation
       myMetadata += "<p>";
-      myMetadata += bandName( myIteratorInt );
+      myMetadata += tr( "Standard Deviation" );
       myMetadata += "</p>\n";
-      //band number
+      myMetadata += "<p>\n";
+      myMetadata += QString::number( myRasterBandStats.stdDev, 'f', 10 );
+      myMetadata += "</p>\n";
+
+      //sum of all cells
       myMetadata += "<p>";
-      myMetadata += tr( "Band No" );
+      myMetadata += tr( "Sum of all cells" );
       myMetadata += "</p>\n";
       myMetadata += "<p>\n";
-      myMetadata += QString::number( myIteratorInt );
+      myMetadata += QString::number( myRasterBandStats.sum, 'f', 10 );
       myMetadata += "</p>\n";
 
-      //check if full stats for this layer have already been collected
-      if ( !hasStatistics( myIteratorInt ) )  //not collected
-      {
-        QgsDebugMsg( ".....no" );
-
-        myMetadata += "<p>";
-        myMetadata += tr( "No Stats" );
-        myMetadata += "</p>\n";
-        myMetadata += "<p>\n";
-        myMetadata += tr( "No stats collected yet" );
-        myMetadata += "</p>\n";
-      }
-      else                    // collected - show full detail
-      {
-        QgsDebugMsg( ".....yes" );
-
-        QgsRasterBandStats myRasterBandStats = bandStatistics( myIteratorInt );
-        //Min Val
-        myMetadata += "<p>";
-        myMetadata += tr( "Min Val" );
-        myMetadata += "</p>\n";
-        myMetadata += "<p>\n";
-        myMetadata += QString::number( myRasterBandStats.minimumValue, 'f', 10 );
-        myMetadata += "</p>\n";
-
-        // Max Val
-        myMetadata += "<p>";
-        myMetadata += tr( "Max Val" );
-        myMetadata += "</p>\n";
-        myMetadata += "<p>\n";
-        myMetadata += QString::number( myRasterBandStats.maximumValue, 'f', 10 );
-        myMetadata += "</p>\n";
-
-        // Range
-        myMetadata += "<p>";
-        myMetadata += tr( "Range" );
-        myMetadata += "</p>\n";
-        myMetadata += "<p>\n";
-        myMetadata += QString::number( myRasterBandStats.range, 'f', 10 );
-        myMetadata += "</p>\n";
-
-        // Mean
-        myMetadata += "<p>";
-        myMetadata += tr( "Mean" );
-        myMetadata += "</p>\n";
-        myMetadata += "<p>\n";
-        myMetadata += QString::number( myRasterBandStats.mean, 'f', 10 );
-        myMetadata += "</p>\n";
-
-        //sum of squares
-        myMetadata += "<p>";
-        myMetadata += tr( "Sum of squares" );
-        myMetadata += "</p>\n";
-        myMetadata += "<p>\n";
-        myMetadata += QString::number( myRasterBandStats.sumOfSquares, 'f', 10 );
-        myMetadata += "</p>\n";
-
-        //standard deviation
-        myMetadata += "<p>";
-        myMetadata += tr( "Standard Deviation" );
-        myMetadata += "</p>\n";
-        myMetadata += "<p>\n";
-        myMetadata += QString::number( myRasterBandStats.stdDev, 'f', 10 );
-        myMetadata += "</p>\n";
-
-        //sum of all cells
-        myMetadata += "<p>";
-        myMetadata += tr( "Sum of all cells" );
-        myMetadata += "</p>\n";
-        myMetadata += "<p>\n";
-        myMetadata += QString::number( myRasterBandStats.sum, 'f', 10 );
-        myMetadata += "</p>\n";
-
-        //number of cells
-        myMetadata += "<p>";
-        myMetadata += tr( "Cell Count" );
-        myMetadata += "</p>\n";
-        myMetadata += "<p>\n";
-        myMetadata += QString::number( myRasterBandStats.elementCount );
-        myMetadata += "</p>\n";
-      }
+      //number of cells
+      myMetadata += "<p>";
+      myMetadata += tr( "Cell Count" );
+      myMetadata += "</p>\n";
+      myMetadata += "<p>\n";
+      myMetadata += QString::number( myRasterBandStats.elementCount );
+      myMetadata += "</p>\n";
     }
-  } // if (mProviderKey.isEmpty())
+  }
 
   QgsDebugMsg( myMetadata );
   return myMetadata;
@@ -3234,6 +3049,17 @@
   mProviderKey = provider;     // XXX is this necessary?  Usually already set
   // XXX when execution gets here.
 
+  mBandCount = 0;
+  mRasterShader = new QgsRasterShader();
+
+  // Initialise the affine transform matrix
+  mGeoTransform[0] =  0;
+  mGeoTransform[1] =  1;
+  mGeoTransform[2] =  0;
+  mGeoTransform[3] =  0;
+  mGeoTransform[4] =  0;
+  mGeoTransform[5] = -1;
+
   // load the plugin
   QgsProviderRegistry * pReg = QgsProviderRegistry::instance();
   QString ogrlib = pReg->library( provider );
@@ -3336,6 +3162,17 @@
   {
     *mCRS = QgsCoordinateReferenceSystem( mDataProvider->crs() );
   }
+  //get the project projection, defaulting to this layer's projection
+  //if none exists....
+  if ( !mCRS->isValid() )
+  {
+    mCRS->setValidationHint( tr( "Specify CRS for layer %1" ).arg( name() ) );
+    mCRS->validate();
+  }
+  QString mySourceWkt = mCRS->toWkt();
+
+  QgsDebugMsg( "using wkt:\n" + mySourceWkt );
+
   //mBandCount = GDALGetRasterCount( mGdalDataset );
   mBandCount = mDataProvider->bandCount( );
   for ( int i = 1; i <= mBandCount; i++ )
@@ -3360,6 +3197,9 @@
     mContrastEnhancementList.append( myContrastEnhancement );
   }
 
+  //defaults - Needs to be set after the Contrast list has been build
+  //Try to read the default contrast enhancement from the config file
+
   QSettings myQSettings;
   setContrastEnhancementAlgorithm( myQSettings.value( "/Raster/defaultContrastEnhancementAlgorithm", "StretchToMinimumMaximum" ).toString() );
 
@@ -3452,6 +3292,17 @@
     mGrayBandName = bandName( 1 );
   }
 
+  // Store timestamp
+  // TODO move to provider
+  mLastModified = lastModified( mDataSource );
+
+  mValidNoDataValue = mDataProvider->isNoDataValueValid();
+  if ( mValidNoDataValue )
+  {
+    mRasterTransparency.initializeTransparentPixelList( mNoDataValue, mNoDataValue, mNoDataValue );
+    mRasterTransparency.initializeTransparentPixelList( mNoDataValue );
+  }
+
   //mark the layer as valid
   mValid = true;
   QgsDebugMsg( "exiting." );
@@ -5395,27 +5246,8 @@
 
 QString QgsRasterLayer::projectionWkt()
 {
-  QString myWktString;
-  QgsCoordinateReferenceSystem myCRS;
-  myWktString = QString( GDALGetProjectionRef( mGdalDataset ) );
-  myCRS.createFromWkt( myWktString );
-  if ( !myCRS.isValid() )
-  {
-    //try to get the gcp srs from the raster layer if available
-    myWktString = QString( GDALGetGCPProjection( mGdalDataset ) );
-
-// What is the purpose of this piece of code?
-// Sideeffects from validate()?
-//    myCRS.createFromWkt(myWktString);
-//    if (!myCRS.isValid())
-//    {
-//      // use force and make CRS valid!
-//      myCRS.validate();
-//    }
-
-  }
-
-  return myWktString;
+  // TODO: where is it used? It would be better to use crs.
+  return mDataProvider->crs().toWkt();
 }
 
 /*
@@ -5472,254 +5304,8 @@
  */
 bool QgsRasterLayer::readFile( QString const &theFilename )
 {
-  registerGdalDrivers();
-
-  mGdalDataset = NULL;
-
-  //open the dataset making sure we handle char encoding of locale properly
-  mGdalBaseDataset = GDALOpen( QFile::encodeName( theFilename ).constData(), GA_ReadOnly );
-
-  if ( mGdalBaseDataset == NULL )
-  {
-    mValid = false;
-    return false;
-  }
-
-  // Store timestamp
-  mLastModified = lastModified( theFilename );
-
-  // Check if we need a warped VRT for this file.
-  if (( GDALGetGeoTransform( mGdalBaseDataset, mGeoTransform ) == CE_None
-        && ( mGeoTransform[1] < 0.0
-             || mGeoTransform[2] != 0.0
-             || mGeoTransform[4] != 0.0
-             || mGeoTransform[5] > 0.0 ) )
-      || GDALGetGCPCount( mGdalBaseDataset ) > 0 )
-  {
-    QgsLogger::warning( "Creating Warped VRT." );
-
-    mGdalDataset =
-      GDALAutoCreateWarpedVRT( mGdalBaseDataset, NULL, NULL,
-                               GRA_NearestNeighbour, 0.2, NULL );
-    if ( mGdalDataset == NULL )
-    {
-      QgsLogger::warning( "Warped VRT Creation failed." );
-      mGdalDataset = mGdalBaseDataset;
-      GDALReferenceDataset( mGdalDataset );
-    }
-  }
-  else
-  {
-    mGdalDataset = mGdalBaseDataset;
-    GDALReferenceDataset( mGdalDataset );
-  }
-
-  if ( subLayers().size() > 0 )
-  {
-    // just to get the sublayers
-    mValid = false;
-    return true;
-  }
-
-  //check f this file has pyramids
-  GDALRasterBandH myGDALBand = GDALGetRasterBand( mGdalDataset, 1 ); //just use the first band
-  if ( myGDALBand == NULL )
-  {
-    GDALDereferenceDataset( mGdalBaseDataset );
-    mGdalBaseDataset = NULL;
-
-    GDALClose( mGdalDataset );
-    mGdalDataset = NULL;
-    mValid = false;
-    return false;
-  }
-
-  mHasPyramids = GDALGetOverviewCount( myGDALBand ) > 0;
-
-  //populate the list of what pyramids exist
-  buildPyramidList();
-
-  // Get the layer's projection info and set up the
-  // QgsCoordinateTransform for this layer
-  // NOTE: we must do this before metadata is called
-
-  QString mySourceWkt = projectionWkt();
-
-  QgsDebugMsg( "--------------------------------------------------------------------------------------" );
-  QgsDebugMsg( "using wkt:\n" + mySourceWkt );
-  QgsDebugMsg( "--------------------------------------------------------------------------------------" );
-
-  mCRS->createFromWkt( mySourceWkt );
-  //get the project projection, defaulting to this layer's projection
-  //if none exists....
-  if ( !mCRS->isValid() )
-  {
-    mCRS->setValidationHint( tr( "Specify CRS for layer %1" ).arg( name() ) );
-    mCRS->validate();
-  }
-
-  //set up the coordinat transform - in the case of raster this is mainly used to convert
-  //the inverese projection of the map extents of the canvas when zzooming in etc. so
-  //that they match the coordinate system of this layer
-  QgsDebugMsg( "Layer registry has " + QString::number( QgsMapLayerRegistry::instance()->count() ) + "layers" );
-
-  metadata();
-
-  // Use the affine transform to get geo coordinates for
-  // the corners of the raster
-  double myXMax = mGeoTransform[0] +
-                  GDALGetRasterXSize( mGdalDataset ) * mGeoTransform[1] +
-                  GDALGetRasterYSize( mGdalDataset ) * mGeoTransform[2];
-  double myYMin = mGeoTransform[3] +
-                  GDALGetRasterXSize( mGdalDataset ) * mGeoTransform[4] +
-                  GDALGetRasterYSize( mGdalDataset ) * mGeoTransform[5];
-
-  mLayerExtent.setXMaximum( myXMax );
-  // The affine transform reduces to these values at the
-  // top-left corner of the raster
-  mLayerExtent.setXMinimum( mGeoTransform[0] );
-  mLayerExtent.setYMaximum( mGeoTransform[3] );
-  mLayerExtent.setYMinimum( myYMin );
-
-  //
-  // Set up the x and y dimensions of this raster layer
-  //
-  mWidth = GDALGetRasterXSize( mGdalDataset );
-  mHeight = GDALGetRasterYSize( mGdalDataset );
-
-  //
-  // Determine the nodata value
-  //
-  mNoDataValue = -9999.0; //Standard default?
-  mValidNoDataValue = false;
-  int isValid = false;
-  double myNoDataValue = GDALGetRasterNoDataValue( GDALGetRasterBand( mGdalDataset, 1 ), &isValid );
-  if ( isValid )
-  {
-    mNoDataValue = myNoDataValue;
-    mValidNoDataValue = true;
-  }
-
-  if ( mValidNoDataValue )
-  {
-    mRasterTransparency.initializeTransparentPixelList( mNoDataValue, mNoDataValue, mNoDataValue );
-    mRasterTransparency.initializeTransparentPixelList( mNoDataValue );
-  }
-
-  // Moved to setDataProvider, later maybe to constructor
-  //mBandCount = GDALGetRasterCount( mGdalDataset );
-  //for ( int i = 1; i <= mBandCount; i++ )
-  //{
-    //GDALRasterBandH myGdalBand = GDALGetRasterBand( mGdalDataset, i );
-    //QgsRasterBandStats myRasterBandStats;
-    //myRasterBandStats.bandName = generateBandName( i );
-    //myRasterBandStats.bandNumber = i;
-    //myRasterBandStats.statsGathered = false;
-    //myRasterBandStats.histogramVector = new QgsRasterBandStats::HistogramVector();
-    ////Store the default color table
-    //readColorTable( i, &myRasterBandStats.colorTable );
-
-    //mRasterStatsList.push_back( myRasterBandStats );
-
-    ////Build a new contrast enhancement for the band and store in list
-    //QgsContrastEnhancement myContrastEnhancement(( QgsContrastEnhancement::QgsRasterDataType )GDALGetRasterDataType( myGdalBand ) );
-    //mContrastEnhancementList.append( myContrastEnhancement );
-  //}
-
-  //defaults - Needs to be set after the Contrast list has been build
-  //Try to read the default contrast enhancement from the config file
-  //QSettings myQSettings;
-  //setContrastEnhancementAlgorithm( myQSettings.value( "/Raster/defaultContrastEnhancementAlgorithm", "StretchToMinimumMaximum" ).toString() );
-
-  ////decide what type of layer this is...
-  ////TODO Change this to look at the color interp and palette interp to decide which type of layer it is
-  //if (( GDALGetRasterCount( mGdalDataset ) > 1 ) )
-  //{
-    //mRasterType = Multiband;
-  //}
-  ////TODO hasBand is really obsolete and only used in the Palette instance, change to new function hasPalette(int)
-  //else if ( hasBand( "Palette" ) ) //don't tr() this its a gdal word!
-  //{
-    //mRasterType = Palette;
-  //}
-  //else
-  //{
-    //mRasterType = GrayOrUndefined;
-  //}
-
-  //if ( mRasterType == Palette )
-  //{
-    //mRedBandName = TRSTRING_NOT_SET; // sensible default
-    //mGreenBandName = TRSTRING_NOT_SET; // sensible default
-    //mBlueBandName = TRSTRING_NOT_SET;// sensible default
-    //mTransparencyBandName = TRSTRING_NOT_SET; // sensible default
-    //mGrayBandName = bandName( 1 );  //sensible default
-    //QgsDebugMsg( mGrayBandName );
-
-    //mDrawingStyle = PalettedColor; //sensible default
-
-    ////Set up a new color ramp shader
-    //setColorShadingAlgorithm( ColorRampShader );
-    //QgsColorRampShader* myColorRampShader = ( QgsColorRampShader* ) mRasterShader->rasterShaderFunction();
-    ////TODO: Make sure the set algorithm and cast was successful,
-    ////e.g., if ( 0 != myColorRampShader && myColorRampShader->shaderTypeAsString == "ColorRampShader" )
-    //myColorRampShader->setColorRampType( QgsColorRampShader::INTERPOLATED );
-    //myColorRampShader->setColorRampItemList( *colorTable( 1 ) );
-  //}
-  //else if ( mRasterType == Multiband )
-  //{
-    ////we know we have at least 2 layers...
-    //mRedBandName = bandName( myQSettings.value( "/Raster/defaultRedBand", 1 ).toInt() );  // sensible default
-    //mGreenBandName = bandName( myQSettings.value( "/Raster/defaultGreenBand", 2 ).toInt() );  // sensible default
-
-    ////Check to make sure preferred bands combinations are valid
-    //if ( mRedBandName.isEmpty() )
-    //{
-      //mRedBandName = bandName( 1 );
-    //}
-
-    //if ( mGreenBandName.isEmpty() )
-    //{
-      //mGreenBandName = bandName( 2 );
-    //}
-
-    ////for the third layer we cant be sure so..
-    //if ( GDALGetRasterCount( mGdalDataset ) > 2 )
-    //{
-      //mBlueBandName = bandName( myQSettings.value( "/Raster/defaultBlueBand", 3 ).toInt() ); // sensible default
-      //if ( mBlueBandName.isEmpty() )
-      //{
-        //mBlueBandName = bandName( 3 );
-      //}
-    //}
-    //else
-    //{
-      //mBlueBandName = bandName( myQSettings.value( "/Raster/defaultBlueBand", 2 ).toInt() );  // sensible default
-      //if ( mBlueBandName.isEmpty() )
-      //{
-        //mBlueBandName = bandName( 2 );
-      //}
-    //}
-
-
-    //mTransparencyBandName = TRSTRING_NOT_SET;
-    //mGrayBandName = TRSTRING_NOT_SET;  //sensible default
-    //mDrawingStyle = MultiBandColor;  //sensible default
-  //}
-  //else                        //GrayOrUndefined
-  //{
-    //mRedBandName = TRSTRING_NOT_SET; //sensible default
-    //mGreenBandName = TRSTRING_NOT_SET; //sensible default
-    //mBlueBandName = TRSTRING_NOT_SET;  //sensible default
-    //mTransparencyBandName = TRSTRING_NOT_SET;  //sensible default
-    //mDrawingStyle = SingleBandGray;  //sensible default
-    //mGrayBandName = bandName( 1 );
-  //}
-
-  ////mark the layer as valid
-  //mValid = true;
+  mValid = false;
   return true;
-
 } // QgsRasterLayer::readFile
 
 /*
@@ -6043,6 +5629,12 @@
   mNumCurrentImageRows = ySize;
   QgsDebugMsg( "alloc " + QString::number( size * xSize * ySize) );
   mCurrentGDALData = VSIMalloc( size * xSize * ySize );
+  double *p = (double *)mCurrentGDALData;
+  for ( int i = 0; i  < xSize * ySize; i++ ) 
+  {
+    *p = mDataProvider->noDataValue();
+    p++;
+  }
   //CPLErr myErr = GDALRasterIO( mRasterBand, GF_Read, mViewPort->rectXOffset,
   //                             mViewPort->rectYOffset + mCurrentRow, mViewPort->clippedWidth, rasterYSize,
   //                             mCurrentGDALData, xSize, ySize, type, 0, 0 );
@@ -6200,3 +5792,11 @@
     }
   }
 }
+
+// Keep this for now, it is used by Python interface!!!
+void QgsRasterLayer::registerGdalDrivers()
+{
+  if ( GDALGetDriverCount() == 0 )
+    GDALAllRegister();
+}
+

Modified: branches/raster-providers/src/core/raster/qgsrasterlayer.h
===================================================================
--- branches/raster-providers/src/core/raster/qgsrasterlayer.h	2010-11-12 16:33:33 UTC (rev 14558)
+++ branches/raster-providers/src/core/raster/qgsrasterlayer.h	2010-11-12 16:34:45 UTC (rev 14559)
@@ -292,6 +292,7 @@
     /** Return time stamp for given file name */
     static QDateTime lastModified( const QString &  name );
 
+    // Keep this for now, it is used by Python interface!!!
     /** \brief ensures that GDAL drivers are registered, but only once */
     static void registerGdalDrivers();
 
@@ -648,9 +649,6 @@
     virtual void setSubLayerVisibility( const QString & name, bool vis );
 
 
-
-
-
   public slots:
     /** \brief Create GDAL pyramid overviews */
     QString buildPyramids( const RasterPyramidList &,

Added: branches/raster-providers/src/providers/gdal/CMakeLists.txt
===================================================================
--- branches/raster-providers/src/providers/gdal/CMakeLists.txt	                        (rev 0)
+++ branches/raster-providers/src/providers/gdal/CMakeLists.txt	2010-11-12 16:34:45 UTC (rev 14559)
@@ -0,0 +1,24 @@
+
+SET(GDAL_SRCS qgsgdalprovider.cpp)
+SET (GDAL_MOC_HDRS  qgsgdalprovider.h)
+
+INCLUDE_DIRECTORIES (
+  ../../core
+  ../../core/raster
+  ${GDAL_INCLUDE_DIR}
+#  ${PROJ_INCLUDE_DIR}
+#  ${GEOS_INCLUDE_DIR}
+)
+
+#QT4_WRAP_CPP(GDAL_MOC_SRCS ${GDAL_MOC_HDRS})
+#ADD_LIBRARY (gdalprovider MODULE ${GDAL_SRCS} ${GDAL_MOC_SRCS})
+ADD_LIBRARY (gdalprovider MODULE ${GDAL_SRCS} )
+
+TARGET_LINK_LIBRARIES (gdalprovider
+  qgis_core
+)
+
+INSTALL(TARGETS gdalprovider
+  RUNTIME DESTINATION ${QGIS_PLUGIN_DIR}
+  LIBRARY DESTINATION ${QGIS_PLUGIN_DIR})
+

Added: branches/raster-providers/src/providers/gdal/qgsgdalprovider.cpp
===================================================================
--- branches/raster-providers/src/providers/gdal/qgsgdalprovider.cpp	                        (rev 0)
+++ branches/raster-providers/src/providers/gdal/qgsgdalprovider.cpp	2010-11-12 16:34:45 UTC (rev 14559)
@@ -0,0 +1,666 @@
+/***************************************************************************
+  qgsgdalprovider.cpp  -  QGIS Data provider for
+                           GDAL rasters
+                             -------------------
+    begin                : November, 2010
+    copyright            : (C) 2010 by Radim Blazek
+    email                : radim dot blazek at gmail dot com
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
+/* $Id: qgsgdalprovider.cpp 11522 2009-08-28 14:49:22Z jef $ */
+
+#include "qgslogger.h"
+#include "qgsgdalprovider.h"
+#include "qgsconfig.h"
+
+#include <math.h>
+
+#include "qgsapplication.h"
+#include "qgscoordinatetransform.h"
+#include "qgsrectangle.h"
+#include "qgscoordinatereferencesystem.h"
+
+#include <QImage>
+#include <QSettings>
+#include <QColor>
+#include <QProcess>
+#include <QMessageBox>
+#include <QDir>
+#include <QFileInfo>
+#include <QFile>
+#include <QHash>
+
+#include "gdalwarper.h"
+#include "ogr_spatialref.h"
+#include "cpl_conv.h"
+
+static QString PROVIDER_KEY = "gdal";
+static QString PROVIDER_DESCRIPTION = "GDAL provider";
+
+QgsGdalProvider::QgsGdalProvider( QString const & uri )
+    : QgsRasterDataProvider( uri ), mValid( true )
+{
+  QgsDebugMsg( "QgsGdalProvider: constructing with uri '" + uri + "'." );
+
+  mValid = false;
+
+  // Initialise the affine transform matrix
+  mGeoTransform[0] =  0;
+  mGeoTransform[1] =  1;
+  mGeoTransform[2] =  0;
+  mGeoTransform[3] =  0;
+  mGeoTransform[4] =  0;
+  mGeoTransform[5] = -1;
+
+
+  registerGdalDrivers();
+  mGdalDataset = NULL;
+
+  mGdalBaseDataset = GDALOpen( QFile::encodeName( uri ).constData(), GA_ReadOnly );
+
+  CPLErrorReset();
+  if ( mGdalBaseDataset == NULL )
+  {
+    QMessageBox::warning( 0, QObject::tr( "Warning" ),
+      QObject::tr( "Cannot open GDAL dataset ") + uri + " : "
+      + QString::fromUtf8( CPLGetLastErrorMsg()  ) );
+     return;
+  }
+
+  QgsDebugMsg ("GdalDataset opened" );
+
+  // Check if we need a warped VRT for this file.
+  if (( GDALGetGeoTransform( mGdalBaseDataset, mGeoTransform ) == CE_None
+        && ( mGeoTransform[1] < 0.0
+             || mGeoTransform[2] != 0.0
+             || mGeoTransform[4] != 0.0
+             || mGeoTransform[5] > 0.0 ) )
+      || GDALGetGCPCount( mGdalBaseDataset ) > 0 )
+  {
+    QgsLogger::warning( "Creating Warped VRT." );
+
+    mGdalDataset =
+      GDALAutoCreateWarpedVRT( mGdalBaseDataset, NULL, NULL,
+                               GRA_NearestNeighbour, 0.2, NULL );
+    if ( mGdalDataset == NULL )
+    {
+      QgsLogger::warning( "Warped VRT Creation failed." );
+      mGdalDataset = mGdalBaseDataset;
+      GDALReferenceDataset( mGdalDataset );
+    }
+  }
+  else
+  {
+    mGdalDataset = mGdalBaseDataset;
+    GDALReferenceDataset( mGdalDataset );
+  }
+
+  //check if this file has pyramids
+  CPLErrorReset();
+  GDALRasterBandH myGDALBand = GDALGetRasterBand( mGdalDataset, 1 ); //just use the first band
+  if ( myGDALBand == NULL )
+  {
+    QMessageBox::warning( 0, QObject::tr( "Warning" ),
+      QObject::tr( "Cannot get GDAL raster band : " )
+      + QString::fromUtf8( CPLGetLastErrorMsg()  ) ) ;
+
+    GDALDereferenceDataset( mGdalBaseDataset );
+    mGdalBaseDataset = NULL;
+
+    GDALClose( mGdalDataset );
+    mGdalDataset = NULL;
+    return;
+  }
+
+  mHasPyramids = GDALGetOverviewCount( myGDALBand ) > 0;
+
+  //populate the list of what pyramids exist
+  // TODO
+  //buildPyramidList();
+
+  // Get the layer's projection info and set up the
+  // QgsCoordinateTransform for this layer
+  // NOTE: we must do this before metadata is called
+
+  QString myWktString;
+  myWktString = QString( GDALGetProjectionRef( mGdalDataset ) );
+  mCrs.createFromWkt( myWktString );
+  if ( !mCrs.isValid() )
+  {
+    //try to get the gcp srs from the raster layer if available
+    myWktString = QString( GDALGetGCPProjection( mGdalDataset ) );
+// What is the purpose of this piece of code?
+// Sideeffects from validate()?
+//    myCRS.createFromWkt(myWktString);
+//    if (!myCRS.isValid())
+//    {
+//      // use force and make CRS valid!
+//      myCRS.validate();
+//    }
+
+  }
+
+  //set up the coordinat transform - in the case of raster this is mainly used to convert
+  //the inverese projection of the map extents of the canvas when zooming in etc. so
+  //that they match the coordinate system of this layer
+  //QgsDebugMsg( "Layer registry has " + QString::number( QgsMapLayerRegistry::instance()->count() ) + "layers" );
+
+  //metadata();
+
+  // Use the affine transform to get geo coordinates for
+  // the corners of the raster
+  double myXMax = mGeoTransform[0] +
+                  GDALGetRasterXSize( mGdalDataset ) * mGeoTransform[1] +
+                  GDALGetRasterYSize( mGdalDataset ) * mGeoTransform[2];
+  double myYMin = mGeoTransform[3] +
+                  GDALGetRasterXSize( mGdalDataset ) * mGeoTransform[4] +
+                  GDALGetRasterYSize( mGdalDataset ) * mGeoTransform[5];
+
+  mExtent.setXMaximum( myXMax );
+  // The affine transform reduces to these values at the
+  // top-left corner of the raster
+  mExtent.setXMinimum( mGeoTransform[0] );
+  mExtent.setYMaximum( mGeoTransform[3] );
+  mExtent.setYMinimum( myYMin );
+
+  //
+  // Set up the x and y dimensions of this raster layer
+  //
+  mWidth = GDALGetRasterXSize( mGdalDataset );
+  mHeight = GDALGetRasterYSize( mGdalDataset );
+
+
+  GDALGetBlockSize( GDALGetRasterBand( mGdalDataset, 1 ), &mXBlockSize, &mYBlockSize );
+  //
+  // Determine the nodata value
+  //
+  mNoDataValue = -9999.0; //Standard default?
+  mValidNoDataValue = false;
+  int isValid = false;
+  double myNoDataValue = GDALGetRasterNoDataValue( GDALGetRasterBand( mGdalDataset, 1 ), &isValid );
+  if ( isValid )
+  {
+    mNoDataValue = myNoDataValue;
+    mValidNoDataValue = true;
+  }
+
+  mValid = true;
+  QgsDebugMsg( "end" );
+}
+
+QgsGdalProvider::~QgsGdalProvider()
+{
+  QgsDebugMsg( "QgsGdalProvider: deconstructing." );
+}
+
+
+    
+QString QgsGdalProvider::metadata()
+{
+  QString myMetadata ;
+  myMetadata += QString( GDALGetDescription( GDALGetDatasetDriver( mGdalDataset ) ) );
+  myMetadata += "<br>";
+  myMetadata += QString( GDALGetMetadataItem( GDALGetDatasetDriver( mGdalDataset ), GDAL_DMD_LONGNAME, NULL ) );
+
+  // my added code (MColetti)
+
+  myMetadata += "<p class=\"glossy\">";
+  myMetadata += tr( "Dataset Description" );
+  myMetadata += "</p>\n";
+  myMetadata += "<p>";
+  myMetadata += QFile::decodeName( GDALGetDescription( mGdalDataset ) );
+  myMetadata += "</p>\n";
+
+
+  char ** GDALmetadata = GDALGetMetadata( mGdalDataset, NULL );
+
+  if ( GDALmetadata )
+  {
+    QStringList metadata = cStringList2Q_( GDALmetadata );
+    myMetadata += QgsRasterDataProvider::makeTableCells( metadata );
+  }
+  else
+  {
+    QgsDebugMsg( "dataset has no metadata" );
+  }
+
+  for ( int i = 1; i <= GDALGetRasterCount( mGdalDataset ); ++i )
+  {
+    myMetadata += "<p class=\"glossy\">" + tr( "Band %1" ).arg( i ) + "</p>\n";
+    GDALRasterBandH gdalBand = GDALGetRasterBand( mGdalDataset, i );
+    GDALmetadata = GDALGetMetadata( gdalBand, NULL );
+
+    if ( GDALmetadata )
+    {
+      QStringList metadata = cStringList2Q_( GDALmetadata );
+      myMetadata += QgsRasterDataProvider::makeTableCells( metadata );
+    }
+    else
+    {
+      QgsDebugMsg( "band " + QString::number( i ) + " has no metadata" );
+    }
+
+    char ** GDALcategories = GDALGetRasterCategoryNames( gdalBand );
+
+    if ( GDALcategories )
+    {
+      QStringList categories = cStringList2Q_( GDALcategories );
+      myMetadata += QgsRasterDataProvider::makeTableCells( categories );
+    }
+    else
+    {
+      QgsDebugMsg( "band " + QString::number( i ) + " has no categories" );
+    }
+
+  }
+
+  // end my added code
+
+  myMetadata += "<p class=\"glossy\">";
+  myMetadata += tr( "Dimensions:" );
+  myMetadata += "</p>\n";
+  myMetadata += "<p>";
+  myMetadata += tr( "X: %1 Y: %2 Bands: %3" )
+                .arg( GDALGetRasterXSize( mGdalDataset ) )
+                .arg( GDALGetRasterYSize( mGdalDataset ) )
+                .arg( GDALGetRasterCount( mGdalDataset ) );
+  myMetadata += "</p>\n";
+
+  //just use the first band
+  GDALRasterBandH myGdalBand = GDALGetRasterBand( mGdalDataset, 1 );
+  if ( GDALGetOverviewCount( myGdalBand ) > 0 )
+  {
+    int myOverviewInt;
+    for ( myOverviewInt = 0;
+          myOverviewInt < GDALGetOverviewCount( myGdalBand );
+          myOverviewInt++ )
+    {
+      GDALRasterBandH myOverview;
+      myOverview = GDALGetOverview( myGdalBand, myOverviewInt );
+      myMetadata += "<p>X : " + QString::number( GDALGetRasterBandXSize( myOverview ) );
+      myMetadata += ",Y " + QString::number( GDALGetRasterBandYSize( myOverview ) ) + "</p>";
+    }
+  }
+  myMetadata += "</p>\n";
+
+  if ( GDALGetGeoTransform( mGdalDataset, mGeoTransform ) != CE_None )
+  {
+    // if the raster does not have a valid transform we need to use
+    // a pixel size of (1,-1), but GDAL returns (1,1)
+    mGeoTransform[5] = -1;
+  }
+  else
+  {
+    myMetadata += "<p class=\"glossy\">";
+    myMetadata += tr( "Origin:" );
+    myMetadata += "</p>\n";
+    myMetadata += "<p>";
+    myMetadata += QString::number( mGeoTransform[0] );
+    myMetadata += ",";
+    myMetadata += QString::number( mGeoTransform[3] );
+    myMetadata += "</p>\n";
+
+    myMetadata += "<p class=\"glossy\">";
+    myMetadata += tr( "Pixel Size:" );
+    myMetadata += "</p>\n";
+    myMetadata += "<p>";
+    myMetadata += QString::number( mGeoTransform[1] );
+    myMetadata += ",";
+    myMetadata += QString::number( mGeoTransform[5] );
+    myMetadata += "</p>\n";
+  }
+
+  return myMetadata;
+}
+
+
+// Not supported by GDAL
+QImage* QgsGdalProvider::draw( QgsRectangle  const & viewExtent, int pixelWidth, int pixelHeight )
+{
+  QgsDebugMsg( "pixelWidth = "  + QString::number( pixelWidth ) );
+  QgsDebugMsg( "pixelHeight = "  + QString::number( pixelHeight ) );
+  QgsDebugMsg( "viewExtent: " + viewExtent.toString() );
+
+  QImage *image = new QImage( pixelWidth, pixelHeight, QImage::Format_ARGB32 );
+  image->fill( QColor( Qt::gray ).rgb() );
+
+  return image;
+}
+
+
+void QgsGdalProvider::readBlock( int theBandNo, int xBlock, int yBlock, void *block )
+{
+  QgsDebugMsg( "Entered" );
+  
+  QgsDebugMsg( "yBlock = "  + QString::number( yBlock ) );
+
+  GDALRasterBandH myGdalBand = GDALGetRasterBand( mGdalDataset, theBandNo );
+  GDALReadBlock( myGdalBand, xBlock, yBlock, block );
+}
+
+void QgsGdalProvider::readBlock( int theBandNo, QgsRectangle  const & theExtent, int thePixelWidth, int thePixelHeight, void *theBlock )
+{
+  QgsDebugMsg( "thePixelWidth = "  + QString::number( thePixelWidth ) );
+  QgsDebugMsg( "thePixelHeight = "  + QString::number( thePixelHeight ) );
+  QgsDebugMsg( "theExtent: " + theExtent.toString() );
+
+
+  GDALRasterBandH myGdalBand = GDALGetRasterBand( mGdalDataset, theBandNo );
+  GDALDataType myGdalDataType = GDALGetRasterDataType( myGdalBand );
+
+  //QString myMemDsn = QString( "MEM:::DATAPOINTER=%1,PIXELS=%2,LINES=%3,BANDS=1,DATATYPE=%4,PIXELOFFSET=0,LINEOFFSET=0,BANDOFFSET=0")
+    //.arg ( (long) theBlock )  
+    //.arg ( thePixelWidth )  
+    //.arg ( thePixelHeight )  
+    //.arg ( GDALGetDataTypeName( myGdalDataType ) ); 
+
+  QString myMemDsn;
+  myMemDsn.sprintf ( "DATAPOINTER = %p", theBlock ); 
+  QgsDebugMsg(  myMemDsn );
+ 
+  myMemDsn.sprintf ( "MEM:::DATAPOINTER=%u,PIXELS=%d,LINES=%d,BANDS=1,DATATYPE=%s,PIXELOFFSET=0,LINEOFFSET=0,BANDOFFSET=0", (int)theBlock, thePixelWidth, thePixelHeight,  GDALGetDataTypeName( myGdalDataType ) );
+
+  QgsDebugMsg( "Open GDAL MEM : " + myMemDsn );
+
+  
+  CPLErrorReset();
+  GDALDatasetH myGdalMemDataset = GDALOpen( myMemDsn.toAscii().constData(),GA_Update);
+
+  if ( !myGdalMemDataset )
+  {
+    QMessageBox::warning( 0, QObject::tr( "Warning" ),
+      QObject::tr( "Cannot open GDAL MEM dataset ") + myMemDsn + " : "
+      + QString::fromUtf8( CPLGetLastErrorMsg()  ) );
+     return;
+  }
+  // TODO add CRS to method params
+  //GDALSetProjection( myGdalMemDataset, crs().toWkt().toAscii().constData() );
+  GDALSetProjection( myGdalMemDataset, GDALGetProjectionRef( mGdalDataset ) ); 
+
+  double myMemGeoTransform[6];
+  myMemGeoTransform[0] = theExtent.xMinimum(); /* top left x */
+  myMemGeoTransform[1] = theExtent.width()/thePixelWidth; /* w-e pixel resolution */
+  myMemGeoTransform[2] = 0; /* rotation, 0 if image is "north up" */
+  myMemGeoTransform[3] = theExtent.yMaximum(); /* top left y */
+  myMemGeoTransform[4] = 0; /* rotation, 0 if image is "north up" */
+  myMemGeoTransform[5] = theExtent.height()/thePixelHeight; /* n-s pixel resolution */
+
+  double myGeoTransform[6];
+  GDALGetGeoTransform( mGdalDataset, myGeoTransform );
+  GDALSetGeoTransform( myGdalMemDataset, myGeoTransform );
+  GDALGetGeoTransform( myGdalMemDataset, myMemGeoTransform );
+
+  for ( int i = 0 ; i < 6; i++ ) 
+  {
+    QgsDebugMsg ( QString("transform : %1 %2").arg(myGeoTransform[i]).arg ( myMemGeoTransform[i] ) );
+  }
+
+  GDALWarpOptions *myWarpOptions = GDALCreateWarpOptions();
+
+  myWarpOptions->hSrcDS = mGdalDataset;
+  myWarpOptions->hDstDS = myGdalMemDataset;
+
+  myWarpOptions->nBandCount = 1;
+  myWarpOptions->panSrcBands = 
+    (int *) CPLMalloc(sizeof(int) * myWarpOptions->nBandCount );
+  myWarpOptions->panSrcBands[0] = 1;
+  myWarpOptions->panDstBands = 
+    (int *) CPLMalloc(sizeof(int) * myWarpOptions->nBandCount );
+  myWarpOptions->panDstBands[0] = 1;
+
+  // TODO move here progressCallback and use it
+  myWarpOptions->pfnProgress = GDALTermProgress;   
+
+  QgsDebugMsg ( "src wkt: " +  QString (GDALGetProjectionRef(mGdalDataset) ) ); 
+  QgsDebugMsg ( "dst wkt: " +  QString ( GDALGetProjectionRef(myGdalMemDataset) ) ); 
+  myWarpOptions->pTransformerArg = 
+      GDALCreateGenImgProjTransformer( 
+        mGdalDataset, 
+        GDALGetProjectionRef(mGdalDataset), 
+        myGdalMemDataset,
+        GDALGetProjectionRef(myGdalMemDataset), 
+        FALSE, 0.0, 1 
+      );
+  myWarpOptions->pfnTransformer = GDALGenImgProjTransform;
+
+  GDALWarpOperation myOperation;
+
+  myOperation.Initialize( myWarpOptions );
+  CPLErrorReset();
+  CPLErr myErr = myOperation.ChunkAndWarpImage( 0, 0, thePixelWidth, thePixelHeight ); 
+  if ( myErr != CPLE_None )
+  {
+    QMessageBox::warning( 0, QObject::tr( "Warning" ),
+      QObject::tr( "Cannot ChunkAndWarpImage : " )
+      + QString::fromUtf8( CPLGetLastErrorMsg()  ) );
+     return;
+  }
+
+  GDALDestroyGenImgProjTransformer( myWarpOptions->pTransformerArg );
+  GDALDestroyWarpOptions( myWarpOptions );
+
+  // this works 
+  //myErr = GDALRasterIO( myGdalBand, GF_Read, 0, 0, 
+  //  xSize(), ySize(),
+  //  theBlock,  thePixelWidth, thePixelHeight,
+  //  myGdalDataType, 0, 0 ); 
+
+  //GDALClose( myGdalMemDataset ); 
+
+}
+
+double  QgsGdalProvider::noDataValue() const {
+  return mNoDataValue;
+}
+
+double  QgsGdalProvider::minimumValue( int theBandNo ) const {
+  double GDALrange[2];
+  GDALRasterBandH myGdalBand = GDALGetRasterBand( mGdalDataset, theBandNo );
+  GDALComputeRasterMinMax( myGdalBand, 1, GDALrange ); //Approximate
+  return  GDALrange[0];
+}
+double  QgsGdalProvider::maximumValue( int theBandNo ) const {
+  double GDALrange[2];
+  GDALRasterBandH myGdalBand = GDALGetRasterBand( mGdalDataset, theBandNo );
+  GDALComputeRasterMinMax( myGdalBand, 1, GDALrange ); //Approximate
+  return  GDALrange[1];
+}
+
+QList<QgsColorRampShader::ColorRampItem> QgsGdalProvider::colorTable(int bandNo)const {
+  // TODO
+  QList<QgsColorRampShader::ColorRampItem> ct;
+  
+  //double v, r, g, b;
+  //for (i = colors.begin(); i != colors.end(); ++i)
+  //{
+    //QgsColorRampShader::ColorRampItem ctItem2;
+    //ctItem2.value = i->value2;
+    //ctItem2.color = QColor::fromRgb( i->red2, i->green2, i->blue2);
+    //ct.append(ctItem2);
+    //QgsDebugMsg( QString("color %1 %2 %3 %4").arg(i->value2).arg(i->red2).arg(i->green2).arg(i->blue2) );
+
+    //v = i->value2; r = i->red2; g = i->green2; b = i->blue2;
+  //}
+  return ct;
+}
+
+QgsCoordinateReferenceSystem QgsGdalProvider::crs()
+{
+  QgsDebugMsg( "Entered" );
+  return mCrs;
+}
+
+QgsRectangle QgsGdalProvider::extent()
+{
+  //TODO
+  //mExtent = QgsGdal::extent( mGisdbase, mLocation, mMapset, mMapName, QgsGdal::Raster );
+  return mExtent;
+}
+
+// this is only called once when statistics are calculated
+// TODO
+int QgsGdalProvider::xBlockSize() const { 
+  return mXBlockSize; 
+} 
+int QgsGdalProvider::yBlockSize() const { 
+  return mYBlockSize; 
+}
+
+int QgsGdalProvider::xSize() const { return mWidth; } 
+int QgsGdalProvider::ySize() const { return mHeight; }
+
+bool QgsGdalProvider::identify( const QgsPoint& thePoint, QMap<QString, QString>& theResults )
+{
+  QgsDebugMsg( "Entered" );
+  // TODO
+  theResults["Error"] = tr( "Not implemented" );
+  //theResults["Error"] = tr( "Out of extent" );
+  //theResults = QgsGdal::query( mGisdbase, mLocation, mMapset, mMapName, QgsGdal::Raster, thePoint.x(), thePoint.y() );
+  return true;
+}
+
+int QgsGdalProvider::capabilities() const
+{
+  int capability = QgsRasterDataProvider::Identify 
+                 | QgsRasterDataProvider::Data;
+  return capability;
+}
+
+int QgsGdalProvider::dataType( int bandNo ) const
+{
+  GDALRasterBandH myGdalBand = GDALGetRasterBand( mGdalDataset, bandNo ); 
+  GDALDataType myGdalDataType = GDALGetRasterDataType( myGdalBand );
+
+  switch ( myGdalDataType ) {
+    case GDT_Unknown:
+      return QgsRasterDataProvider::UnknownDataType;
+      break;
+    case GDT_Byte:
+      return QgsRasterDataProvider::Byte;
+      break;
+    case GDT_UInt16:
+      return QgsRasterDataProvider::UInt16;
+      break;
+    case GDT_Int16:
+      return QgsRasterDataProvider::Int16;
+      break;
+    case GDT_UInt32:
+      return QgsRasterDataProvider::UInt32;
+      break;
+    case GDT_Int32:
+      return QgsRasterDataProvider::Int32;
+      break;
+    case GDT_Float32:
+      return QgsRasterDataProvider::Float32;
+      break;
+    case GDT_Float64:
+      return QgsRasterDataProvider::Float64;
+      break;
+    case GDT_CInt16:
+      return QgsRasterDataProvider::CInt16;
+      break;
+    case GDT_CInt32:
+      return QgsRasterDataProvider::CInt32;
+      break;
+    case GDT_CFloat32:
+      return QgsRasterDataProvider::CFloat32;
+      break;
+    case GDT_CFloat64:
+      return QgsRasterDataProvider::CFloat64;
+      break;
+  }
+  return QgsRasterDataProvider::UnknownDataType;
+}
+
+int QgsGdalProvider::bandCount() const
+{
+  return GDALGetRasterCount( mGdalDataset);
+}
+
+int QgsGdalProvider::colorInterpretation ( int bandNo ) const {
+  // TODO
+  return QgsRasterDataProvider::GrayIndex;
+}
+
+void QgsGdalProvider::registerGdalDrivers()
+{
+  if ( GDALGetDriverCount() == 0 )
+    GDALAllRegister();
+}
+
+
+bool QgsGdalProvider::isValid()
+{
+  QgsDebugMsg ( QString("valid = %1").arg(mValid)); 
+  return mValid;
+}
+
+QString QgsGdalProvider::identifyAsText( const QgsPoint& point )
+{
+  return  QString( "Not implemented" );
+}
+
+QString QgsGdalProvider::identifyAsHtml( const QgsPoint& point )
+{
+  return  QString( "Not implemented" );
+}
+
+QString QgsGdalProvider::lastErrorTitle()
+{
+  return  QString( "Not implemented" );
+}
+
+QString QgsGdalProvider::lastError()
+{
+  return  QString( "Not implemented" );
+}
+
+QString  QgsGdalProvider::name() const
+{
+  return PROVIDER_KEY;
+}
+
+QString  QgsGdalProvider::description() const
+{
+  return PROVIDER_DESCRIPTION;
+}
+
+/**
+ * Class factory to return a pointer to a newly created
+ * QgsGdalProvider object
+ */
+QGISEXTERN QgsGdalProvider * classFactory( const QString *uri )
+{
+  return new QgsGdalProvider( *uri );
+}
+/** Required key function (used to map the plugin to a data store type)
+*/
+QGISEXTERN QString providerKey()
+{
+  return PROVIDER_KEY;
+}
+/**
+ * Required description function
+ */
+QGISEXTERN QString description()
+{
+  return PROVIDER_DESCRIPTION;
+}
+/**
+ * Required isProvider function. Used to determine if this shared library
+ * is a data provider plugin
+ */
+QGISEXTERN bool isProvider()
+{
+  return true;
+}
+

Added: branches/raster-providers/src/providers/gdal/qgsgdalprovider.h
===================================================================
--- branches/raster-providers/src/providers/gdal/qgsgdalprovider.h	                        (rev 0)
+++ branches/raster-providers/src/providers/gdal/qgsgdalprovider.h	2010-11-12 16:34:45 UTC (rev 14559)
@@ -0,0 +1,265 @@
+/***************************************************************************
+      qgsgdalprovider.h  -  QGIS Data provider for
+                           GDAL rasters
+                             -------------------
+    begin                : November, 2010
+    copyright            : (C) 2010 by Radim Blazek
+    email                : radim dot blazek at gmail dot com
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
+/* $Id: qgsgdalprovider.h 12528 2009-12-20 12:29:07Z jef $ */
+
+#ifndef QGSGDALPROVIDER_H
+#define QGSGDALPROVIDER_H
+
+
+#include "qgscoordinatereferencesystem.h"
+#include "qgsrasterdataprovider.h"
+#include "qgsrectangle.h"
+#include "qgscolorrampshader.h"
+
+#include <QString>
+#include <QStringList>
+#include <QDomElement>
+#include <QMap>
+#include <QVector>
+
+#define CPL_SUPRESS_CPLUSPLUS
+#include <gdal.h>
+
+/** \ingroup core
+ * A call back function for showing progress of gdal operations.
+ */
+int CPL_STDCALL progressCallback( double dfComplete,
+                                  const char *pszMessage,
+                                  void * pProgressArg );
+
+
+class QgsCoordinateTransform;
+
+/**
+
+  \brief Data provider for OGC WMS layers.
+
+  This provider implements the
+  interface defined in the QgsDataProvider class to provide access to spatial
+  data residing in a OGC Web Map Service.
+
+*/
+class QgsGdalProvider : public QgsRasterDataProvider
+{
+    //Q_OBJECT
+
+  public:
+    /**
+    * Constructor for the provider.
+    *
+    * \param   uri   HTTP URL of the Web Server.  If needed a proxy will be used
+    *                otherwise we contact the host directly.
+    *
+    */
+    QgsGdalProvider( QString const & uri = 0 );
+
+    //! Destructor
+    ~QgsGdalProvider();
+
+    /** \brief   Renders the layer as an image
+     */
+    QImage* draw( QgsRectangle  const & viewExtent, int pixelWidth, int pixelHeight );
+
+    /** return a provider name
+
+    Essentially just returns the provider key.  Should be used to build file
+    dialogs so that providers can be shown with their supported types. Thus
+    if more than one provider supports a given format, the user is able to
+    select a specific provider to open that file.
+
+    @note
+
+    Instead of being pure virtual, might be better to generalize this
+    behavior and presume that none of the sub-classes are going to do
+    anything strange with regards to their name or description?
+
+    */
+    QString name() const;
+
+
+    /** return description
+
+    Return a terse string describing what the provider is.
+
+    @note
+
+    Instead of being pure virtual, might be better to generalize this
+    behavior and presume that none of the sub-classes are going to do
+    anything strange with regards to their name or description?
+
+    */
+    QString description() const;
+
+    /*! Get the QgsCoordinateReferenceSystem for this layer
+     * @note Must be reimplemented by each provider.
+     * If the provider isn't capable of returning
+     * its projection an empty srs will be return, ti will return 0
+     */
+    virtual QgsCoordinateReferenceSystem crs();
+
+    /** Return the extent for this data layer
+    */
+    virtual QgsRectangle extent();
+
+    /**Returns true if layer is valid
+    */
+    bool isValid();
+
+    /** \brief Identify raster value(s) found on the point position */
+    bool identify( const QgsPoint & point, QMap<QString, QString>& results );
+
+    /**
+     * \brief Identify details from a WMS Server from the last screen update
+     *
+     * \param point[in]  The pixel coordinate (as it was displayed locally on screen)
+     *
+     * \return  A text document containing the return from the WMS server
+     *
+     * \note WMS Servers prefer to receive coordinates in image space, therefore
+     *       this function expects coordinates in that format.
+     *
+     * \note  The arbitraryness of the returned document is enforced by WMS standards
+     *        up to at least v1.3.0
+     */
+    QString identifyAsText( const QgsPoint& point );
+
+    /**
+     * \brief Identify details from a WMS Server from the last screen update
+     *
+     * \param point[in]  The pixel coordinate (as it was displayed locally on screen)
+     *
+     * \return  A text document containing the return from the WMS server
+     *
+     * \note WMS Servers prefer to receive coordinates in image space, therefore
+     *       this function expects coordinates in that format.
+     *
+     * \note  The arbitraryness of the returned document is enforced by WMS standards
+     *        up to at least v1.3.0
+     *
+     * \note  added in 1.5
+     */
+    QString identifyAsHtml( const QgsPoint& point );
+
+    /**
+     * \brief   Returns the caption error text for the last error in this provider
+     *
+     * If an operation returns 0 (e.g. draw()), this function
+     * returns the text of the error associated with the failure.
+     * Interactive users of this provider can then, for example,
+     * call a QMessageBox to display the contents.
+     */
+    QString lastErrorTitle();
+
+    /**
+     * \brief   Returns the verbose error text for the last error in this provider
+     *
+     * If an operation returns 0 (e.g. draw()), this function
+     * returns the text of the error associated with the failure.
+     * Interactive users of this provider can then, for example,
+     * call a QMessageBox to display the contents.
+     */
+
+    QString lastError();
+
+    /** Returns a bitmask containing the supported capabilities
+        Note, some capabilities may change depending on which
+        sublayers are visible on this provider, so it may
+        be prudent to check this value per intended operation.
+      */
+    int capabilities() const;
+
+    int dataType ( int bandNo ) const;
+
+    int bandCount() const;
+
+    int colorInterpretation ( int bandNo ) const;
+
+    int xBlockSize() const;
+    int yBlockSize() const;
+
+    int xSize() const;
+    int ySize() const;
+
+
+    void readBlock( int bandNo, int xBlock, int yBlock, void *data );
+    void readBlock( int bandNo, QgsRectangle  const & viewExtent, int width, int height,  void *data );
+
+    double noDataValue() const;
+    double minimumValue(int bandNo)const;
+    double maximumValue(int bandNo)const;
+
+    QList<QgsColorRampShader::ColorRampItem> colorTable(int bandNo)const;
+
+
+    /**
+     * Get metadata in a format suitable for feeding directly
+     * into a subset of the GUI raster properties "Metadata" tab.
+     */
+    QString metadata(); 
+
+    // Following methods specific for  WMS are not used at all in this provider and should be removed IMO from qgsdataprovider.h
+    void addLayers( QStringList const &  layers, QStringList const &  styles = QStringList() ) {}
+    QStringList supportedImageEncodings() { return QStringList();}
+    QString imageEncoding() const { return QString(); }
+    void setImageEncoding( QString const & mimeType ) {}
+    void setImageCrs( QString const & crs ) {}
+
+    /** \brief ensures that GDAL drivers are registered, but only once */
+    static void registerGdalDrivers();
+
+  private:
+
+    /**
+    * Flag indicating if the layer data source is a valid WMS layer
+    */
+    bool mValid;
+
+    /** \brief Whether this raster has overviews / pyramids or not */
+    bool mHasPyramids;
+
+    QString mGisdbase;      // map gisdabase
+    QString mLocation;      // map location name (not path!)
+    QString mMapset;        // map mapset
+    QString mMapName;       // map name
+
+    QgsRectangle mExtent;
+    int mWidth;
+    int mHeight;
+    int mXBlockSize;
+    int mYBlockSize;
+
+    //GDALDataType mGdalDataType;
+
+    /** \brief Pointer to the gdaldataset */
+    GDALDatasetH mGdalBaseDataset;
+
+    /** \brief Pointer to the gdaldataset (possibly warped vrt) */
+    GDALDatasetH mGdalDataset;
+
+    /** \brief Values for mapping pixel to world coordinates. Contents of this array are the same as the GDAL adfGeoTransform */
+    double mGeoTransform[6];
+
+    //QHash<QString, QString> mInfo;
+
+    QgsCoordinateReferenceSystem mCrs;
+
+};
+
+#endif
+

Modified: branches/raster-providers/src/providers/grass/qgsgrassrasterprovider.cpp
===================================================================
--- branches/raster-providers/src/providers/grass/qgsgrassrasterprovider.cpp	2010-11-12 16:33:33 UTC (rev 14558)
+++ branches/raster-providers/src/providers/grass/qgsgrassrasterprovider.cpp	2010-11-12 16:34:45 UTC (rev 14559)
@@ -199,8 +199,8 @@
   QgsDebugMsg( "pixelHeight = "  + QString::number( pixelHeight ) );
   QgsDebugMsg( "viewExtent: " + viewExtent.toString() );
 
-  QImage *image = new QImage( pixelWidth, pixelHeight, QImage::Format_ARGB32 );
-  image->fill( QColor( Qt::gray ).rgb() );
+  //QImage *image = new QImage( pixelWidth, pixelHeight, QImage::Format_ARGB32 );
+  //image->fill( QColor( Qt::gray ).rgb() );
 
   QStringList arguments;
   arguments.append( "map=" +  mMapName + "@" + mMapset );

Modified: branches/raster-providers/src/providers/grass/qgsgrassrasterprovider.h
===================================================================
--- branches/raster-providers/src/providers/grass/qgsgrassrasterprovider.h	2010-11-12 16:33:33 UTC (rev 14558)
+++ branches/raster-providers/src/providers/grass/qgsgrassrasterprovider.h	2010-11-12 16:34:45 UTC (rev 14559)
@@ -204,7 +204,7 @@
      * Get metadata in a format suitable for feeding directly
      * into a subset of the GUI raster properties "Metadata" tab.
      */
-    QString metadata() { return QString(); }
+    QString metadata(); 
 
     // Following methods specific for  WMS are not used at all in this provider and should be removed IMO from qgsdataprovider.h
     void addLayers( QStringList const &  layers, QStringList const &  styles = QStringList() ) {}
@@ -227,7 +227,7 @@
 
     RASTER_MAP_TYPE mGrassDataType; // CELL_TYPE, DCELL_TYPE, FCELL_TYPE
 
-    QgsRectangle mExtent;
+    //QgsRectangle mExtent;
     int mCols;
     int mRows;
     int mYBlockSize;



More information about the QGIS-commit mailing list