void a_gpspoint_write_file ( VikTrwLayer *trw, FILE *f ) { GHashTable *tracks = vik_trw_layer_get_tracks ( trw ); GHashTable *routes = vik_trw_layer_get_routes ( trw ); GHashTable *waypoints = vik_trw_layer_get_waypoints ( trw ); fprintf ( f, "type=\"waypointlist\"\n" ); g_hash_table_foreach ( waypoints, (GHFunc) a_gpspoint_write_waypoint, f ); fprintf ( f, "type=\"waypointlistend\"\n" ); g_hash_table_foreach ( tracks, (GHFunc) a_gpspoint_write_track, f ); g_hash_table_foreach ( routes, (GHFunc) a_gpspoint_write_track, f ); }
/** * aggregate_layer_track_create_list: * @vl: The layer that should create the track and layers list * @user_data: Not used in this function * * Returns: A list of #vik_trw_track_list_t */ static GList* aggregate_layer_track_create_list ( VikLayer *vl, gpointer user_data ) { VikAggregateLayer *val = VIK_AGGREGATE_LAYER(vl); // Get all TRW layers GList *layers = NULL; layers = vik_aggregate_layer_get_all_layers_of_type ( val, layers, VIK_LAYER_TRW, TRUE ); // For each TRW layers keep adding the tracks and routes to build a list of all of them GList *tracks_and_layers = NULL; layers = g_list_first ( layers ); while ( layers ) { GList *tracks = NULL; tracks = g_list_concat ( tracks, g_hash_table_get_values ( vik_trw_layer_get_tracks( VIK_TRW_LAYER(layers->data) ) ) ); tracks = g_list_concat ( tracks, g_hash_table_get_values ( vik_trw_layer_get_routes( VIK_TRW_LAYER(layers->data) ) ) ); tracks_and_layers = g_list_concat ( tracks_and_layers, vik_trw_layer_build_track_list_t ( VIK_TRW_LAYER(layers->data), tracks ) ); layers = g_list_next ( layers ); } g_list_free ( layers ); return tracks_and_layers; }
void a_gpx_write_file ( VikTrwLayer *vtl, FILE *f, GpxWritingOptions *options ) { GpxWritingContext context = { options, f }; gpx_write_header ( f ); gchar *tmp; const gchar *name = vik_layer_get_name(VIK_LAYER(vtl)); if ( name ) { tmp = entitize ( name ); fprintf ( f, " <name>%s</name>\n", tmp ); g_free ( tmp ); } VikTRWMetadata *md = vik_trw_layer_get_metadata (vtl); if ( md ) { if ( md->author ) { tmp = entitize ( md->author ); fprintf ( f, " <author>%s</author>\n", tmp ); g_free ( tmp ); } if ( md->description ) { tmp = entitize ( md->description ); fprintf ( f, " <desc>%s</desc>\n", tmp ); g_free ( tmp ); } if ( md->timestamp ) { tmp = entitize ( md->timestamp ); fprintf ( f, " <time>%s</time>\n", tmp ); g_free ( tmp ); } if ( md->keywords ) { tmp = entitize ( md->keywords ); fprintf ( f, " <keywords>%s</keywords>\n", tmp ); g_free ( tmp ); } } if ( vik_trw_layer_get_waypoints_visibility(vtl) || (options && options->hidden) ) { // gather waypoints in a list, then sort GList *gl = g_hash_table_get_values ( vik_trw_layer_get_waypoints ( vtl ) ); gl = g_list_sort ( gl, gpx_waypoint_compare ); for (GList *iter = g_list_first (gl); iter != NULL; iter = g_list_next (iter)) { gpx_write_waypoint ( (VikWaypoint*)iter->data, &context ); } g_list_free ( gl ); } GList *gl = NULL; if ( vik_trw_layer_get_tracks_visibility(vtl) || (options && options->hidden) ) { //gl = g_hash_table_get_values ( vik_trw_layer_get_tracks ( vtl ) ); // Forming the list manually seems to produce one that is more likely to be nearer to the creation order gpointer key, value; GHashTableIter ght_iter; g_hash_table_iter_init ( &ght_iter, vik_trw_layer_get_tracks ( vtl ) ); while ( g_hash_table_iter_next (&ght_iter, &key, &value) ) { gl = g_list_prepend ( gl ,value ); } gl = g_list_reverse ( gl ); // Sort method determined by preference if ( a_vik_get_gpx_export_trk_sort() == VIK_GPX_EXPORT_TRK_SORT_TIME ) gl = g_list_sort ( gl, vik_track_compare_timestamp ); else if ( a_vik_get_gpx_export_trk_sort() == VIK_GPX_EXPORT_TRK_SORT_ALPHA ) gl = g_list_sort ( gl, gpx_track_compare_name ); } GList *glrte = NULL; // Routes sorted by name if ( vik_trw_layer_get_tracks_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 ); } // g_list_concat doesn't copy memory properly // so process each list separately GpxWritingContext context_tmp = context; GpxWritingOptions opt_tmp = { FALSE, 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 (GList *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 (GList *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 ); }