X-Git-Url: http://pileus.org/git/?p=aweather;a=blobdiff_plain;f=src%2Fplugin-radar.c;h=18e92796c0e363cd4fbd579a50e2422011edb3d9;hp=8d5fb4e3d58cd3f853a004a818e9b3771e3483e5;hb=1019fcfe2d612df24355f2597e661c28621b01c3;hpb=6b037fba184029de7fc45ab81eae41d5af23dc49 diff --git a/src/plugin-radar.c b/src/plugin-radar.c index 8d5fb4e..18e9279 100644 --- a/src/plugin-radar.c +++ b/src/plugin-radar.c @@ -27,6 +27,8 @@ #include "plugin-radar.h" #include "data.h" +static char *nexrad_base = "http://mesonet.agron.iastate.edu/data/"; + /**************** * GObject code * ****************/ @@ -251,46 +253,10 @@ static void load_radar(AWeatherRadar *self, gchar *radar_file) load_radar_gui(self, radar); } -static void update_times(AWeatherRadar *self, AWeatherView *view, char *site, char **last_time) +/* TODO: These update times functions are getting ugly... */ +static void update_times_gtk(AWeatherRadar *self, GList *times) { - GList *times = NULL; - if (aweather_view_get_offline(view)) { - gchar *path = g_build_filename(g_get_user_cache_dir(), PACKAGE, "nexrd2", "raw", site, NULL); - GDir *dir = g_dir_open(path, 0, NULL); - if (dir) { - const gchar *name; - while ((name = g_dir_read_name(dir))) { - times = g_list_prepend(times, g_strdup(name)); - } - g_dir_close(dir); - } - g_free(path); - } else { - gchar *data; - gsize length; - GError *error = NULL; - - char *list_uri = g_strdup_printf("http://mesonet.agron.iastate.edu/data/nexrd2/raw/%s/dir.list", site); - GFile *list = g_file_new_for_uri(list_uri); - g_file_load_contents(list, NULL, &data, &length, NULL, &error); - if (error) { - g_warning("Error loading list for %s: %s", site, error->message); - g_error_free(error); - } else { - gchar **lines = g_strsplit(data, "\n", -1); - for (int i = 0; lines[i] && lines[i][0]; i++) { - char **parts = g_strsplit(lines[i], " ", 2); - times = g_list_prepend(times, g_strdup(parts[1])); - g_strfreev(parts); - } - g_strfreev(lines); - g_free(data); - } - - g_free(list_uri); - g_object_unref(list); - } - + gchar *last_time = NULL; GRegex *regex = g_regex_new("^[A-Z]{4}_([0-9]{8}_[0-9]{4})$", 0, 0, NULL); // KLSX_20090622_2113 GMatchInfo *info; @@ -306,15 +272,55 @@ static void update_times(AWeatherRadar *self, AWeatherView *view, char *site, ch g_message("adding time %s", (gchar*)cur->data); gtk_list_store_insert(lstore, &iter, 0); gtk_list_store_set(lstore, &iter, 0, time, -1); - if (last_time) - *last_time = time; + last_time = time; } } + AWeatherView *view = aweather_gui_get_view(self->gui); + aweather_view_set_time(view, last_time); + g_regex_unref(regex); g_list_foreach(times, (GFunc)g_free, NULL); g_list_free(times); } +static void update_times_online_cb(char *path, gboolean updated, gpointer _self) +{ + GList *times = NULL; + gchar *data; + gsize length; + g_file_get_contents(path, &data, &length, NULL); + gchar **lines = g_strsplit(data, "\n", -1); + for (int i = 0; lines[i] && lines[i][0]; i++) { + char **parts = g_strsplit(lines[i], " ", 2); + times = g_list_prepend(times, g_strdup(parts[1])); + g_strfreev(parts); + } + g_strfreev(lines); + g_free(data); + + update_times_gtk(_self, times); +} +static void update_times(AWeatherRadar *self, AWeatherView *view, char *site) +{ + if (aweather_view_get_offline(view)) { + GList *times = NULL; + gchar *path = g_build_filename(g_get_user_cache_dir(), PACKAGE, "nexrd2", "raw", site, NULL); + GDir *dir = g_dir_open(path, 0, NULL); + if (dir) { + const gchar *name; + while ((name = g_dir_read_name(dir))) { + times = g_list_prepend(times, g_strdup(name)); + } + g_dir_close(dir); + } + g_free(path); + update_times_gtk(self, times); + } else { + gchar *path = g_strdup_printf("nexrd2/raw/%s/dir.list", site); + cache_file(nexrad_base, path, AWEATHER_REFRESH, NULL, update_times_online_cb, self); + /* update_times_gtk from update_times_online_cb */ + } +} /***************** * ASync helpers * @@ -405,7 +411,6 @@ static void on_time_changed(AWeatherView *view, const char *time, gpointer _self g_debug("AWeatherRadar: on_time_changed - setting time=%s", time); // format: http://mesonet.agron.iastate.edu/data/nexrd2/raw/KABR/KABR_20090510_0323 char *site = aweather_view_get_site(view); - char *base = "http://mesonet.agron.iastate.edu/data/"; char *path = g_strdup_printf("nexrd2/raw/%s/%s_%s", site, site, time); /* Set up progress bar */ @@ -434,10 +439,10 @@ static void on_time_changed(AWeatherView *view, const char *time, gpointer _self self->soup = NULL; } if (aweather_view_get_offline(view)) - self->soup = cache_file(base, path, AWEATHER_ONCE, + self->soup = cache_file(nexrad_base, path, AWEATHER_ONCE, cache_chunk_cb, cache_done_cb, self); else - self->soup = cache_file(base, path, AWEATHER_UPDATE, + self->soup = cache_file(nexrad_base, path, AWEATHER_UPDATE, cache_chunk_cb, cache_done_cb, self); g_free(path); } @@ -446,21 +451,14 @@ static void on_site_changed(AWeatherView *view, char *site, gpointer _self) { AWeatherRadar *self = AWEATHER_RADAR(_self); g_debug("AWeatherRadar: on_site_changed - Loading wsr88d list for %s", site); - char *time = NULL; - update_times(self, view, site, &time); - aweather_view_set_time(view, time); - - g_free(time); + update_times(self, view, site), &time; } static void on_refresh(AWeatherView *view, gpointer _self) { AWeatherRadar *self = AWEATHER_RADAR(_self); char *site = aweather_view_get_site(view); - char *time = NULL; - update_times(self, view, site, &time); - aweather_view_set_time(view, time); - g_free(time); + update_times(self, view, site); } /***********