]> Pileus Git - aweather/blobdiff - src/plugin-radar.c
Removing remaining GVFS dependencies.
[aweather] / src / plugin-radar.c
index e5e56b68f288b7e4eae1a2ea27ad530df9b7b2fa..18e92796c0e363cd4fbd579a50e2422011edb3d9 100644 (file)
@@ -27,6 +27,8 @@
 #include "plugin-radar.h"
 #include "data.h"
 
+static char *nexrad_base = "http://mesonet.agron.iastate.edu/data/";
+
 /****************
  * GObject code *
  ****************/
@@ -47,7 +49,8 @@ static void aweather_radar_init(AWeatherRadar *radar)
 {
        g_debug("AWeatherRadar: class_init");
        /* Set defaults */
-       radar->gui = NULL;
+       radar->gui  = NULL;
+       radar->soup = NULL;
 }
 static void aweather_radar_dispose(GObject *gobject)
 {
@@ -250,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, 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;
 
@@ -305,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 *
@@ -336,7 +343,23 @@ static void decompressed_cb(GPid pid, gint status, gpointer _udata)
        g_free(udata);
 }
 
-static void cached_cb(char *path, gboolean updated, gpointer _self)
+static void cache_chunk_cb(char *path, goffset cur, goffset total, gpointer _self)
+{
+       AWeatherRadar *self = AWEATHER_RADAR(_self);
+       double percent = (double)cur/total;
+
+       g_message("AWeatherRadar: cache_chunk_cb - %lld/%lld = %.2f%%",
+                       cur, total, percent*100);
+
+       gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(self->progress_bar), MIN(percent, 1.0));
+
+       gchar *msg = g_strdup_printf("Loading radar... %5.1f%% (%.2f/%.2f MB)",
+                       percent*100, (double)cur/1000000, (double)total/1000000);
+       gtk_label_set_text(GTK_LABEL(self->progress_label), msg);
+       g_free(msg);
+}
+
+static void cache_done_cb(char *path, gboolean updated, gpointer _self)
 {
        AWeatherRadar *self = AWEATHER_RADAR(_self);
        char *decompressed = g_strconcat(path, ".raw", NULL);
@@ -348,7 +371,7 @@ static void cached_cb(char *path, gboolean updated, gpointer _self)
        decompressed_t *udata = g_malloc(sizeof(decompressed_t));
        udata->self       = self;
        udata->radar_file = decompressed;
-       g_debug("AWeatherRadar: cached_cb - File updated, decompressing..");
+       g_debug("AWeatherRadar: cache_done_cb - File updated, decompressing..");
        char *argv[] = {"wsr88ddec", path, decompressed, NULL};
        GPid pid;
        GError *error = NULL;
@@ -369,6 +392,7 @@ static void cached_cb(char *path, gboolean updated, gpointer _self)
                g_error_free(error);
        }
        g_child_watch_add(pid, decompressed_cb, udata);
+       self->soup = NULL;
 }
 
 /*************
@@ -387,16 +411,22 @@ 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);
 
-       /* Clear out children */
+       /* Set up progress bar */
        GtkWidget *child = gtk_bin_get_child(GTK_BIN(self->config_body));
-       if (child)
-               gtk_widget_destroy(child);
-       gtk_container_add(GTK_CONTAINER(self->config_body),
-               gtk_label_new("Loading radar..."));
+       if (child) gtk_widget_destroy(child);
+
+       GtkWidget *vbox = gtk_vbox_new(FALSE, 10);
+       gtk_container_set_border_width(GTK_CONTAINER(vbox), 10);
+       self->progress_bar   = gtk_progress_bar_new();
+       self->progress_label = gtk_label_new("Loading radar...");
+       gtk_box_pack_start(GTK_BOX(vbox), self->progress_bar,   FALSE, FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(vbox), self->progress_label, FALSE, FALSE, 0);
+       gtk_container_add(GTK_CONTAINER(self->config_body), vbox);
        gtk_widget_show_all(self->config_body);
+
+       /* Clear radar */
        if (self->cur_radar)
                RSL_free_radar(self->cur_radar);
        self->cur_radar = NULL;
@@ -404,10 +434,16 @@ static void on_time_changed(AWeatherView *view, const char *time, gpointer _self
        aweather_gui_gl_redraw(self->gui);
 
        /* Start loading the new radar */
+       if (self->soup) {
+               soup_session_abort(self->soup);
+               self->soup = NULL;
+       }
        if (aweather_view_get_offline(view)) 
-               cache_file(base, path, AWEATHER_ONCE, cached_cb, self);
+               self->soup = cache_file(nexrad_base, path, AWEATHER_ONCE,
+                               cache_chunk_cb, cache_done_cb, self);
        else 
-               cache_file(base, path, AWEATHER_UPDATE, cached_cb, self);
+               self->soup = cache_file(nexrad_base, path, AWEATHER_UPDATE,
+                               cache_chunk_cb, cache_done_cb, self);
        g_free(path);
 }
 
@@ -415,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);
 }
 
 /***********