+ if ( b->trackpoints )
+ tpb = VIK_TRACKPOINT(g_list_first(b->trackpoints)->data);
+
+ if ( tpa && tpb ) {
+ if ( tpa->timestamp < tpb->timestamp )
+ return -1;
+ if ( tpa->timestamp > tpb->timestamp )
+ return 1;
+ }
+
+ if ( tpa && !tpb )
+ return 1;
+
+ if ( !tpa && tpb )
+ return -1;
+
+ return 0;
+}
+
+void a_gpx_write_file ( VikTrwLayer *vtl, FILE *f, GpxWritingOptions *options )
+{
+ GpxWritingContext context = { options, f };
+
+ gpx_write_header ( f );
+
+ // gather waypoints in a list, then sort
+ // g_hash_table_get_values: glib 2.14+
+ GList *gl = g_hash_table_get_values ( vik_trw_layer_get_waypoints ( vtl ) );
+ gl = g_list_sort ( gl, gpx_waypoint_compare );
+
+ GList *iter;
+ for (iter = g_list_first (gl); iter != NULL; iter = g_list_next (iter)) {
+ gpx_write_waypoint ( (VikWaypoint*)iter->data, &context );
+ }
+
+ g_list_free ( gl );
+
+ gl = g_hash_table_get_values ( vik_trw_layer_get_tracks ( vtl ) );
+ // Sort method determined by preference
+ if ( a_vik_get_gpx_export_trk_sort() == VIK_GPX_EXPORT_TRK_SORT_TIME )
+ gl = g_list_sort ( gl, gpx_track_compare_timestamp );
+ else
+ gl = g_list_sort ( gl, gpx_track_compare_name );
+
+ // Routes sorted by name
+ GList *glrte = g_hash_table_get_values ( vik_trw_layer_get_routes ( vtl ) );
+ glrte = g_list_sort ( glrte, gpx_track_compare_name );
+
+ // g_list_concat doesn't copy memory properly
+ // so process each list separately
+
+ GpxWritingContext context_tmp = context;
+ GpxWritingOptions opt_tmp = { FALSE, FALSE, FALSE };
+ // Force trackpoints on tracks
+ if ( !context.options )
+ context_tmp.options = &opt_tmp;
+ context_tmp.options->is_route = FALSE;
+
+ // Loop around each list and write each one
+ for (iter = g_list_first (gl); iter != NULL; iter = g_list_next (iter)) {
+ gpx_write_track ( (VikTrack*)iter->data, &context_tmp );
+ }
+
+ // Routes (to get routepoints)
+ context_tmp.options->is_route = TRUE;
+ for (iter = g_list_first (glrte); iter != NULL; iter = g_list_next (iter)) {
+ gpx_write_track ( (VikTrack*)iter->data, &context_tmp );
+ }
+
+ g_list_free ( gl );
+ g_list_free ( glrte );
+
+ gpx_write_footer ( f );
+}
+
+void a_gpx_write_track_file ( VikTrack *trk, FILE *f, GpxWritingOptions *options )
+{
+ GpxWritingContext context = {options, f};
+ gpx_write_header ( f );
+ gpx_write_track ( trk, &context );
+ gpx_write_footer ( f );