Skip to content

Commit

Permalink
Add flag to babel command generation methods to control whether
Browse files Browse the repository at this point in the history
paths should be quoted
  • Loading branch information
nyalldawson committed Aug 2, 2021
1 parent 5df3be5 commit 47f7612
Show file tree
Hide file tree
Showing 10 changed files with 110 additions and 44 deletions.
5 changes: 5 additions & 0 deletions python/core/auto_additions/qgis.py
Expand Up @@ -508,6 +508,11 @@
# --
Qgis.BabelFormatCapability.baseClass = Qgis
# monkey patching scoped based enum
Qgis.BabelCommandFlag.QuoteFilePaths.__doc__ = "File paths should be enclosed in quotations and escaped"
Qgis.BabelCommandFlag.__doc__ = 'Babel command flags, which control how commands and arguments\nare generated for executing GPSBabel processes.\n\n.. versionadded:: 3.22\n\n' + '* ``QuoteFilePaths``: ' + Qgis.BabelCommandFlag.QuoteFilePaths.__doc__
# --
Qgis.BabelCommandFlag.baseClass = Qgis
# monkey patching scoped based enum
Qgis.GpsFeatureType.Waypoint.__doc__ = "Waypoint"
Qgis.GpsFeatureType.Route.__doc__ = "Route"
Qgis.GpsFeatureType.Track.__doc__ = "Track"
Expand Down
11 changes: 8 additions & 3 deletions python/core/auto_generated/gps/qgsbabelformat.sip.in
Expand Up @@ -37,29 +37,33 @@ Returns the format's capabilities.
virtual QStringList importCommand( const QString &babel,
Qgis::GpsFeatureType featureType,
const QString &input,
const QString &output ) const;
const QString &output,
Qgis::BabelCommandFlags flags = Qgis::BabelCommandFlags() ) const;
%Docstring
Generates a command for importing data into a GPS format using babel.

:param babel: babel path to the babel executable
:param featureType: type of GPS feature to import
:param input: input data path
:param output: output path
:param flags: optional flags to control how babel command is generated

Returns an empty list if the format does not support imports (see :py:func:`~QgsAbstractBabelFormat.capabilities`).
%End

virtual QStringList exportCommand( const QString &babel,
Qgis::GpsFeatureType featureType,
const QString &input,
const QString &output ) const;
const QString &output,
Qgis::BabelCommandFlags flags = Qgis::BabelCommandFlags() ) const;
%Docstring
Generates a command for exporting GPS data into a different format using babel.

:param babel: path to the babel executable
:param featureType: type of GPS feature to export
:param input: input data path
:param output: output path
:param flags: optional flags to control how babel command is generated

Returns an empty list if the format does not support exports (see :py:func:`~QgsAbstractBabelFormat.capabilities`).
%End
Expand Down Expand Up @@ -122,7 +126,8 @@ Returns the list of known extensions for the format, e.g. "csv", "txt".
virtual QStringList importCommand( const QString &babel,
Qgis::GpsFeatureType featureType,
const QString &input,
const QString &output ) const;
const QString &output,
Qgis::BabelCommandFlags flags = Qgis::BabelCommandFlags() ) const;
};

/************************************************************************
Expand Down
8 changes: 4 additions & 4 deletions python/core/auto_generated/gps/qgsbabelgpsdevice.sip.in
Expand Up @@ -45,10 +45,10 @@ Constructor for QgsBabelGpsDeviceFormat.
:param trackUploadCommand: command for uploading tracks to device
%End

virtual QStringList importCommand( const QString &babel, Qgis::GpsFeatureType type, const QString &in, const QString &out ) const;

virtual QStringList exportCommand( const QString &babel, Qgis::GpsFeatureType type, const QString &in, const QString &out ) const;

virtual QStringList importCommand( const QString &babel, Qgis::GpsFeatureType type, const QString &in, const QString &out,
Qgis::BabelCommandFlags flags = Qgis::BabelCommandFlags() ) const;
virtual QStringList exportCommand( const QString &babel, Qgis::GpsFeatureType type, const QString &in, const QString &out,
Qgis::BabelCommandFlags flags = Qgis::BabelCommandFlags() ) const;

};

Expand Down
9 changes: 9 additions & 0 deletions python/core/auto_generated/qgis.sip.in
Expand Up @@ -371,6 +371,13 @@ The development version
typedef QFlags<Qgis::BabelFormatCapability> BabelFormatCapabilities;


enum class BabelCommandFlag
{
QuoteFilePaths,
};
typedef QFlags<Qgis::BabelCommandFlag> BabelCommandFlags;


enum class GpsFeatureType
{
Waypoint,
Expand Down Expand Up @@ -457,6 +464,8 @@ QFlags<Qgis::SqlLayerDefinitionCapability> operator|(Qgis::SqlLayerDefinitionCap

QFlags<Qgis::BabelFormatCapability> operator|(Qgis::BabelFormatCapability f1, QFlags<Qgis::BabelFormatCapability> f2);

QFlags<Qgis::BabelCommandFlag> operator|(Qgis::BabelCommandFlag f1, QFlags<Qgis::BabelCommandFlag> f2);




Expand Down
14 changes: 8 additions & 6 deletions src/core/gps/qgsbabelformat.cpp
Expand Up @@ -43,12 +43,12 @@ QString QgsAbstractBabelFormat::name() const
return mName;
}

QStringList QgsAbstractBabelFormat::importCommand( const QString &, Qgis::GpsFeatureType, const QString &, const QString & ) const
QStringList QgsAbstractBabelFormat::importCommand( const QString &, Qgis::GpsFeatureType, const QString &, const QString &, Qgis::BabelCommandFlags ) const
{
return QStringList();
}

QStringList QgsAbstractBabelFormat::exportCommand( const QString &, Qgis::GpsFeatureType, const QString &, const QString & ) const
QStringList QgsAbstractBabelFormat::exportCommand( const QString &, Qgis::GpsFeatureType, const QString &, const QString &, Qgis::BabelCommandFlags ) const
{
return QStringList();
}
Expand Down Expand Up @@ -77,14 +77,16 @@ QgsBabelSimpleImportFormat::QgsBabelSimpleImportFormat( const QString &format, c
QStringList QgsBabelSimpleImportFormat::importCommand( const QString &babel,
Qgis::GpsFeatureType featureType,
const QString &input,
const QString &output )const
const QString &output,
Qgis::BabelCommandFlags flags ) const
{
return { QStringLiteral( "\"%1\"" ).arg( babel ),
return { flags &Qgis::BabelCommandFlag::QuoteFilePaths ? QStringLiteral( "\"%1\"" ).arg( babel ) : babel,
featureTypeToArgument( featureType ),
QStringLiteral( "-i" ),
name(),
QStringLiteral( "-o" ),
QStringLiteral( "gpx" ),
QStringLiteral( "\"%1\"" ).arg( input ),
QStringLiteral( "\"%1\"" ).arg( output ) };
flags &Qgis::BabelCommandFlag::QuoteFilePaths ? QStringLiteral( "\"%1\"" ).arg( input ) : input,
flags &Qgis::BabelCommandFlag::QuoteFilePaths ? QStringLiteral( "\"%1\"" ).arg( output ) : output
};
}
11 changes: 8 additions & 3 deletions src/core/gps/qgsbabelformat.h
Expand Up @@ -53,13 +53,15 @@ class CORE_EXPORT QgsAbstractBabelFormat
* \param featureType type of GPS feature to import
* \param input input data path
* \param output output path
* \param flags optional flags to control how babel command is generated
*
* Returns an empty list if the format does not support imports (see capabilities()).
*/
virtual QStringList importCommand( const QString &babel,
Qgis::GpsFeatureType featureType,
const QString &input,
const QString &output ) const;
const QString &output,
Qgis::BabelCommandFlags flags = Qgis::BabelCommandFlags() ) const;

/**
* Generates a command for exporting GPS data into a different format using babel.
Expand All @@ -68,13 +70,15 @@ class CORE_EXPORT QgsAbstractBabelFormat
* \param featureType type of GPS feature to export
* \param input input data path
* \param output output path
* \param flags optional flags to control how babel command is generated
*
* Returns an empty list if the format does not support exports (see capabilities()).
*/
virtual QStringList exportCommand( const QString &babel,
Qgis::GpsFeatureType featureType,
const QString &input,
const QString &output ) const;
const QString &output,
Qgis::BabelCommandFlags flags = Qgis::BabelCommandFlags() ) const;

protected:

Expand Down Expand Up @@ -135,7 +139,8 @@ class CORE_EXPORT QgsBabelSimpleImportFormat : public QgsAbstractBabelFormat
QStringList importCommand( const QString &babel,
Qgis::GpsFeatureType featureType,
const QString &input,
const QString &output ) const override;
const QString &output,
Qgis::BabelCommandFlags flags = Qgis::BabelCommandFlags() ) const override;
private:
QString mDescription;
QStringList mExtensions;
Expand Down
16 changes: 8 additions & 8 deletions src/core/gps/qgsbabelgpsdevice.cpp
Expand Up @@ -56,7 +56,7 @@ QgsBabelGpsDeviceFormat::QgsBabelGpsDeviceFormat( const QString &waypointDownloa
QStringList QgsBabelGpsDeviceFormat::importCommand( const QString &babel,
Qgis::GpsFeatureType type,
const QString &in,
const QString &out ) const
const QString &out, Qgis::BabelCommandFlags flags ) const
{
QStringList original;

Expand All @@ -78,13 +78,13 @@ QStringList QgsBabelGpsDeviceFormat::importCommand( const QString &babel,
for ( const QString &iter : std::as_const( original ) )
{
if ( iter == QLatin1String( "%babel" ) )
copy.append( babel );
copy.append( flags & Qgis::BabelCommandFlag::QuoteFilePaths ? QStringLiteral( "\"%1\"" ).arg( babel ) : babel );
else if ( iter == QLatin1String( "%type" ) )
copy.append( featureTypeToArgument( type ) );
else if ( iter == QLatin1String( "%in" ) )
copy.append( QStringLiteral( "\"%1\"" ).arg( in ) );
copy.append( flags & Qgis::BabelCommandFlag::QuoteFilePaths ? QStringLiteral( "\"%1\"" ).arg( in ) : in );
else if ( iter == QLatin1String( "%out" ) )
copy.append( QStringLiteral( "\"%1\"" ).arg( out ) );
copy.append( flags & Qgis::BabelCommandFlag::QuoteFilePaths ? QStringLiteral( "\"%1\"" ).arg( out ) : out );
else
copy.append( iter );
}
Expand All @@ -94,7 +94,7 @@ QStringList QgsBabelGpsDeviceFormat::importCommand( const QString &babel,
QStringList QgsBabelGpsDeviceFormat::exportCommand( const QString &babel,
Qgis::GpsFeatureType type,
const QString &in,
const QString &out ) const
const QString &out, Qgis::BabelCommandFlags flags ) const
{
QStringList original;
switch ( type )
Expand All @@ -115,13 +115,13 @@ QStringList QgsBabelGpsDeviceFormat::exportCommand( const QString &babel,
for ( const QString &iter : std::as_const( original ) )
{
if ( iter == QLatin1String( "%babel" ) )
copy.append( babel );
copy.append( flags & Qgis::BabelCommandFlag::QuoteFilePaths ? QStringLiteral( "\"%1\"" ).arg( babel ) : babel );
else if ( iter == QLatin1String( "%type" ) )
copy.append( featureTypeToArgument( type ) );
else if ( iter == QLatin1String( "%in" ) )
copy.append( QStringLiteral( "\"%1\"" ).arg( in ) );
copy.append( flags & Qgis::BabelCommandFlag::QuoteFilePaths ? QStringLiteral( "\"%1\"" ).arg( in ) : in );
else if ( iter == QLatin1String( "%out" ) )
copy.append( QStringLiteral( "\"%1\"" ).arg( out ) );
copy.append( flags & Qgis::BabelCommandFlag::QuoteFilePaths ? QStringLiteral( "\"%1\"" ).arg( out ) : out );
else
copy.append( iter );
}
Expand Down
6 changes: 4 additions & 2 deletions src/core/gps/qgsbabelgpsdevice.h
Expand Up @@ -56,8 +56,10 @@ class CORE_EXPORT QgsBabelGpsDeviceFormat : public QgsAbstractBabelFormat
const QString &trackDownloadCommand,
const QString &trackUploadCommand );

QStringList importCommand( const QString &babel, Qgis::GpsFeatureType type, const QString &in, const QString &out ) const override;
QStringList exportCommand( const QString &babel, Qgis::GpsFeatureType type, const QString &in, const QString &out ) const override;
QStringList importCommand( const QString &babel, Qgis::GpsFeatureType type, const QString &in, const QString &out,
Qgis::BabelCommandFlags flags = Qgis::BabelCommandFlags() ) const override;
QStringList exportCommand( const QString &babel, Qgis::GpsFeatureType type, const QString &in, const QString &out,
Qgis::BabelCommandFlags flags = Qgis::BabelCommandFlags() ) const override;

private:

Expand Down
14 changes: 14 additions & 0 deletions src/core/qgis.h
Expand Up @@ -563,6 +563,19 @@ class CORE_EXPORT Qgis
Q_DECLARE_FLAGS( BabelFormatCapabilities, BabelFormatCapability )
Q_ENUM( BabelFormatCapability )

/**
* Babel command flags, which control how commands and arguments
* are generated for executing GPSBabel processes.
*
* \since QGIS 3.22
*/
enum class BabelCommandFlag : int
{
QuoteFilePaths = 1 << 0, //!< File paths should be enclosed in quotations and escaped
};
Q_DECLARE_FLAGS( BabelCommandFlags, BabelCommandFlag )
Q_ENUM( BabelCommandFlag )

/**
* GPS feature types.
*
Expand Down Expand Up @@ -696,6 +709,7 @@ Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::BrowserItemCapabilities )
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::SublayerQueryFlags )
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::SqlLayerDefinitionCapabilities )
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::BabelFormatCapabilities )
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::BabelCommandFlags )

// hack to workaround warnings when casting void pointers
// retrieved from QLibrary::resolve to function pointers.
Expand Down

0 comments on commit 47f7612

Please sign in to comment.