X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/0d2b891f5f4673f0dd1142dcd7e1eb08e4248090..db771541ff9b86b3ef5e204d5d5d659ccf66e7e6:/src/gpspoint.c diff --git a/src/gpspoint.c b/src/gpspoint.c index 82785779..bee2d337 100644 --- a/src/gpspoint.c +++ b/src/gpspoint.c @@ -2,7 +2,7 @@ * viking -- GPS Data and Topo Analyzer, Explorer, and Manager * * Copyright (C) 2003-2005, Evan Battaglia - * Copyright (C) 2012, Rob Norris + * Copyright (C) 2012-2013, Rob Norris * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -46,7 +46,6 @@ static void a_gpspoint_write_track ( const gpointer id, const VikTrack *t, FILE static void a_gpspoint_write_trackpoint ( VikTrackpoint *tp, TP_write_info_type *write_info ); static void a_gpspoint_write_waypoint ( const gpointer id, const VikWaypoint *wp, FILE *f ); - /* outline for file gpspoint.c reading file: @@ -77,6 +76,9 @@ static struct LatLon line_latlon; static gchar *line_name; static gchar *line_comment; static gchar *line_description; +static gchar *line_color; +static gint line_name_label = 0; +static gint line_dist_label = 0; static gchar *line_image; static gchar *line_symbol; static gboolean line_newsegment = FALSE; @@ -154,7 +156,7 @@ static gchar *deslashndup ( const gchar *str, guint16 len ) * No obvious way to test for a 'gpspoint' file, * thus set a flag if any actual tag found during processing of the file */ -gboolean a_gpspoint_read_file(VikTrwLayer *trw, FILE *f ) { +gboolean a_gpspoint_read_file(VikTrwLayer *trw, FILE *f, const gchar *dirpath ) { VikCoordMode coord_mode = vik_trw_layer_get_coord_mode ( trw ); gchar *tag_start, *tag_end; g_assert ( f != NULL && trw != NULL ); @@ -219,6 +221,8 @@ gboolean a_gpspoint_read_file(VikTrwLayer *trw, FILE *f ) { VikWaypoint *wp = vik_waypoint_new(); wp->visible = line_visible; wp->altitude = line_altitude; + wp->has_timestamp = line_has_timestamp; + wp->timestamp = line_timestamp; vik_coord_load_from_latlon ( &(wp->coord), coord_mode, &line_latlon ); @@ -227,33 +231,34 @@ gboolean a_gpspoint_read_file(VikTrwLayer *trw, FILE *f ) { line_name = NULL; if ( line_comment ) - { vik_waypoint_set_comment ( wp, line_comment ); - line_comment = NULL; - } if ( line_description ) - { vik_waypoint_set_description ( wp, line_description ); - line_description = NULL; - } - if ( line_image ) - { - vik_waypoint_set_image ( wp, line_image ); - line_image = NULL; + if ( line_image ) { + // Ensure the filename is absolute + if ( g_path_is_absolute ( line_image ) ) + vik_waypoint_set_image ( wp, line_image ); + else { + // Otherwise create the absolute filename from the directory of the .vik file & and the relative filename + gchar *full = g_strconcat(dirpath, G_DIR_SEPARATOR_S, line_image, NULL); + gchar *absolute = file_realpath_dup ( full ); // resolved into the canonical name + vik_waypoint_set_image ( wp, absolute ); + g_free ( absolute ); + g_free ( full ); + } } if ( line_symbol ) - { vik_waypoint_set_symbol ( wp, line_symbol ); - line_symbol = NULL; - } } else if ((line_type == GPSPOINT_TYPE_TRACK || line_type == GPSPOINT_TYPE_ROUTE) && line_name) { have_read_something = TRUE; VikTrack *pl = vik_track_new(); + // NB don't set defaults here as all properties are stored in the GPS_POINT format + //vik_track_set_defaults ( pl ); /* Thanks to Peter Jones for this Fix */ if (!line_name) line_name = g_strdup("UNK"); @@ -262,17 +267,20 @@ gboolean a_gpspoint_read_file(VikTrwLayer *trw, FILE *f ) { pl->is_route = (line_type == GPSPOINT_TYPE_ROUTE); if ( line_comment ) - { vik_track_set_comment ( pl, line_comment ); - line_comment = NULL; - } if ( line_description ) - { vik_track_set_description ( pl, line_description ); - line_description = NULL; + + if ( line_color ) + { + if ( gdk_color_parse ( line_color, &(pl->color) ) ) + pl->has_color = TRUE; } + pl->draw_name_mode = line_name_label; + pl->max_number_dist_labels = line_dist_label; + pl->trackpoints = NULL; vik_trw_layer_filein_add_track ( trw, line_name, pl ); g_free ( line_name ); @@ -289,6 +297,7 @@ gboolean a_gpspoint_read_file(VikTrwLayer *trw, FILE *f ) { tp->has_timestamp = line_has_timestamp; tp->timestamp = line_timestamp; tp->altitude = line_altitude; + vik_trackpoint_set_name ( tp, line_name ); if (line_extended) { tp->speed = line_speed; tp->course = line_course; @@ -305,12 +314,15 @@ gboolean a_gpspoint_read_file(VikTrwLayer *trw, FILE *f ) { g_free ( line_comment ); if (line_description) g_free ( line_description ); + if (line_color) + g_free ( line_color ); if (line_image) g_free ( line_image ); if (line_symbol) g_free ( line_symbol ); line_comment = NULL; line_description = NULL; + line_color = NULL; line_image = NULL; line_symbol = NULL; line_type = GPSPOINT_TYPE_NONE; @@ -326,6 +338,8 @@ gboolean a_gpspoint_read_file(VikTrwLayer *trw, FILE *f ) { line_course = NAN; line_sat = 0; line_fix = 0; + line_name_label = 0; + line_dist_label = 0; } return have_read_something; @@ -406,7 +420,7 @@ static void gpspoint_process_key_and_value ( const gchar *key, gint key_len, con { if (line_name == NULL) { - line_name = g_strndup ( value, value_len ); + line_name = deslashndup ( value, value_len ); } } else if (key_len == 7 && strncasecmp( key, "comment", key_len ) == 0 && value != NULL) @@ -419,6 +433,19 @@ static void gpspoint_process_key_and_value ( const gchar *key, gint key_len, con if (line_description == NULL) line_description = deslashndup ( value, value_len ); } + else if (key_len == 5 && strncasecmp( key, "color", key_len ) == 0 && value != NULL) + { + if (line_color == NULL) + line_color = deslashndup ( value, value_len ); + } + else if (key_len == 14 && strncasecmp( key, "draw_name_mode", key_len ) == 0 && value != NULL) + { + line_name_label = atoi(value); + } + else if (key_len == 18 && strncasecmp( key, "number_dist_labels", key_len ) == 0 && value != NULL) + { + line_dist_label = atoi(value); + } else if (key_len == 5 && strncasecmp( key, "image", key_len ) == 0 && value != NULL) { if (line_image == NULL) @@ -487,7 +514,9 @@ static void a_gpspoint_write_waypoint ( const gpointer id, const VikWaypoint *wp vik_coord_to_latlon ( &(wp->coord), &ll ); s_lat = a_coords_dtostr(ll.lat); s_lon = a_coords_dtostr(ll.lon); - fprintf ( f, "type=\"waypoint\" latitude=\"%s\" longitude=\"%s\" name=\"%s\"", s_lat, s_lon, wp->name ); + gchar *tmp_name = slashdup(wp->name); + fprintf ( f, "type=\"waypoint\" latitude=\"%s\" longitude=\"%s\" name=\"%s\"", s_lat, s_lon, tmp_name ); + g_free ( tmp_name ); g_free ( s_lat ); g_free ( s_lon ); @@ -496,6 +525,8 @@ static void a_gpspoint_write_waypoint ( const gpointer id, const VikWaypoint *wp fprintf ( f, " altitude=\"%s\"", s_alt ); g_free(s_alt); } + if ( wp->has_timestamp ) + fprintf ( f, " unixtime=\"%ld\"", wp->timestamp ); if ( wp->comment ) { gchar *tmp_comment = slashdup(wp->comment); @@ -510,13 +541,33 @@ static void a_gpspoint_write_waypoint ( const gpointer id, const VikWaypoint *wp } if ( wp->image ) { - gchar *tmp_image = slashdup(wp->image); - fprintf ( f, " image=\"%s\"", tmp_image ); + gchar *tmp_image = NULL; + gchar *cwd = NULL; + if ( a_vik_get_file_ref_format() == VIK_FILE_REF_FORMAT_RELATIVE ) { + cwd = g_get_current_dir(); + if ( cwd ) + tmp_image = g_strdup ( file_GetRelativeFilename ( cwd, wp->image ) ); + } + + // if cwd not available - use image filename as is + // this should be an absolute path as set in thumbnails + if ( !cwd ) + tmp_image = slashdup(wp->image); + + if ( tmp_image ) + fprintf ( f, " image=\"%s\"", tmp_image ); + + g_free ( cwd ); g_free ( tmp_image ); } if ( wp->symbol ) { - fprintf ( f, " symbol=\"%s\"", wp->symbol ); + // Due to changes in garminsymbols - the symbol name is now in Title Case + // However to keep newly generated .vik files better compatible with older Viking versions + // The symbol names will always be lowercase + gchar *tmp_symbol = g_utf8_strdown(wp->symbol, -1); + fprintf ( f, " symbol=\"%s\"", tmp_symbol ); + g_free ( tmp_symbol ); } if ( ! wp->visible ) fprintf ( f, " visible=\"n\"" ); @@ -539,6 +590,12 @@ static void a_gpspoint_write_trackpoint ( VikTrackpoint *tp, TP_write_info_type g_free ( s_lat ); g_free ( s_lon ); + if ( tp->name ) { + gchar *name = slashdup(tp->name); + fprintf ( f, " name=\"%s\"", name ); + g_free(name); + } + if ( tp->altitude != VIK_DEFAULT_ALTITUDE ) { gchar *s_alt = a_coords_dtostr(tp->altitude); fprintf ( f, " altitude=\"%s\"", s_alt ); @@ -578,7 +635,9 @@ static void a_gpspoint_write_track ( const gpointer id, const VikTrack *trk, FIL if ( !(trk->name) ) return; - fprintf ( f, "type=\"%s\" name=\"%s\"", trk->is_route ? "route" : "track", trk->name); + gchar *tmp_name = slashdup(trk->name); + fprintf ( f, "type=\"%s\" name=\"%s\"", trk->is_route ? "route" : "track", tmp_name ); + g_free ( tmp_name ); if ( trk->comment ) { gchar *tmp = slashdup(trk->comment); @@ -592,6 +651,16 @@ static void a_gpspoint_write_track ( const gpointer id, const VikTrack *trk, FIL g_free ( tmp ); } + if ( trk->has_color ) { + fprintf ( f, " color=#%.2x%.2x%.2x", (int)(trk->color.red/256),(int)(trk->color.green/256),(int)(trk->color.blue/256)); + } + + if ( trk->draw_name_mode > 0 ) + fprintf ( f, " draw_name_mode=\"%d\"", trk->draw_name_mode ); + + if ( trk->max_number_dist_labels > 0 ) + fprintf ( f, " number_dist_labels=\"%d\"", trk->max_number_dist_labels ); + if ( ! trk->visible ) { fprintf ( f, " visible=\"n\"" ); }