X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/0ab355252e7f5431a1765140520acb79bcf7a5cb..44871dd11ce2566d2ffd45c447219bac1c7f7aff:/src/file.c diff --git a/src/file.c b/src/file.c index a8812c65..835f2ece 100644 --- a/src/file.c +++ b/src/file.c @@ -26,7 +26,9 @@ #endif #include "viking.h" +#include "jpg.h" #include "gpx.h" +#include "geojson.h" #include "babel.h" #include @@ -574,7 +576,7 @@ if "[LayerData]" /* ---------------------------------------------------- */ -static FILE *xfopen ( const char *fn, const char *mode ) +static FILE *xfopen ( const char *fn ) { if ( strcmp(fn,"-") == 0 ) return stdin; @@ -596,7 +598,7 @@ static void xfclose ( FILE *f ) gboolean check_file_magic_vik ( const gchar *filename ) { gboolean result = FALSE; - FILE *ff = xfopen ( filename, "r" ); + FILE *ff = xfopen ( filename ); if ( ff ) { result = check_magic ( ff, VIK_MAGIC ); xfclose ( ff ); @@ -611,7 +613,7 @@ gboolean check_file_magic_vik ( const gchar *filename ) * * Returns: a newly allocated string */ -gchar *append_file_ext ( const gchar *filename, VikLoadType_t type ) +gchar *append_file_ext ( const gchar *filename, VikFileType_t type ) { gchar *new_name = NULL; const gchar *ext = NULL; @@ -625,6 +627,9 @@ gchar *append_file_ext ( const gchar *filename, VikLoadType_t type ) case FILE_TYPE_KML: ext = ".kml"; break; + case FILE_TYPE_GEOJSON: + ext = ".geojson"; + break; case FILE_TYPE_GPSMAPPER: case FILE_TYPE_GPSPOINT: default: @@ -633,7 +638,7 @@ gchar *append_file_ext ( const gchar *filename, VikLoadType_t type ) } /* Do */ - if ( ext != NULL && ! check_file_ext ( filename, ext ) ) + if ( ext != NULL && ! a_file_check_ext ( filename, ext ) ) new_name = g_strconcat ( filename, ext, NULL ); else /* Simply duplicate */ @@ -654,7 +659,7 @@ VikLoadType_t a_file_load ( VikAggregateLayer *top, VikViewport *vp, const gchar filename = filename + 7; g_debug ( "Loading file %s from URI %s", filename, filename_or_uri ); } - FILE *f = xfopen ( filename, "r" ); + FILE *f = xfopen ( filename ); if ( ! f ) return LOAD_TYPE_READ_FAILURE; @@ -670,6 +675,10 @@ VikLoadType_t a_file_load ( VikAggregateLayer *top, VikViewport *vp, const gchar else load_answer = LOAD_TYPE_VIK_FAILURE_NON_FATAL; } + else if ( a_jpg_magic_check ( filename ) ) { + if ( ! a_jpg_load_file ( top, filename, vp ) ) + load_answer = LOAD_TYPE_UNSUPPORTED_FAILURE; + } else { // For all other file types which consist of tracks, routes and/or waypoints, @@ -680,7 +689,7 @@ VikLoadType_t a_file_load ( VikAggregateLayer *top, VikViewport *vp, const gchar vik_layer_rename ( vtl, a_file_basename ( filename ) ); // In fact both kml & gpx files start the same as they are in xml - if ( check_file_ext ( filename, ".kml" ) && check_magic ( f, GPX_MAGIC ) ) { + if ( a_file_check_ext ( filename, ".kml" ) && check_magic ( f, GPX_MAGIC ) ) { // Implicit Conversion if ( ! ( success = a_babel_convert_from ( VIK_TRW_LAYER(vtl), "-i kml", filename, NULL, NULL, NULL ) ) ) { load_answer = LOAD_TYPE_GPSBABEL_FAILURE; @@ -688,7 +697,7 @@ VikLoadType_t a_file_load ( VikAggregateLayer *top, VikViewport *vp, const gchar } // NB use a extension check first, as a GPX file header may have a Byte Order Mark (BOM) in it // - which currently confuses our check_magic function - else if ( check_file_ext ( filename, ".gpx" ) || check_magic ( f, GPX_MAGIC ) ) { + else if ( a_file_check_ext ( filename, ".gpx" ) || check_magic ( f, GPX_MAGIC ) ) { if ( ! ( success = a_gpx_read_file ( VIK_TRW_LAYER(vtl), f ) ) ) { load_answer = LOAD_TYPE_GPX_FAILURE; } @@ -757,21 +766,10 @@ gboolean a_file_save ( VikAggregateLayer *top, gpointer vp, const gchar *filenam } -const gchar *a_file_basename ( const gchar *filename ) -{ - const gchar *t = filename + strlen(filename) - 1; - while ( --t > filename ) - if ( *(t-1) == G_DIR_SEPARATOR ) - break; - if ( t >= filename ) - return t; - return filename; -} - /* example: - gboolean is_gpx = check_file_ext ( "a/b/c.gpx", ".gpx" ); + gboolean is_gpx = a_file_check_ext ( "a/b/c.gpx", ".gpx" ); */ -gboolean check_file_ext ( const gchar *filename, const gchar *fileext ) +gboolean a_file_check_ext ( const gchar *filename, const gchar *fileext ) { g_return_val_if_fail ( filename != NULL, FALSE ); g_return_val_if_fail ( fileext && fileext[0]=='.', FALSE ); @@ -803,6 +801,8 @@ gboolean a_file_export ( VikTrwLayer *vtl, const gchar *filename, VikFileType_t FILE *f = g_fopen ( filename, "w" ); if ( f ) { + gboolean result = TRUE; + if ( trk ) { switch ( file_type ) { case FILE_TYPE_GPX: @@ -824,6 +824,9 @@ gboolean a_file_export ( VikTrwLayer *vtl, const gchar *filename, VikFileType_t case FILE_TYPE_GPSPOINT: a_gpspoint_write_file ( vtl, f ); break; + case FILE_TYPE_GEOJSON: + result = a_geojson_write_file ( vtl, f ); + break; case FILE_TYPE_KML: fclose ( f ); f = NULL; @@ -846,7 +849,7 @@ gboolean a_file_export ( VikTrwLayer *vtl, const gchar *filename, VikFileType_t } fclose ( f ); f = NULL; - return TRUE; + return result; } return FALSE; }