QgsVectorFileWriter::MetaData: add a compulsoryEncoding member

* Some formats require a compulsory encoding, typically UTF-8.
Change initMetadata() to indicate UTF-8 compulsory encoding for
GeoJSON, GeoRSS, GML, GPKG, GPX, KML, SQLite, SpatiaLite, FileGDB,
XLSX and ODS
* QgsVectorFileWriter::init(): make it override the user specified
encoding if the format has a compulsory encoding. And remove hard-coded
case for KML.
This commit is contained in:
Even Rouault 2016-05-19 11:38:42 +02:00
parent b1efb9a72c
commit 3ee7d59e18
3 changed files with 39 additions and 28 deletions

View File

@ -74,7 +74,7 @@ class QgsVectorFileWriter
{ {
MetaData(); MetaData();
MetaData( const QString& longName, const QString& trLongName, const QString& glob, const QString& ext, const QMap<QString, QgsVectorFileWriter::Option*>& driverOptions, const QMap<QString, QgsVectorFileWriter::Option*>& layerOptions ); MetaData( const QString& longName, const QString& trLongName, const QString& glob, const QString& ext, const QMap<QString, QgsVectorFileWriter::Option*>& driverOptions, const QMap<QString, QgsVectorFileWriter::Option*>& layerOptions, const QString& compulsoryEncoding = QString() );
QString longName; QString longName;
QString trLongName; QString trLongName;
@ -82,6 +82,8 @@ class QgsVectorFileWriter
QString ext; QString ext;
QMap<QString, QgsVectorFileWriter::Option*> driverOptions; QMap<QString, QgsVectorFileWriter::Option*> driverOptions;
QMap<QString, QgsVectorFileWriter::Option*> layerOptions; QMap<QString, QgsVectorFileWriter::Option*> layerOptions;
/** Some formats require a compulsory encoding, typically UTF-8. If no compulsory encoding, empty string */
QString compulsoryEncoding;
}; };
enum WriterError enum WriterError

View File

@ -238,21 +238,6 @@ void QgsVectorFileWriter::init( QString vectorFileName,
deleteShapeFile( vectorFileName ); deleteShapeFile( vectorFileName );
} }
else if ( driverName == "KML" )
{
if ( !vectorFileName.endsWith( ".kml", Qt::CaseInsensitive ) )
{
vectorFileName += ".kml";
}
if ( fileEncoding.compare( "UTF-8", Qt::CaseInsensitive ) != 0 )
{
QgsDebugMsg( "forced UTF-8 encoding for KML" );
fileEncoding = "UTF-8";
}
QFile::remove( vectorFileName );
}
else else
{ {
if ( metadataFound ) if ( metadataFound )
@ -277,6 +262,16 @@ void QgsVectorFileWriter::init( QString vectorFileName,
QFile::remove( vectorFileName ); QFile::remove( vectorFileName );
} }
if ( metadataFound && !metadata.compulsoryEncoding.isEmpty() )
{
if ( fileEncoding.compare( metadata.compulsoryEncoding, Qt::CaseInsensitive ) != 0 )
{
QgsDebugMsg( QString( "forced %1 encoding for %2" ).arg( metadata.compulsoryEncoding ).arg( driverName ) );
fileEncoding = metadata.compulsoryEncoding;
}
}
char **options = nullptr; char **options = nullptr;
if ( !datasourceOptions.isEmpty() ) if ( !datasourceOptions.isEmpty() )
{ {
@ -865,7 +860,8 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
"*.geojson", "*.geojson",
"geojson", "geojson",
datasetOptions, datasetOptions,
layerOptions layerOptions,
"UTF-8"
) )
); );
@ -959,7 +955,8 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
"*.xml", "*.xml",
"xml", "xml",
datasetOptions, datasetOptions,
layerOptions layerOptions,
"UTF-8"
) )
); );
@ -1048,7 +1045,8 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
"*.gml", "*.gml",
"gml", "gml",
datasetOptions, datasetOptions,
layerOptions layerOptions,
"UTF-8"
) )
); );
@ -1090,7 +1088,8 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
"*.gpkg", "*.gpkg",
"gpkg", "gpkg",
datasetOptions, datasetOptions,
layerOptions layerOptions,
"UTF-8"
) )
); );
@ -1168,7 +1167,8 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
"*.gpx", "*.gpx",
"gpx", "gpx",
datasetOptions, datasetOptions,
layerOptions layerOptions,
"UTF-8"
) )
); );
@ -1233,7 +1233,8 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
"*.kml", "*.kml",
"kml", "kml",
datasetOptions, datasetOptions,
layerOptions layerOptions,
"UTF-8"
) )
); );
@ -1498,7 +1499,8 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
"*.sqlite", "*.sqlite",
"sqlite", "sqlite",
datasetOptions, datasetOptions,
layerOptions layerOptions,
"UTF-8"
) )
); );
@ -1579,7 +1581,8 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
"*.sqlite", "*.sqlite",
"sqlite", "sqlite",
datasetOptions, datasetOptions,
layerOptions layerOptions,
"UTF-8"
) )
); );
// AutoCAD DXF // AutoCAD DXF
@ -1669,7 +1672,8 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
"*.gdb", "*.gdb",
"gdb", "gdb",
datasetOptions, datasetOptions,
layerOptions layerOptions,
"UTF-8"
) )
); );
@ -1694,7 +1698,8 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
"*.xlsx", "*.xlsx",
"xlsx", "xlsx",
datasetOptions, datasetOptions,
layerOptions layerOptions,
"UTF-8"
) )
); );
@ -1719,7 +1724,8 @@ QMap<QString, QgsVectorFileWriter::MetaData> QgsVectorFileWriter::initMetaData()
"*.ods", "*.ods",
"ods", "ods",
datasetOptions, datasetOptions,
layerOptions layerOptions,
"UTF-8"
) )
); );

View File

@ -120,13 +120,14 @@ class CORE_EXPORT QgsVectorFileWriter
MetaData() MetaData()
{} {}
MetaData( const QString& longName, const QString& trLongName, const QString& glob, const QString& ext, const QMap<QString, Option*>& driverOptions, const QMap<QString, Option*>& layerOptions ) MetaData( const QString& longName, const QString& trLongName, const QString& glob, const QString& ext, const QMap<QString, Option*>& driverOptions, const QMap<QString, Option*>& layerOptions, const QString& compulsoryEncoding = QString() )
: longName( longName ) : longName( longName )
, trLongName( trLongName ) , trLongName( trLongName )
, glob( glob ) , glob( glob )
, ext( ext ) , ext( ext )
, driverOptions( driverOptions ) , driverOptions( driverOptions )
, layerOptions( layerOptions ) , layerOptions( layerOptions )
, compulsoryEncoding( compulsoryEncoding )
{} {}
QString longName; QString longName;
@ -135,6 +136,8 @@ class CORE_EXPORT QgsVectorFileWriter
QString ext; QString ext;
QMap<QString, Option*> driverOptions; QMap<QString, Option*> driverOptions;
QMap<QString, Option*> layerOptions; QMap<QString, Option*> layerOptions;
/** Some formats require a compulsory encoding, typically UTF-8. If no compulsory encoding, empty string */
QString compulsoryEncoding;
}; };
enum WriterError enum WriterError