78 changes: 41 additions & 37 deletions src/providers/gdal/qgsgdaldataitems.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -105,20 +105,29 @@ QGISEXTERN QgsDataItem * dataItem( QString thePath, QgsDataItem* parentItem )
if ( thePath.isEmpty() )
return 0;

QgsDebugMsg( "thePath= " + thePath );

QString uri = thePath;
QFileInfo info( thePath );
// zip settings + info
QSettings settings;
//extract basename with extension
QString name = info.fileName();
int scanItemsSetting = settings.value( "/qgis/scanItemsInBrowser", 0 ).toInt();
int scanZipSetting = settings.value( "/qgis/scanZipInBrowser", 1 ).toInt();
bool is_vsizip = ( thePath.startsWith( "/vsizip/" ) ||
thePath.endsWith( ".zip", Qt::CaseInsensitive ) );
bool is_vsigzip = ( thePath.startsWith( "/vsigzip/" ) ||
thePath.endsWith( ".gz", Qt::CaseInsensitive ) );

// get suffix, removing .gz if present
QString tmpPath = thePath; //path used for testing, not for layer creation
if ( is_vsigzip )
tmpPath.chop( 3 );
QFileInfo info( tmpPath );
QString suffix = info.suffix().toLower();
// extract basename with extension
info.setFile( thePath );
QString name = info.fileName();

QgsDebugMsg( "thePath= " + thePath + " tmpPath= " + tmpPath );

// allow normal files or VSIFILE items to pass
if ( !info.isFile() &&
!thePath.startsWith( "/vsizip/" ) &&
!thePath.startsWith( "/vsigzip/" ) )
// allow only normal files or VSIFILE items to continue
if ( !info.isFile() && !is_vsizip && !is_vsigzip )
return 0;

// get supported extensions
Expand All @@ -132,7 +141,7 @@ QGISEXTERN QgsDataItem * dataItem( QString thePath, QgsDataItem* parentItem )
// skip *.aux.xml files (GDAL auxilary metadata files)
// unless that extension is in the list (*.xml might be though)
if ( thePath.endsWith( ".aux.xml", Qt::CaseInsensitive ) &&
! extensions.contains( "aux.xml" ) )
!extensions.contains( "aux.xml" ) )
return 0;

// skip .tar.gz files
Expand All @@ -156,48 +165,43 @@ QGISEXTERN QgsDataItem * dataItem( QString thePath, QgsDataItem* parentItem )
return 0;
}

// vsifile : depending on options we should just add the item without testing
if ( thePath.startsWith( "/vsizip/" ) )
// add /vsizip/ or /vsigzip/ to path if file extension is .zip or .gz
if ( is_vsigzip )
{
// if this is a /vsigzip/path.zip/file_inside_zip change the name
if ( !thePath.startsWith( "/vsigzip/" ) )
thePath = "/vsigzip/" + thePath;
}
else if ( is_vsizip )
{
if ( !thePath.startsWith( "/vsizip/" ) )
thePath = "/vsizip/" + thePath;
// if this is a /vsigzip/path_to_zip.zip/file_inside_zip remove the full path from the name
if ( thePath != "/vsizip/" + parentItem->path() )
{
name = thePath;
name = name.replace( "/vsizip/" + parentItem->path() + "/", "" );
}

// if setting = 2 (Basic scan), return an item without testing
if ( scanZipSetting == 2 )
{
QStringList sublayers;
QgsDebugMsg( QString( "adding item name=%1 thePath=%2 uri=%3" ).arg( name ).arg( thePath ).arg( uri ) );
QgsLayerItem * item = new QgsGdalLayerItem( parentItem, name, thePath, thePath, &sublayers );
if ( item )
return item;
}
}

// if scan items == "Check extension", add item here without trying to open
if ( scanItemsSetting == 1 )
// if setting = 2 (Basic scan), return a /vsizip/ item without testing
if ( is_vsizip && scanZipSetting == 2 )
{
QStringList sublayers;
QgsDebugMsg( QString( "adding item name=%1 thePath=%2 uri=%3" ).arg( name ).arg( thePath ).arg( uri ) );
QgsDebugMsg( QString( "adding item name=%1 thePath=%2" ).arg( name ).arg( thePath ) );
QgsLayerItem * item = new QgsGdalLayerItem( parentItem, name, thePath, thePath, &sublayers );
if ( item )
return item;
}


// try to open using VSIFileHandler
if ( thePath.endsWith( ".zip", Qt::CaseInsensitive ) )
{
if ( !thePath.startsWith( "/vsizip/" ) )
thePath = "/vsizip/" + thePath;
}
else if ( thePath.endsWith( ".gz", Qt::CaseInsensitive ) )
// if scan items == "Check extension", add item here without trying to open
// unless item is /vsizip
if ( scanItemsSetting == 1 && !is_vsizip )
{
if ( !thePath.startsWith( "/vsigzip/" ) )
thePath = "/vsigzip/" + thePath;
QStringList sublayers;
QgsDebugMsg( QString( "adding item name=%1 thePath=%2" ).arg( name ).arg( thePath ) );
QgsLayerItem * item = new QgsGdalLayerItem( parentItem, name, thePath, thePath, &sublayers );
if ( item )
return item;
}

// test that file is valid with GDAL
Expand Down
4 changes: 4 additions & 0 deletions src/providers/gdal/qgsgdalprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1872,13 +1872,17 @@ QGISEXTERN bool isValidRasterFileName( QString const & theFileNameQString, QStri
if ( fileName.endsWith( ".zip", Qt::CaseInsensitive ) )
{
if ( !fileName.startsWith( "/vsizip/" ) )
{
fileName = "/vsizip/" + fileName;
}
QgsDebugMsg( QString( "Trying /vsizip syntax, fileName= %1" ).arg( fileName ) );
}
if ( fileName.endsWith( ".gz", Qt::CaseInsensitive ) )
{
if ( !fileName.startsWith( "/vsigzip/" ) )
{
fileName = "/vsigzip/" + fileName;
}
QgsDebugMsg( QString( "Trying /vsigzip syntax, fileName= %1" ).arg( fileName ) );
}

Expand Down
75 changes: 42 additions & 33 deletions src/providers/ogr/qgsogrdataitems.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -228,31 +228,42 @@ QGISEXTERN QgsDataItem * dataItem( QString thePath, QgsDataItem* parentItem )

QgsDebugMsg( "thePath: " + thePath );

QFileInfo info( thePath );
QString name = info.fileName();
// zip settings + info
QSettings settings;
int scanItemsSetting = settings.value( "/qgis/scanItemsInBrowser", 0 ).toInt();
int scanZipSetting = settings.value( "/qgis/scanZipInBrowser", 1 ).toInt();
bool is_vsizip = ( thePath.startsWith( "/vsizip/" ) ||
thePath.endsWith( ".zip", Qt::CaseInsensitive ) );
bool is_vsigzip = ( thePath.startsWith( "/vsigzip/" ) ||
thePath.endsWith( ".gz", Qt::CaseInsensitive ) );

// get suffix, removing .gz if present
QString tmpPath = thePath; //path used for testing, not for layer creation
if ( is_vsigzip )
tmpPath.chop( 3 );
QFileInfo info( tmpPath );
QString suffix = info.suffix().toLower();
// extract basename with extension
info.setFile( thePath );
QString name = info.fileName();

// allow normal files or VSIFILE items to pass
if ( !info.isFile() &&
!thePath.startsWith( "/vsizip/" ) &&
!thePath.startsWith( "/vsigzip/" ) )
// allow only normal files or VSIFILE items to continue
if ( !info.isFile() && !is_vsizip && !is_vsigzip )
return 0;

QStringList myExtensions = fileExtensions();

// skip *.aux.xml files (GDAL auxilary metadata files) and .shp.xml files (ESRI metadata)
// unless that extension is in the list (*.xml might be though)
if ( thePath.right( 8 ).toLower() == ".aux.xml" &&
myExtensions.indexOf( "aux.xml" ) < 0 )
if ( thePath.endsWith( ".aux.xml", Qt::CaseInsensitive ) &&
!myExtensions.contains( "aux.xml" ) )
return 0;
if ( thePath.right( 8 ).toLower() == ".shp.xml" &&
myExtensions.indexOf( "shp.xml" ) < 0 )
if ( thePath.endsWith( ".shp.xml", Qt::CaseInsensitive ) &&
!myExtensions.contains( "shp.xml" ) )
return 0;

// skip .tar.gz files
if ( thePath.right( 7 ) == ".tar.gz" )
if ( thePath.endsWith( ".tar.gz", Qt::CaseInsensitive ) )
return 0;

// We have to filter by extensions, otherwise e.g. all Shapefile files are displayed
Expand Down Expand Up @@ -281,43 +292,41 @@ QGISEXTERN QgsDataItem * dataItem( QString thePath, QgsDataItem* parentItem )
return 0;
}

// vsifile : depending on options we should just add the item without testing
if ( thePath.startsWith( "/vsizip/" ) )
// add /vsizip/ or /vsigzip/ to path if file extension is .zip or .gz
if ( is_vsigzip )
{
if ( !thePath.startsWith( "/vsigzip/" ) )
thePath = "/vsigzip/" + thePath;
}
else if ( is_vsizip )
{
// if this is a /vsigzip/path.zip/file_inside_zip change the name
if ( !thePath.startsWith( "/vsizip/" ) )
thePath = "/vsizip/" + thePath;
// if this is a /vsigzip/path_to_zip.zip/file_inside_zip remove the full path from the name
if ( thePath != "/vsizip/" + parentItem->path() )
{
name = thePath;
name = name.replace( "/vsizip/" + parentItem->path() + "/", "" );
}

// if setting== 2 (Basic scan), return an item without testing
if ( scanZipSetting == 2 )
{
QgsLayerItem * item = new QgsOgrLayerItem( parentItem, name, thePath, thePath, QgsLayerItem::Vector );
if ( item )
return item;
}
}

// if scan items == "Check extension", add item here without trying to open
if ( scanItemsSetting == 1 )
// if setting = 2 (Basic scan), return a /vsizip/ item without testing
if ( is_vsizip && scanZipSetting == 2 )
{
QStringList sublayers;
QgsDebugMsg( QString( "adding item name=%1 thePath=%2" ).arg( name ).arg( thePath ) );
QgsLayerItem * item = new QgsOgrLayerItem( parentItem, name, thePath, thePath, QgsLayerItem::Vector );
if ( item )
return item;
}

// try to open using VSIFileHandler
if ( thePath.endsWith( ".zip", Qt::CaseInsensitive ) )
{
if ( !thePath.startsWith( "/vsizip/" ) )
thePath = "/vsizip/" + thePath;
}
else if ( thePath.endsWith( ".gz", Qt::CaseInsensitive ) )
// if scan items == "Check extension", add item here without trying to open
// unless item is /vsizip
if ( scanItemsSetting == 1 && !is_vsizip && !is_vsigzip )
{
if ( !thePath.startsWith( "/vsigzip/" ) )
thePath = "/vsigzip/" + thePath;
QgsLayerItem * item = new QgsOgrLayerItem( parentItem, name, thePath, thePath, QgsLayerItem::Vector );
if ( item )
return item;
}

// test that file is valid with OGR
Expand Down
6 changes: 6 additions & 0 deletions src/providers/ogr/qgsogrprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -270,13 +270,19 @@ QgsOgrProvider::QgsOgrProvider( QString const & uri )
// cannot be interleaved, so for now just use read-only.
openReadOnly = true;
if ( !mFilePath.startsWith( "/vsizip/" ) )
{
mFilePath = "/vsizip/" + mFilePath;
setDataSourceUri( mFilePath );
}
QgsDebugMsg( QString( "Trying /vsizip syntax, mFilePath= %1" ).arg( mFilePath ) );
}
else if ( mFilePath.endsWith( ".gz", Qt::CaseInsensitive ) )
{
if ( !mFilePath.startsWith( "/vsigzip/" ) )
{
mFilePath = "/vsigzip/" + mFilePath;
setDataSourceUri( mFilePath );
}
QgsDebugMsg( QString( "Trying /vsigzip syntax, mFilePath= %1" ).arg( mFilePath ) );
}

Expand Down
331 changes: 309 additions & 22 deletions tests/src/core/testziplayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
testziplayer.cpp
--------------------------------------
Date : Sun Sep 16 12:22:23 AKDT 2007
Copyright : (C) 2012 Tim Sutton
Email : tim@linfiniti.com
Copyright : (C) 2012 Etienne Tourigny and Tim Sutton
Email : etourigny.dev@gmail.com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
Expand All @@ -20,9 +20,14 @@
#include <QFileInfo>

//qgis includes...
#include <qgsvectorlayer.h>
#include <qgsapplication.h>
#include <qgsproviderregistry.h>
#include <qgsvectorlayer.h>
#include <qgsrasterlayer.h>
#include <qgsdataitem.h>
#include "qgsconfig.h"
#include <qgsrenderer.h>
#include <qgsuniquevaluerenderer.h>

#include <gdal.h>

Expand All @@ -33,33 +38,315 @@ class TestZipLayer: public QObject
{
Q_OBJECT;

private:

QString mDataDir;
QSettings mSettings;
int mMaxScanZipSetting;
int mScanZipSetting;

// get map layer using Passthru
QgsMapLayer * getLayer( QString myPath, QString myName, QString myProviderKey );
bool testZipItemPassthru( QString myFileName, QString myProviderKey );
// get map layer using QgsZipItem (only 1 child)
QgsMapLayer * getZipLayer( QString myPath, QString myName );
// test item(s) in zip item (supply name or test all)
bool testZipItem( QString myFileName, QString myChildName );
// get layer transparency to test for .qml loading
int getLayerTransparency( QString myFileName, QString myProviderKey, int myScanZipSetting = 1 );

private slots:

void testZipLayer()
// init / cleanup
void initTestCase();// will be called before the first testfunction is executed.
void cleanupTestCase();// will be called after the last testfunction was executed.
void init() {};// will be called before each testfunction is executed.
void cleanup() {};// will be called after every testfunction.

// tests
// test for .zip and .gz files using all options
void testPassthruVectorZip();
void testPassthruVectorGzip();
void testPassthruRasterZip();
void testPassthruRasterGzip();
// test both "Basic Scan" and "Full scan" for .zip files
void testZipItemRaster();
void testZipItemVector();
void testZipItemAll();
// test that styles are loaded from .qml files outside zip files
void testZipItemVectorTransparency();
void testGipItemVectorTransparency();
void testZipItemRasterTransparency();
void testGZipItemRasterTransparency();
};


QgsMapLayer *TestZipLayer::getLayer( QString myPath, QString myName, QString myProviderKey )
{
if ( myName == "" )
{
QFileInfo myFileInfo( myPath );
myName = myFileInfo.completeBaseName();
}
QgsMapLayer *myLayer = NULL;

if ( myProviderKey == "ogr" )
{
myLayer = new QgsVectorLayer( myPath, myName, "ogr" );
}
else if ( myProviderKey == "gdal" )
{
myLayer = new QgsRasterLayer( myPath, myName, "gdal" );
}
// item should not have other provider key, but if it does will return NULL

return myLayer;
}

QgsMapLayer *TestZipLayer::getZipLayer( QString myPath, QString myName )
{
QgsMapLayer *myLayer = NULL;
QgsDirectoryItem *dirItem = new QgsDirectoryItem( NULL, "/", "" );
QgsDataItem* myItem = QgsZipItem::itemFromPath( dirItem, myPath, myName );
if ( myItem )
{
QgsLayerItem *layerItem = dynamic_cast<QgsLayerItem*>( myItem );
if ( layerItem )
myLayer = getLayer( layerItem->path(), layerItem->name(), layerItem->providerKey() );
}
delete dirItem;
return myLayer;
}

bool TestZipLayer::testZipItemPassthru( QString myFileName, QString myProviderKey )
{
QgsMapLayer * myLayer = getLayer( myFileName, "", myProviderKey );
bool ok = myLayer && myLayer->isValid();
if ( myLayer )
delete myLayer;
return ok;
}

bool TestZipLayer::testZipItem( QString myFileName, QString myChildName = "" )
{
QgsDebugMsg( QString( "\n=======================================\nfile = %1 name = %2" ).arg( myFileName ).arg( myChildName ) );
QFileInfo myFileInfo( myFileName );
QgsZipItem *myZipItem = new QgsZipItem( NULL, myFileInfo.fileName(), myFileName );
myZipItem->populate();
bool ok = false;
QVector<QgsDataItem*> myChildren = myZipItem->children();

if ( myChildren.size() > 0 )
{
QgsDebugMsg( QString( "has %1 items" ).arg( myChildren.size() ) );
foreach( QgsDataItem* item, myChildren )
{
QgsApplication::init();
QgsProviderRegistry::instance( QgsApplication::pluginPath() );
//
//create a point layer that will be used in all tests...
//
QString myPointsFileName( QString( TEST_DATA_DIR ) + QDir::separator() + "points.zip" );
qDebug() << "GDAL: " << GDAL_RELEASE_NAME;
QgsDebugMsg( QString( "child name=%1" ).arg( item->name() ) );
QgsLayerItem *layerItem = dynamic_cast<QgsLayerItem*>( item );
if ( layerItem )
{
QgsDebugMsg( QString( "child name=%1 provider=%2 path=%3" ).arg( layerItem->name() ).arg( layerItem->providerKey() ).arg( layerItem->path() ) );
if ( myChildName == "" || myChildName == item->name() )
{
QgsMapLayer* layer = getLayer( layerItem->path(), layerItem->name(), layerItem->providerKey() );
if ( layer != NULL )
{
// we got a layer, check if it is valid and exit
// if no child name given in argument, then pass to next one (unless current child is invalid)
QgsDebugMsg( QString( "valid: %1" ).arg( layer->isValid() ) );
ok = layer->isValid();
delete layer;
if ( ! ok )
{
QWARN( QString( "Invalid layer %1" ).arg( layerItem->path() ).toLocal8Bit().data() );
}
if ( myChildName == "" )
{
if ( ! ok )
break;
}
else
{
break;
}
}
else
{
QWARN( QString( "Invalid layer %1" ).arg( layerItem->path() ).toLocal8Bit().data() );
break;
}
}
}
else
{
QWARN( QString( "Invalid layer %1" ).arg( layerItem->path() ).toLocal8Bit().data() );
break;
}
}
}
delete myZipItem;
return ok;
}

int TestZipLayer::getLayerTransparency( QString myFileName, QString myProviderKey, int myScanZipSetting )
{
int myTransparency = -1;
mSettings.setValue( "/qgis/scanZipInBrowser", myScanZipSetting );
QgsMapLayer * myLayer = NULL;
if ( myScanZipSetting == 1 )
myLayer = getLayer( myFileName, "", myProviderKey );
else
myLayer = getZipLayer( myFileName, "" );
if ( myLayer && myLayer->isValid() )
myTransparency = myLayer->getTransparency();
if ( myLayer )
delete myLayer;
return myTransparency;
}


// slots
void TestZipLayer::initTestCase()
{
QgsApplication::init();
QgsProviderRegistry::instance( QgsApplication::pluginPath() );
// save data dir
mDataDir = QString( TEST_DATA_DIR ) + QDir::separator();
// set zipSetting to 1 (Passthru) and save current value
mScanZipSetting = mSettings.value( "/qgis/scanZipInBrowser", 1 ).toInt();
mSettings.setValue( "/qgis/scanZipInBrowser", 1 );
// max zipSetting value, depending on zlib presence
mMaxScanZipSetting = 1;
#ifdef HAVE_ZLIB
mMaxScanZipSetting = 3;
#endif

}

void TestZipLayer::cleanupTestCase()
{
// restore zipSetting
mSettings.setValue( "/qgis/scanZipInBrowser", mScanZipSetting );
}


void TestZipLayer::testPassthruVectorZip()
{
QString myFileName = mDataDir + "points2.zip";
QgsDebugMsg( "GDAL: " + QString( GDAL_RELEASE_NAME ) );
#if GDAL_VERSION_NUM < 1800
myPointsFileName = "/vsizip/" + myPointsFileName + "/points.shp";
myFileName = "/vsizip/" + myFileName + "/points.shp";
#endif
qDebug() << "FILE: " << myPointsFileName;
QFileInfo myPointFileInfo( myPointsFileName );
QgsVectorLayer * mypPointsLayer = new QgsVectorLayer( myPointFileInfo.filePath(),
myPointFileInfo.completeBaseName(), "ogr" );
QVERIFY( mypPointsLayer->isValid() );
delete mypPointsLayer;
}
QgsDebugMsg( "FILE: " + QString( myFileName ) );
for ( int i = 1 ; i <= mMaxScanZipSetting ; i++ )
{
mSettings.setValue( "/qgis/scanZipInBrowser", i );
QVERIFY( testZipItemPassthru( myFileName, "ogr" ) );
}
}

};
void TestZipLayer::testPassthruVectorGzip()
{
for ( int i = 1 ; i <= mMaxScanZipSetting ; i++ )
{
mSettings.setValue( "/qgis/scanZipInBrowser", i );
QVERIFY( testZipItemPassthru( mDataDir + "points3.geojson.gz", "ogr" ) );
}
}

QTEST_MAIN( TestZipLayer )
#include "moc_testziplayer.cxx"
void TestZipLayer::testPassthruRasterZip()
{
for ( int i = 1 ; i <= mMaxScanZipSetting ; i++ )
{
mSettings.setValue( "/qgis/scanZipInBrowser", i );
QVERIFY( testZipItemPassthru( mDataDir + "landsat_b1.zip", "gdal" ) );
}
}

void TestZipLayer::testPassthruRasterGzip()
{
for ( int i = 1 ; i <= mMaxScanZipSetting ; i++ )
{
mSettings.setValue( "/qgis/scanZipInBrowser", i );
QVERIFY( testZipItemPassthru( mDataDir + "landsat_b1.tif.gz", "gdal" ) );
}
}

void TestZipLayer::testZipItemRaster()
{
#ifndef HAVE_ZLIB
QSKIP( "This test requires ZLIB", SkipSingle );
#endif

for ( int i = 2 ; i <= mMaxScanZipSetting ; i++ )
{
mSettings.setValue( "/qgis/scanZipInBrowser", i );
QVERIFY( testZipItem( mDataDir + "testzip.zip", "landsat_b1.tif" ) );
}
}

void TestZipLayer::testZipItemVector()
{
#ifndef HAVE_ZLIB
QSKIP( "This test requires ZLIB", SkipSingle );
#endif
for ( int i = 2 ; i <= mMaxScanZipSetting ; i++ )
{
mSettings.setValue( "/qgis/scanZipInBrowser", i );
QVERIFY( testZipItem( mDataDir + "testzip.zip", "points.shp" ) );
}
}

void TestZipLayer::testZipItemAll()
{
#ifndef HAVE_ZLIB
QSKIP( "This test requires ZLIB", SkipSingle );
#endif
// test file contains invalid items (tmp1.tif, tmp1.txt and tmp1.xml)
// test for all items inside zip, using zipSetting 3 (Full Scan) which will ignore invalid items
// using zipSetting 2 (Basic Scan) would raise errors, because QgsZipItem would not test for valid items
// and return child names of the invalid items
mSettings.setValue( "/qgis/scanZipInBrowser", 3 );
QVERIFY( testZipItem( mDataDir + "testzip.zip", "" ) );
}


void TestZipLayer::testZipItemVectorTransparency()
{
int myTarget = 250;
int myTransparency = getLayerTransparency( mDataDir + "points2.zip", "ogr", 1 );
QVERIFY2(( myTransparency == myTarget ), QString( "Transparency is %1, should be %2" ).arg( myTransparency ).arg( myTarget ).toLocal8Bit().data() );
myTransparency = getLayerTransparency( mDataDir + "points2.zip", "ogr", 2 );
QVERIFY2(( myTransparency == myTarget ), QString( "Transparency is %1, should be %2" ).arg( myTransparency ).arg( myTarget ).toLocal8Bit().data() );
}

void TestZipLayer::testGipItemVectorTransparency()
{
int myTarget = 250;
int myTransparency = getLayerTransparency( mDataDir + "points3.geojson.gz", "ogr", 1 );
QVERIFY2(( myTransparency == myTarget ), QString( "Transparency is %1, should be %2" ).arg( myTransparency ).arg( myTarget ).toLocal8Bit().data() );
myTransparency = getLayerTransparency( mDataDir + "points3.geojson.gz", "ogr", 2 );
QVERIFY2(( myTransparency == myTarget ), QString( "Transparency is %1, should be %2" ).arg( myTransparency ).arg( myTarget ).toLocal8Bit().data() );
}

void TestZipLayer::testZipItemRasterTransparency()
{
int myTarget = 250;
int myTransparency = getLayerTransparency( mDataDir + "landsat_b1.zip", "gdal", 1 );
QVERIFY2(( myTransparency == myTarget ), QString( "Transparency is %1, should be %2" ).arg( myTransparency ).arg( myTarget ).toLocal8Bit().data() );
myTransparency = getLayerTransparency( mDataDir + "landsat_b1.zip", "gdal", 2 );
QVERIFY2(( myTransparency == myTarget ), QString( "Transparency is %1, should be %2" ).arg( myTransparency ).arg( myTarget ).toLocal8Bit().data() );
}

void TestZipLayer::testGZipItemRasterTransparency()
{
int myTarget = 250;
int myTransparency = getLayerTransparency( mDataDir + "landsat_b1.tif.gz", "gdal", 1 );
QVERIFY2(( myTransparency == myTarget ), QString( "Transparency is %1, should be %2" ).arg( myTransparency ).arg( myTarget ).toLocal8Bit().data() );
myTransparency = getLayerTransparency( mDataDir + "landsat_b1.tif.gz", "gdal", 2 );
QVERIFY2(( myTransparency == myTarget ), QString( "Transparency is %1, should be %2" ).arg( myTransparency ).arg( myTarget ).toLocal8Bit().data() );
}


QTEST_MAIN( TestZipLayer )
#include "moc_testziplayer.cxx"
32 changes: 32 additions & 0 deletions tests/testdata/landsat_b1.qml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
<qgis version="1.9.90-Alpha" minimumScale="0" maximumScale="1e+08" hasScaleBasedVisibilityFlag="0">
<transparencyLevelInt>250</transparencyLevelInt>
<rasterproperties>
<mDrawingStyle>SingleBandGray</mDrawingStyle>
<mColorShadingAlgorithm>UndefinedShader</mColorShadingAlgorithm>
<mInvertColor boolean="false"/>
<mRedBandName>Not Set</mRedBandName>
<mGreenBandName>Not Set</mGreenBandName>
<mBlueBandName>Not Set</mBlueBandName>
<mGrayBandName>Band 1</mGrayBandName>
<mStandardDeviations>0</mStandardDeviations>
<mUserDefinedRGBMinimumMaximum boolean="false"/>
<mRGBMinimumMaximumEstimated boolean="true"/>
<mUserDefinedGrayMinimumMaximum boolean="false"/>
<mGrayMinimumMaximumEstimated boolean="true"/>
<mContrastEnhancementAlgorithm>StretchAndClipToMinimumMaximum</mContrastEnhancementAlgorithm>
<contrastEnhancementMinMaxValues>
<minMaxEntry>
<min>122</min>
<max>130</max>
</minMaxEntry>
</contrastEnhancementMinMaxValues>
<mNoDataValue mValidNoDataValue="true">-32768.000000</mNoDataValue>
<singleValuePixelList>
<pixelListEntry pixelValue="-32768.000000" percentTransparent="100"/>
</singleValuePixelList>
<threeValuePixelList>
<pixelListEntry red="-32768.000000" blue="-32768.000000" green="-32768.000000" percentTransparent="100"/>
</threeValuePixelList>
</rasterproperties>
</qgis>
Binary file added tests/testdata/landsat_b1.tif.gz
Binary file not shown.
32 changes: 32 additions & 0 deletions tests/testdata/landsat_b1.tif.qml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
<qgis version="1.9.90-Alpha" minimumScale="0" maximumScale="1e+08" hasScaleBasedVisibilityFlag="0">
<transparencyLevelInt>248</transparencyLevelInt>
<rasterproperties>
<mDrawingStyle>SingleBandGray</mDrawingStyle>
<mColorShadingAlgorithm>UndefinedShader</mColorShadingAlgorithm>
<mInvertColor boolean="false"/>
<mRedBandName></mRedBandName>
<mGreenBandName></mGreenBandName>
<mBlueBandName></mBlueBandName>
<mGrayBandName>Band 1</mGrayBandName>
<mStandardDeviations>0</mStandardDeviations>
<mUserDefinedRGBMinimumMaximum boolean="false"/>
<mRGBMinimumMaximumEstimated boolean="true"/>
<mUserDefinedGrayMinimumMaximum boolean="false"/>
<mGrayMinimumMaximumEstimated boolean="true"/>
<mContrastEnhancementAlgorithm>StretchAndClipToMinimumMaximum</mContrastEnhancementAlgorithm>
<contrastEnhancementMinMaxValues>
<minMaxEntry>
<min>122</min>
<max>130</max>
</minMaxEntry>
</contrastEnhancementMinMaxValues>
<mNoDataValue mValidNoDataValue="true">-32768.000000</mNoDataValue>
<singleValuePixelList>
<pixelListEntry pixelValue="-32768.000000" percentTransparent="100"/>
</singleValuePixelList>
<threeValuePixelList>
<pixelListEntry red="-32768.000000" blue="-32768.000000" green="-32768.000000" percentTransparent="100"/>
</threeValuePixelList>
</rasterproperties>
</qgis>
Binary file added tests/testdata/landsat_b1.zip
Binary file not shown.
Binary file removed tests/testdata/points.zip
Binary file not shown.
93 changes: 93 additions & 0 deletions tests/testdata/points2.qml
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
<qgis version="1.9.90-Alpha" minimumScale="1" maximumScale="1e+08" minLabelScale="1" maxLabelScale="1e+08" hasScaleBasedVisibilityFlag="0" scaleBasedLabelVisibilityFlag="0">
<transparencyLevelInt>250</transparencyLevelInt>
<classificationattribute>Importance</classificationattribute>
<classificationattribute>Heading</classificationattribute>
<classificationattribute>Class</classificationattribute>
<uniquevalue>
<classificationfield>Class</classificationfield>
<symbol>
<lowervalue>B52</lowervalue>
<uppervalue></uppervalue>
<label></label>
<pointsymbol>svg:/gpsicons/plane.svg</pointsymbol>
<pointsize>11</pointsize>
<pointsizeunits>pixels</pointsizeunits>
<rotationclassificationfieldname>Importance</rotationclassificationfieldname>
<scaleclassificationfieldname>Importance</scaleclassificationfieldname>
<symbolfieldname></symbolfieldname>
<outlinecolor red="0" blue="0" green="0"/>
<outlinestyle>SolidLine</outlinestyle>
<outlinewidth>1</outlinewidth>
<fillcolor red="176" blue="238" green="151"/>
<fillpattern>SolidPattern</fillpattern>
<texturepath></texturepath>
</symbol>
<symbol>
<lowervalue>Biplane</lowervalue>
<uppervalue></uppervalue>
<label></label>
<pointsymbol>svg:/gpsicons/plane_orange.svg</pointsymbol>
<pointsize>18</pointsize>
<pointsizeunits>pixels</pointsizeunits>
<rotationclassificationfieldname>Heading</rotationclassificationfieldname>
<scaleclassificationfieldname>Importance</scaleclassificationfieldname>
<symbolfieldname></symbolfieldname>
<outlinecolor red="0" blue="0" green="0"/>
<outlinestyle>SolidLine</outlinestyle>
<outlinewidth>1</outlinewidth>
<fillcolor red="216" blue="24" green="135"/>
<fillpattern>SolidPattern</fillpattern>
<texturepath></texturepath>
</symbol>
<symbol>
<lowervalue>Jet</lowervalue>
<uppervalue></uppervalue>
<label></label>
<pointsymbol>svg:/gpsicons/plane.svg</pointsymbol>
<pointsize>11</pointsize>
<pointsizeunits>pixels</pointsizeunits>
<rotationclassificationfieldname>Heading</rotationclassificationfieldname>
<scaleclassificationfieldname>Importance</scaleclassificationfieldname>
<symbolfieldname></symbolfieldname>
<outlinecolor red="0" blue="0" green="0"/>
<outlinestyle>SolidLine</outlinestyle>
<outlinewidth>1</outlinewidth>
<fillcolor red="167" blue="179" green="107"/>
<fillpattern>SolidPattern</fillpattern>
<texturepath></texturepath>
</symbol>
</uniquevalue>
<customproperties/>
<displayfield>Class</displayfield>
<label>0</label>
<labelattributes>
<label fieldname="" text="Label"/>
<family fieldname="" name="Lucida Grande"/>
<size fieldname="" units="pt" value="12"/>
<bold fieldname="" on="0"/>
<italic fieldname="" on="0"/>
<underline fieldname="" on="0"/>
<strikeout fieldname="" on="0"/>
<color fieldname="" red="0" blue="0" green="0"/>
<x fieldname=""/>
<y fieldname=""/>
<offset x="0" y="0" units="pt" yfieldname="" xfieldname=""/>
<angle fieldname="" value="0" auto="0"/>
<alignment fieldname="" value="center"/>
<buffercolor fieldname="" red="255" blue="255" green="255"/>
<buffersize fieldname="" units="pt" value="1"/>
<bufferenabled fieldname="" on=""/>
<multilineenabled fieldname="" on=""/>
<selectedonly on=""/>
</labelattributes>
<edittypes>
<edittype type="0" name="Class"/>
<edittype type="0" name="Heading"/>
<edittype type="0" name="Importance"/>
</edittypes>
<editform></editform>
<editforminit></editforminit>
<annotationform></annotationform>
<attributeactions/>
</qgis>
Binary file added tests/testdata/points2.zip
Binary file not shown.
Binary file added tests/testdata/points3.geojson.gz
Binary file not shown.
93 changes: 93 additions & 0 deletions tests/testdata/points3.qml
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
<qgis version="1.9.90-Alpha" minimumScale="1" maximumScale="1e+08" minLabelScale="1" maxLabelScale="1e+08" hasScaleBasedVisibilityFlag="0" scaleBasedLabelVisibilityFlag="0">
<transparencyLevelInt>250</transparencyLevelInt>
<classificationattribute>Importance</classificationattribute>
<classificationattribute>Heading</classificationattribute>
<classificationattribute>Class</classificationattribute>
<uniquevalue>
<classificationfield>Class</classificationfield>
<symbol>
<lowervalue>B52</lowervalue>
<uppervalue></uppervalue>
<label></label>
<pointsymbol>svg:/gpsicons/plane.svg</pointsymbol>
<pointsize>11</pointsize>
<pointsizeunits>pixels</pointsizeunits>
<rotationclassificationfieldname>Importance</rotationclassificationfieldname>
<scaleclassificationfieldname>Importance</scaleclassificationfieldname>
<symbolfieldname></symbolfieldname>
<outlinecolor red="0" blue="0" green="0"/>
<outlinestyle>SolidLine</outlinestyle>
<outlinewidth>1</outlinewidth>
<fillcolor red="176" blue="238" green="151"/>
<fillpattern>SolidPattern</fillpattern>
<texturepath></texturepath>
</symbol>
<symbol>
<lowervalue>Biplane</lowervalue>
<uppervalue></uppervalue>
<label></label>
<pointsymbol>svg:/gpsicons/plane_orange.svg</pointsymbol>
<pointsize>18</pointsize>
<pointsizeunits>pixels</pointsizeunits>
<rotationclassificationfieldname>Heading</rotationclassificationfieldname>
<scaleclassificationfieldname>Importance</scaleclassificationfieldname>
<symbolfieldname></symbolfieldname>
<outlinecolor red="0" blue="0" green="0"/>
<outlinestyle>SolidLine</outlinestyle>
<outlinewidth>1</outlinewidth>
<fillcolor red="216" blue="24" green="135"/>
<fillpattern>SolidPattern</fillpattern>
<texturepath></texturepath>
</symbol>
<symbol>
<lowervalue>Jet</lowervalue>
<uppervalue></uppervalue>
<label></label>
<pointsymbol>svg:/gpsicons/plane.svg</pointsymbol>
<pointsize>11</pointsize>
<pointsizeunits>pixels</pointsizeunits>
<rotationclassificationfieldname>Heading</rotationclassificationfieldname>
<scaleclassificationfieldname>Importance</scaleclassificationfieldname>
<symbolfieldname></symbolfieldname>
<outlinecolor red="0" blue="0" green="0"/>
<outlinestyle>SolidLine</outlinestyle>
<outlinewidth>1</outlinewidth>
<fillcolor red="167" blue="179" green="107"/>
<fillpattern>SolidPattern</fillpattern>
<texturepath></texturepath>
</symbol>
</uniquevalue>
<customproperties/>
<displayfield>Class</displayfield>
<label>0</label>
<labelattributes>
<label fieldname="" text="Label"/>
<family fieldname="" name="Lucida Grande"/>
<size fieldname="" units="pt" value="12"/>
<bold fieldname="" on="0"/>
<italic fieldname="" on="0"/>
<underline fieldname="" on="0"/>
<strikeout fieldname="" on="0"/>
<color fieldname="" red="0" blue="0" green="0"/>
<x fieldname=""/>
<y fieldname=""/>
<offset x="0" y="0" units="pt" yfieldname="" xfieldname=""/>
<angle fieldname="" value="0" auto="0"/>
<alignment fieldname="" value="center"/>
<buffercolor fieldname="" red="255" blue="255" green="255"/>
<buffersize fieldname="" units="pt" value="1"/>
<bufferenabled fieldname="" on=""/>
<multilineenabled fieldname="" on=""/>
<selectedonly on=""/>
</labelattributes>
<edittypes>
<edittype type="0" name="Class"/>
<edittype type="0" name="Heading"/>
<edittype type="0" name="Importance"/>
</edittypes>
<editform></editform>
<editforminit></editforminit>
<annotationform></annotationform>
<attributeactions/>
</qgis>
Binary file added tests/testdata/testzip.zip
Binary file not shown.