From: Thomas Thurman Date: Sun, 30 Aug 2009 21:41:24 +0000 (-0400) Subject: parse_dove simplified X-Git-Url: http://git.maemo.org/git/?p=belltower;a=commitdiff_plain;h=8a94f2099cf5f17f684b267576092a1f617a67c1 parse_dove simplified --- diff --git a/TODO b/TODO index abf0d42..c86bf78 100644 --- a/TODO +++ b/TODO @@ -1,6 +1,5 @@ -* Window name on tower pick lists * Sharp and flat signs * Add my name to the credits list * Switch names in the buttons in the credits list around ("view..." should be subtext) * Download Dove automatically -* parse_dove should have an option to call show_towers_by_list automagically (maybe if you include a title) + diff --git a/belltower.c b/belltower.c index b5ef2a3..b7b2dcb 100644 --- a/belltower.c +++ b/belltower.c @@ -100,6 +100,9 @@ typedef struct { int n_fields; } tower; +static void show_towers_from_list (GSList *list, gchar *list_name); +static void free_tower_list (GSList *list); + static void show_message (char *message) { @@ -741,16 +744,28 @@ found_tower_free (FoundTower *tower) g_free (tower); } +/** + * Calls a given function once for each tower in the world. + * (The first call, however, is a header row.) + * + * \param callback The function to call. + * \param data Arbitrary data to pass to the callback. + * \param dialogue_title If non-NULL, a list will be displayed + * with the results. This is the title + * used for that dialogue. (The dialogue + * will automatically free filter_results.) + */ static void parse_dove (ParseDoveCallback callback, - GSList **filter_results, - gpointer data) + gpointer data, + gchar *dialogue_title) { FILE *dove = fopen("/usr/share/belltower/dove.txt", "r"); char tower_rec[4096]; tower result; char *i; gboolean seen_newline; + GSList *filter_results = NULL; if (!dove) { @@ -801,23 +816,30 @@ parse_dove (ParseDoveCallback callback, return; case FILTER_ACCEPT: - if (filter_results) - { - *filter_results = g_slist_append (*filter_results, - found_tower_new (&result)); - } + filter_results = g_slist_append (filter_results, + found_tower_new (&result)); } result.serial++; } fclose (dove); + + if (dialogue_title) + { + show_towers_from_list (filter_results, + dialogue_title); + } + else + { + free_tower_list (filter_results); + } } static void show_tower (char *primary_key) { - parse_dove (single_tower_cb, NULL, primary_key); + parse_dove (single_tower_cb, primary_key, NULL); } static void @@ -851,7 +873,6 @@ show_towers_from_list (GSList *list, GtkWidget *selector; gint result = -1; GSList *cursor; - gchar foo[2048]; if (!list) { @@ -932,8 +953,6 @@ put_areas_into_list (gpointer key, static void nearby_towers (void) { - GSList *matches = NULL; - if (!(device->fix->fields & LOCATION_GPS_DEVICE_LATLONG_SET)) { show_message ("I don't know where you are!"); @@ -941,10 +960,8 @@ nearby_towers (void) } parse_dove (get_nearby_towers_cb, - &matches, - NULL); - - show_towers_from_list (matches); + NULL, + "Towers within fifty miles of you"); } static void @@ -964,7 +981,7 @@ towers_by_subarea (gchar *area) gtk_window_set_title (GTK_WINDOW (dialog), title); g_free (title); - parse_dove (get_counties_cb, NULL, &d); + parse_dove (get_counties_cb, &d, NULL); g_hash_table_foreach (hash, put_areas_into_list, @@ -983,15 +1000,16 @@ towers_by_subarea (gchar *area) if (gtk_dialog_run (GTK_DIALOG (dialog))==GTK_RESPONSE_OK) { - GSList *matches = NULL; + gchar *title; cac.county = g_strdup (hildon_touch_selector_get_current_text (HILDON_TOUCH_SELECTOR (selector))); + title = g_strdup_printf ("Towers in %s", + cac.county); parse_dove (get_towers_by_county_cb, - &matches, - &cac); + &cac, + title); g_free (cac.county); - - show_towers_from_list (matches); + g_free (title); } g_hash_table_unref (hash); gtk_widget_destroy (GTK_WIDGET (dialog)); @@ -1066,7 +1084,7 @@ towers_by_area_with_many (gboolean countries_with_many) countries_with_many? COUNTRIES_WITH_MANY : COUNTRIES_WITH_FEW); - parse_dove (get_countries_cb, NULL, countries_to_counts); + parse_dove (get_countries_cb, countries_to_counts, NULL); country_names = get_countries_with_many (countries_to_counts, countries_with_many); @@ -1116,13 +1134,14 @@ towers_by_area_with_many (gboolean countries_with_many) else { country_and_county cac = { result, NULL }; - GSList *matches = NULL; + gchar *title = g_strdup_printf ("Belltowers in %s", + result); parse_dove (get_towers_by_county_cb, - &matches, - &cac); + &cac, + title); - show_towers_from_list (matches); + g_free (title); } g_free (result); @@ -1141,13 +1160,9 @@ towers_by_area (void) static void show_bookmarks (void) { - GSList *matches = NULL; - parse_dove (get_group_of_towers_cb, - &matches, - CONFIG_BOOKMARK_GROUP); - - show_towers_from_list (matches); + CONFIG_BOOKMARK_GROUP, + "Bookmarks"); } static void @@ -1160,7 +1175,6 @@ tower_search (void) GTK_RESPONSE_OK, NULL); GtkWidget *entry = gtk_entry_new (); - GSList *matches = NULL; gtk_box_pack_end (GTK_BOX (GTK_DIALOG (terms)->vbox), entry, TRUE, TRUE, 0); @@ -1169,13 +1183,9 @@ tower_search (void) if (gtk_dialog_run (GTK_DIALOG (terms))==GTK_RESPONSE_OK) { - GSList *matches = NULL; - parse_dove (get_towers_by_search_cb, - &matches, - (char*) gtk_entry_get_text (GTK_ENTRY (entry))); - - show_towers_from_list (matches); + (char*) gtk_entry_get_text (GTK_ENTRY (entry)), + "Search results"); } gtk_widget_destroy (GTK_WIDGET (terms)); @@ -1184,13 +1194,9 @@ tower_search (void) static void recent_towers (void) { - GSList *matches = NULL; - parse_dove (get_group_of_towers_cb, - &matches, - CONFIG_RECENT_GROUP); - - show_towers_from_list (matches); + CONFIG_RECENT_GROUP, + "Towers you have recently viewed"); } /**