- g_spawn_async(
- NULL, // const gchar *working_directory,
- argv, // gchar **argv,
- NULL, // gchar **envp,
- G_SPAWN_SEARCH_PATH|
- G_SPAWN_DO_NOT_REAP_CHILD,
- // GSpawnFlags flags,
- NULL, // GSpawnChildSetupFunc child_setup,
- NULL, // gpointer user_data,
- &pid, // GPid *child_pid,
- &error); // GError **error
- if (error)
- g_warning("failed to decompress WSR88D data: %s", error->message);
- g_child_watch_add(pid, load_radar_rsl, raw);
+
+ 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);
+ }
+
+ GRegex *regex = g_regex_new("^[A-Z]{4}_([0-9]{8}_[0-9]{4})$", 0, 0, NULL); // KLSX_20090622_2113
+ GMatchInfo *info;
+
+ GtkTreeView *tview = GTK_TREE_VIEW(aweather_gui_get_widget(self->gui, "time"));
+ GtkListStore *lstore = GTK_LIST_STORE(gtk_tree_view_get_model(tview));
+ gtk_list_store_clear(lstore);
+ GtkTreeIter iter;
+ times = g_list_reverse(times);
+ for (GList *cur = times; cur; cur = cur->next) {
+ g_message("trying time %s", (gchar*)cur->data);
+ if (g_regex_match(regex, cur->data, 0, &info)) {
+ gchar *time = g_match_info_fetch(info, 1);
+ 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;
+ }
+ }
+
+ g_regex_unref(regex);
+ g_list_foreach(times, (GFunc)g_free, NULL);
+ g_list_free(times);
+}
+
+/*****************
+ * ASync helpers *
+ *****************/
+typedef struct {
+ AWeatherRadar *self;
+ gchar *radar_file;
+} decompressed_t;
+
+static void decompressed_cb(GPid pid, gint status, gpointer _udata)
+{
+ decompressed_t *udata = _udata;
+ if (status != 0) {
+ g_warning("wsr88ddec exited with status %d", status);
+ return;
+ }
+ load_radar(udata->self, udata->radar_file);
+ g_spawn_close_pid(pid);
+ g_free(udata->radar_file);
+ g_free(udata);
+}
+
+static void cached_cb(char *path, gboolean updated, gpointer _self)
+{
+ AWeatherRadar *self = AWEATHER_RADAR(_self);
+ char *decompressed = g_strconcat(path, ".raw", NULL);
+ if (!updated) {
+ load_radar(self, decompressed);
+ return;
+ }
+
+ decompressed_t *udata = g_malloc(sizeof(decompressed_t));
+ udata->self = self;
+ udata->radar_file = decompressed;
+ g_debug("AWeatherRadar: cached_cb - File updated, decompressing..");
+ char *argv[] = {"wsr88ddec", path, decompressed, NULL};
+ GPid pid;
+ GError *error = NULL;
+ g_spawn_async(
+ NULL, // const gchar *working_directory,
+ argv, // gchar **argv,
+ NULL, // gchar **envp,
+ G_SPAWN_SEARCH_PATH|
+ G_SPAWN_DO_NOT_REAP_CHILD,
+ // GSpawnFlags flags,
+ NULL, // GSpawnChildSetupFunc child_setup,
+ NULL, // gpointer user_data,
+ &pid, // GPid *child_pid,
+ &error); // GError **error
+ if (error) {
+ g_warning("failed to decompress WSR88D data: %s",
+ error->message);
+ g_error_free(error);