X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/4258f4e221ef2abaa1e078e44abd630da49729be..5ff75d1ed34298a223c651d46fe2aa000db3e459:/src/file.c?ds=sidebyside diff --git a/src/file.c b/src/file.c index 4a957150..d497d832 100644 --- a/src/file.c +++ b/src/file.c @@ -28,8 +28,13 @@ #include #include +#include +#ifdef HAVE_UNISTD_H +#include +#endif #include #include +#include /* Relax some dependencies */ #if ! GLIB_CHECK_VERSION(2,12,0) @@ -168,6 +173,7 @@ static void file_write ( VikAggregateLayer *top, FILE *f, gpointer vp ) Stack *stack = NULL; VikLayer *current_layer; struct LatLon ll; + VikViewportDrawMode mode; gchar *modestring; push(&stack); @@ -177,12 +183,13 @@ static void file_write ( VikAggregateLayer *top, FILE *f, gpointer vp ) /* crazhy CRAZHY */ vik_coord_to_latlon ( vik_viewport_get_center ( VIK_VIEWPORT(vp) ), &ll ); - switch ( vik_viewport_get_drawmode ( VIK_VIEWPORT(vp) ) ) { + mode = vik_viewport_get_drawmode ( VIK_VIEWPORT(vp) ); + switch ( mode ) { case VIK_VIEWPORT_DRAWMODE_UTM: modestring = "utm"; break; case VIK_VIEWPORT_DRAWMODE_EXPEDIA: modestring = "expedia"; break; - case VIK_VIEWPORT_DRAWMODE_GOOGLE: modestring = "google"; break; - case VIK_VIEWPORT_DRAWMODE_KH: modestring = "kh"; break; - default: modestring = "mercator"; + case VIK_VIEWPORT_DRAWMODE_MERCATOR: modestring = "mercator"; break; + default: + g_critical("Houston, we've had a problem. mode=%d", mode); } fprintf ( f, "#VIKING GPS Data file " VIKING_URL "\n\nxmpp=%f\nympp=%f\nlat=%f\nlon=%f\nmode=%s\ncolor=%s\ndrawscale=%s\ndrawcentermark=%s", @@ -415,9 +422,13 @@ static void file_read ( VikAggregateLayer *top, FILE *f, VikViewport *vp ) else if ( stack->under == NULL && eq_pos == 4 && strncasecmp ( line, "mode", eq_pos ) == 0 && strcasecmp ( line+5, "expedia" ) == 0) vik_viewport_set_drawmode ( VIK_VIEWPORT(vp), VIK_VIEWPORT_DRAWMODE_EXPEDIA ); else if ( stack->under == NULL && eq_pos == 4 && strncasecmp ( line, "mode", eq_pos ) == 0 && strcasecmp ( line+5, "google" ) == 0) - vik_viewport_set_drawmode ( VIK_VIEWPORT(vp), VIK_VIEWPORT_DRAWMODE_GOOGLE ); + { + g_warning ( _("Draw mode '%s' no more supported"), "google" ); + } else if ( stack->under == NULL && eq_pos == 4 && strncasecmp ( line, "mode", eq_pos ) == 0 && strcasecmp ( line+5, "kh" ) == 0) - vik_viewport_set_drawmode ( VIK_VIEWPORT(vp), VIK_VIEWPORT_DRAWMODE_KH ); + { + g_warning ( _("Draw mode '%s' no more supported"), "kh" ); + } else if ( stack->under == NULL && eq_pos == 4 && strncasecmp ( line, "mode", eq_pos ) == 0 && strcasecmp ( line+5, "mercator" ) == 0) vik_viewport_set_drawmode ( VIK_VIEWPORT(vp), VIK_VIEWPORT_DRAWMODE_MERCATOR ); else if ( stack->under == NULL && eq_pos == 5 && strncasecmp ( line, "color", eq_pos ) == 0 ) @@ -449,8 +460,9 @@ static void file_read ( VikAggregateLayer *top, FILE *f, VikViewport *vp ) VikLayerParamData x; line += eq_pos+1; if ( params[i].type == VIK_LAYER_PARAM_STRING_LIST ) { - GList *l = g_list_append ( g_hash_table_lookup ( string_lists, (gpointer) ((gint) i) ), g_strdup(line) ); - g_hash_table_replace ( string_lists, (gpointer) ((gint)i), l ); + GList *l = g_list_append ( g_hash_table_lookup ( string_lists, GINT_TO_POINTER ((gint) i) ), + g_strdup(line) ); + g_hash_table_replace ( string_lists, GINT_TO_POINTER ((gint)i), l ); /* add the value to a list, possibly making a new list. * this will be passed to the layer when we read an ~EndLayer */ } else { @@ -527,18 +539,21 @@ static FILE *xfopen ( const char *fn, const char *mode ) if ( strcmp(fn,"-") == 0 ) return stdin; else - return fopen(fn, "r"); + return g_fopen(fn, "r"); } static void xfclose ( FILE *f ) { - if ( f != stdin && f != stdout ) + if ( f != stdin && f != stdout ) { fclose ( f ); + f = NULL; + } } /* 0 on failure, 1 on success (vik file) 2 on success (other file) */ gshort a_file_load ( VikAggregateLayer *top, VikViewport *vp, const gchar *filename ) { + gboolean is_gpx_file = check_file_ext ( filename, ".gpx" ); FILE *f = xfopen ( filename, "r" ); g_assert ( vp ); @@ -546,7 +561,7 @@ gshort a_file_load ( VikAggregateLayer *top, VikViewport *vp, const gchar *filen if ( ! f ) return 0; - if ( check_magic ( f, VIK_MAGIC ) ) + if ( !is_gpx_file && check_magic ( f, VIK_MAGIC ) ) { file_read ( top, f, vp ); if ( f != stdin ) @@ -559,7 +574,7 @@ gshort a_file_load ( VikAggregateLayer *top, VikViewport *vp, const gchar *filen VikLayer *vtl = vik_layer_create ( VIK_LAYER_TRW, vp, NULL, FALSE ); vik_layer_rename ( vtl, a_file_basename ( filename ) ); - if ( check_magic ( f, GPX_MAGIC ) ) + if ( is_gpx_file || check_magic ( f, GPX_MAGIC ) ) a_gpx_read_file ( VIK_TRW_LAYER(vtl), f ); else a_gpspoint_read_file ( VIK_TRW_LAYER(vtl), f ); @@ -577,7 +592,7 @@ gshort a_file_load ( VikAggregateLayer *top, VikViewport *vp, const gchar *filen gboolean a_file_save ( VikAggregateLayer *top, gpointer vp, const gchar *filename ) { - FILE *f = fopen(filename, "w"); + FILE *f = g_fopen(filename, "w"); if ( ! f ) return FALSE; @@ -585,6 +600,7 @@ gboolean a_file_save ( VikAggregateLayer *top, gpointer vp, const gchar *filenam file_write ( top, f, vp ); fclose(f); + f = NULL; return TRUE; } @@ -601,9 +617,27 @@ const gchar *a_file_basename ( const gchar *filename ) return filename; } +/* example: + gboolean is_gpx = check_file_ext ( "a/b/c.gpx", ".gpx" ); +*/ +gboolean check_file_ext ( const gchar *filename, const gchar *fileext ) +{ + const gchar *basename = a_file_basename(filename); + g_assert( filename ); + g_assert( fileext && fileext[0]=='.' ); + if (!basename) + return FALSE; + + const char * dot = strrchr(basename, '.'); + if (dot && !strcmp(dot, fileext)) + return TRUE; + + return FALSE; +} + gboolean a_file_export ( VikTrwLayer *vtl, const gchar *filename, gshort file_type ) { - FILE *f = fopen ( filename, "w" ); + FILE *f = g_fopen ( filename, "w" ); if ( f ) { if ( file_type == FILE_TYPE_GPSMAPPER ) @@ -613,6 +647,7 @@ gboolean a_file_export ( VikTrwLayer *vtl, const gchar *filename, gshort file_ty else a_gpspoint_write_file ( vtl, f ); fclose ( f ); + f = NULL; return TRUE; } return FALSE; @@ -626,22 +661,22 @@ const gchar *a_get_viking_dir() if (!viking_dir) { const gchar *home = g_getenv("HOME"); - if (!home || access(home, W_OK)) + if (!home || g_access(home, W_OK)) home = g_get_home_dir (); #ifdef HAVE_MKDTEMP - if (!home || access(home, W_OK)) + if (!home || g_access(home, W_OK)) { static gchar temp[] = {"/tmp/vikXXXXXX"}; home = mkdtemp(temp); } #endif - if (!home || access(home, W_OK)) + if (!home || g_access(home, W_OK)) /* Fatal error */ g_critical("Unable to find a base directory"); /* Build the name of the directory */ viking_dir = g_build_filename(home, ".viking", NULL); - if (access(viking_dir, F_OK)) + if (g_file_test(viking_dir, G_FILE_TEST_EXISTS) == FALSE) g_mkdir(viking_dir, 0755); }