tt_wpt,
tt_wpt_cmt,
tt_wpt_desc,
+ tt_wpt_src,
+ tt_wpt_type,
tt_wpt_name,
tt_wpt_ele,
tt_wpt_sym,
tt_trk,
tt_trk_cmt,
tt_trk_desc,
+ tt_trk_src,
+ tt_trk_type,
tt_trk_name,
tt_rte,
{ tt_wpt_name, "/gpx/wpt/name" },
{ tt_wpt_cmt, "/gpx/wpt/cmt" },
{ tt_wpt_desc, "/gpx/wpt/desc" },
+ { tt_wpt_src, "/gpx/wpt/src" },
+ { tt_wpt_type, "/gpx/wpt/type" },
{ tt_wpt_sym, "/gpx/wpt/sym" },
{ tt_wpt_sym, "/loc/waypoint/type" },
{ tt_wpt_url, "/gpx/wpt/url" },
{ tt_trk_name, "/gpx/trk/name" },
{ tt_trk_cmt, "/gpx/trk/cmt" },
{ tt_trk_desc, "/gpx/trk/desc" },
+ { tt_trk_src, "/gpx/trk/src" },
+ { tt_trk_type, "/gpx/trk/type" },
{ tt_trk_trkseg, "/gpx/trk/trkseg" },
{ tt_trk_trkseg_trkpt, "/gpx/trk/trkseg/trkpt" },
{ tt_trk_trkseg_trkpt_ele, "/gpx/trk/trkseg/trkpt/ele" },
{ tt_trk_name, "/gpx/rte/name" },
{ tt_trk_cmt, "/gpx/rte/cmt" },
{ tt_trk_desc, "/gpx/rte/desc" },
+ { tt_trk_src, "/gpx/rte/src" },
{ tt_trk_trkseg_trkpt, "/gpx/rte/rtept" },
{ tt_trk_trkseg_trkpt_name, "/gpx/rte/rtept/name" },
{ tt_trk_trkseg_trkpt_ele, "/gpx/rte/rtept/ele" },
case tt_trk_trkseg_trkpt_time:
case tt_wpt_cmt:
case tt_wpt_desc:
+ case tt_wpt_src:
+ case tt_wpt_type:
case tt_wpt_name:
case tt_wpt_ele:
case tt_wpt_time:
case tt_wpt_link:
case tt_trk_cmt:
case tt_trk_desc:
+ case tt_trk_src:
+ case tt_trk_type:
case tt_trk_name:
g_string_erase ( c_cdata, 0, -1 ); /* clear the cdata buffer */
break;
g_string_erase ( c_cdata, 0, -1 );
break;
+ case tt_wpt_src:
+ vik_waypoint_set_source ( c_wp, c_cdata->str );
+ g_string_erase ( c_cdata, 0, -1 );
+ break;
+
+ case tt_wpt_type:
+ vik_waypoint_set_type ( c_wp, c_cdata->str );
+ g_string_erase ( c_cdata, 0, -1 );
+ break;
+
case tt_wpt_url:
vik_waypoint_set_url ( c_wp, c_cdata->str );
g_string_erase ( c_cdata, 0, -1 );
g_string_erase ( c_cdata, 0, -1 );
break;
+ case tt_trk_src:
+ vik_track_set_source ( c_tr, c_cdata->str );
+ g_string_erase ( c_cdata, 0, -1 );
+ break;
+
+ case tt_trk_type:
+ vik_track_set_type ( c_tr, c_cdata->str );
+ g_string_erase ( c_cdata, 0, -1 );
+ break;
+
case tt_trk_cmt:
vik_track_set_comment ( c_tr, c_cdata->str );
g_string_erase ( c_cdata, 0, -1 );
case tt_trk_trkseg_trkpt_ele:
case tt_wpt_cmt:
case tt_wpt_desc:
+ case tt_wpt_src:
+ case tt_wpt_type:
case tt_wpt_sym:
case tt_wpt_url:
case tt_wpt_link:
case tt_trk_cmt:
case tt_trk_desc:
+ case tt_trk_src:
+ case tt_trk_type:
case tt_trk_trkseg_trkpt_time:
case tt_wpt_time:
case tt_trk_trkseg_trkpt_name:
return;
FILE *f = context->file;
- static struct LatLon ll;
- gchar *s_lat,*s_lon;
+ struct LatLon ll;
+ gchar s_lat[COORDS_STR_BUFFER_SIZE];
+ gchar s_lon[COORDS_STR_BUFFER_SIZE];
gchar *tmp;
vik_coord_to_latlon ( &(wp->coord), &ll );
- s_lat = a_coords_dtostr( ll.lat );
- s_lon = a_coords_dtostr( ll.lon );
+ a_coords_dtostr_buffer ( ll.lat, s_lat );
+ a_coords_dtostr_buffer ( ll.lon, s_lon );
// NB 'hidden' is not part of any GPX standard - this appears to be a made up Viking 'extension'
// luckily most other GPX processing software ignores things they don't understand
fprintf ( f, "<wpt lat=\"%s\" lon=\"%s\"%s>\n",
s_lat, s_lon, wp->visible ? "" : " hidden=\"hidden\"" );
- g_free ( s_lat );
- g_free ( s_lon );
// Sanity clause
if ( wp->name )
if ( wp->altitude != VIK_DEFAULT_ALTITUDE )
{
- tmp = a_coords_dtostr ( wp->altitude );
- fprintf ( f, " <ele>%s</ele>\n", tmp );
- g_free ( tmp );
+ gchar s_alt[COORDS_STR_BUFFER_SIZE];
+ a_coords_dtostr_buffer ( wp->altitude, s_alt );
+ fprintf ( f, " <ele>%s</ele>\n", s_alt );
}
if ( wp->has_timestamp ) {
fprintf ( f, " <desc>%s</desc>\n", tmp );
g_free ( tmp );
}
+ if ( wp->source )
+ {
+ tmp = entitize(wp->source);
+ fprintf ( f, " <src>%s</src>\n", tmp );
+ g_free ( tmp );
+ }
+ if ( wp->type )
+ {
+ tmp = entitize(wp->type);
+ fprintf ( f, " <type>%s</type>\n", tmp );
+ g_free ( tmp );
+ }
if ( wp->url )
{
tmp = entitize(wp->url);
static void gpx_write_trackpoint ( VikTrackpoint *tp, GpxWritingContext *context )
{
FILE *f = context->file;
- static struct LatLon ll;
- gchar *s_lat,*s_lon, *s_alt, *s_dop;
+ struct LatLon ll;
+ gchar s_lat[COORDS_STR_BUFFER_SIZE];
+ gchar s_lon[COORDS_STR_BUFFER_SIZE];
+ gchar s_alt[COORDS_STR_BUFFER_SIZE];
+ gchar s_dop[COORDS_STR_BUFFER_SIZE];
gchar *time_iso8601;
vik_coord_to_latlon ( &(tp->coord), &ll );
if ( context->options && !context->options->is_route && tp->newsegment )
fprintf ( f, " </trkseg>\n <trkseg>\n" );
- s_lat = a_coords_dtostr( ll.lat );
- s_lon = a_coords_dtostr( ll.lon );
+ a_coords_dtostr_buffer ( ll.lat, s_lat );
+ a_coords_dtostr_buffer ( ll.lon, s_lon );
fprintf ( f, " <%spt lat=\"%s\" lon=\"%s\">\n", (context->options && context->options->is_route) ? "rte" : "trk", s_lat, s_lon );
- g_free ( s_lat ); s_lat = NULL;
- g_free ( s_lon ); s_lon = NULL;
if (tp->name) {
gchar *s_name = entitize(tp->name);
g_free(s_name);
}
- s_alt = NULL;
if ( tp->altitude != VIK_DEFAULT_ALTITUDE )
{
- s_alt = a_coords_dtostr ( tp->altitude );
+ a_coords_dtostr_buffer ( tp->altitude, s_alt );
+ fprintf ( f, " <ele>%s</ele>\n", s_alt );
}
else if ( context->options != NULL && context->options->force_ele )
{
- s_alt = a_coords_dtostr ( 0 );
+ fprintf ( f, " <ele>0</ele>\n" );
}
- if (s_alt != NULL)
- fprintf ( f, " <ele>%s</ele>\n", s_alt );
- g_free ( s_alt ); s_alt = NULL;
time_iso8601 = NULL;
if ( tp->has_timestamp ) {
time_iso8601 = NULL;
if (!isnan(tp->course)) {
- gchar *s_course = a_coords_dtostr(tp->course);
+ gchar s_course[COORDS_STR_BUFFER_SIZE];
+ a_coords_dtostr_buffer ( tp->course, s_course );
fprintf ( f, " <course>%s</course>\n", s_course );
- g_free(s_course);
}
if (!isnan(tp->speed)) {
- gchar *s_speed = a_coords_dtostr(tp->speed);
+ gchar s_speed[COORDS_STR_BUFFER_SIZE];
+ a_coords_dtostr_buffer ( tp->speed, s_speed );
fprintf ( f, " <speed>%s</speed>\n", s_speed );
- g_free(s_speed);
}
if (tp->fix_mode == VIK_GPS_MODE_2D)
fprintf ( f, " <fix>2d</fix>\n");
if (tp->nsats > 0)
fprintf ( f, " <sat>%d</sat>\n", tp->nsats );
- s_dop = NULL;
- if ( tp->hdop != VIK_DEFAULT_DOP )
- {
- s_dop = a_coords_dtostr ( tp->hdop );
- }
- if (s_dop != NULL)
+ if ( tp->hdop != VIK_DEFAULT_DOP ) {
+ a_coords_dtostr_buffer ( tp->hdop, s_dop );
fprintf ( f, " <hdop>%s</hdop>\n", s_dop );
- g_free ( s_dop ); s_dop = NULL;
-
- if ( tp->vdop != VIK_DEFAULT_DOP )
- {
- s_dop = a_coords_dtostr ( tp->vdop );
}
- if (s_dop != NULL)
- fprintf ( f, " <vdop>%s</vdop>\n", s_dop );
- g_free ( s_dop ); s_dop = NULL;
- if ( tp->pdop != VIK_DEFAULT_DOP )
- {
- s_dop = a_coords_dtostr ( tp->pdop );
+ if ( tp->vdop != VIK_DEFAULT_DOP ) {
+ a_coords_dtostr_buffer ( tp->vdop, s_dop );
+ fprintf ( f, " <vdop>%s</vdop>\n", s_dop );
}
- if (s_dop != NULL)
+
+ if ( tp->pdop != VIK_DEFAULT_DOP ) {
+ a_coords_dtostr_buffer ( tp->pdop, s_dop );
fprintf ( f, " <pdop>%s</pdop>\n", s_dop );
- g_free ( s_dop ); s_dop = NULL;
+ }
fprintf ( f, " </%spt>\n", (context->options && context->options->is_route) ? "rte" : "trk" );
}
g_free ( tmp );
}
+ if ( t->source )
+ {
+ tmp = entitize ( t->source );
+ fprintf ( f, " <src>%s</src>\n", tmp );
+ g_free ( tmp );
+ }
+
+ if ( t->type )
+ {
+ tmp = entitize ( t->type );
+ fprintf ( f, " <type>%s</type>\n", tmp );
+ g_free ( tmp );
+ }
+
/* No such thing as a rteseg! */
if ( !t->is_route )
fprintf ( f, " <trkseg>\n" );
VikTRWMetadata *md = vik_trw_layer_get_metadata (vtl);
if ( md ) {
- if ( md->author ) {
+ if ( md->author && strlen(md->author) > 0 ) {
tmp = entitize ( md->author );
fprintf ( f, " <author>%s</author>\n", tmp );
g_free ( tmp );
}
- if ( md->description ) {
+ if ( md->description && strlen(md->description) > 0) {
tmp = entitize ( md->description );
fprintf ( f, " <desc>%s</desc>\n", tmp );
g_free ( tmp );
fprintf ( f, " <time>%s</time>\n", tmp );
g_free ( tmp );
}
- if ( md->keywords ) {
+ if ( md->keywords && strlen(md->keywords) > 0) {
tmp = entitize ( md->keywords );
fprintf ( f, " <keywords>%s</keywords>\n", tmp );
g_free ( tmp );
GList *glrte = NULL;
// Routes sorted by name
- if ( vik_trw_layer_get_tracks_visibility(vtl) || (options && options->hidden) ) {
+ if ( vik_trw_layer_get_routes_visibility(vtl) || (options && options->hidden) ) {
glrte = g_hash_table_get_values ( vik_trw_layer_get_routes ( vtl ) );
glrte = g_list_sort ( glrte, gpx_track_compare_name );
}