summaryrefslogtreecommitdiff
path: root/libgweather
diff options
context:
space:
mode:
Diffstat (limited to 'libgweather')
-rw-r--r--libgweather/weather-iwin.c11
-rw-r--r--libgweather/weather-metar.c12
-rw-r--r--libgweather/weather-owm.c12
-rw-r--r--libgweather/weather-priv.h7
-rw-r--r--libgweather/weather-wx.c13
-rw-r--r--libgweather/weather-yahoo.c12
-rw-r--r--libgweather/weather-yrno.c24
-rw-r--r--libgweather/weather.c37
8 files changed, 79 insertions, 49 deletions
diff --git a/libgweather/weather-iwin.c b/libgweather/weather-iwin.c
index 5961878..1bc60f5 100644
--- a/libgweather/weather-iwin.c
+++ b/libgweather/weather-iwin.c
@@ -322,16 +322,17 @@ iwin_finish (SoupSession *session, SoupMessage *msg, gpointer data)
if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
/* forecast data is not really interesting anyway ;) */
- g_warning ("Failed to get IWIN forecast data: %d %s\n",
- msg->status_code, msg->reason_phrase);
- _gweather_info_request_done (info);
+ if (msg->status_code != SOUP_STATUS_CANCELLED)
+ g_warning ("Failed to get IWIN forecast data: %d %s\n",
+ msg->status_code, msg->reason_phrase);
+ _gweather_info_request_done (info, msg);
return;
}
priv = info->priv;
priv->forecast_list = parseForecastXml (msg->response_body->data, info);
- _gweather_info_request_done (info);
+ _gweather_info_request_done (info, msg);
}
/* Get forecast into newly alloc'ed string */
@@ -370,9 +371,9 @@ iwin_start_open (GWeatherInfo *info)
url = g_strdup_printf ("http://www.weather.gov/forecasts/xml/sample_products/browser_interface/ndfdBrowserClientByDay.php?&lat=%s&lon=%s&format=24+hourly&startDate=%04d-%02d-%02d&numDays=7",
latstr, lonstr, 1900 + tm.tm_year, 1 + tm.tm_mon, tm.tm_mday);
msg = soup_message_new ("GET", url);
+ _gweather_info_begin_request (info, msg);
soup_session_queue_message (priv->session, msg, iwin_finish, info);
- priv->requests_pending++;
g_free (url);
return TRUE;
diff --git a/libgweather/weather-metar.c b/libgweather/weather-metar.c
index 94ff2cc..d808e43 100644
--- a/libgweather/weather-metar.c
+++ b/libgweather/weather-metar.c
@@ -570,11 +570,12 @@ metar_finish (SoupSession *session, SoupMessage *msg, gpointer data)
priv->network_error = TRUE;
else {
/* Translators: %d is an error code, and %s the error string */
- g_warning (_("Failed to get METAR data: %d %s.\n"),
- msg->status_code, msg->reason_phrase);
+ if (msg->status_code != SOUP_STATUS_CANCELLED)
+ g_warning (_("Failed to get METAR data: %d %s.\n"),
+ msg->status_code, msg->reason_phrase);
}
- _gweather_info_request_done (info);
+ _gweather_info_request_done (info, msg);
return;
}
@@ -601,7 +602,7 @@ metar_finish (SoupSession *session, SoupMessage *msg, gpointer data)
}
priv->valid = success;
- _gweather_info_request_done (info);
+ _gweather_info_request_done (info, msg);
}
/* Read current conditions and fill in info structure */
@@ -623,7 +624,6 @@ metar_start_open (GWeatherInfo *info)
"GET", "http://weather.noaa.gov/cgi-bin/mgetmetar.pl",
"cccc", loc->code,
NULL);
+ _gweather_info_begin_request (info, msg);
soup_session_queue_message (priv->session, msg, metar_finish, info);
-
- priv->requests_pending++;
}
diff --git a/libgweather/weather-owm.c b/libgweather/weather-owm.c
index 06841b9..065fd6c 100644
--- a/libgweather/weather-owm.c
+++ b/libgweather/weather-owm.c
@@ -400,14 +400,15 @@ owm_finish (SoupSession *session,
if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
/* forecast data is not really interesting anyway ;) */
- g_message ("Failed to get OpenWeatherMap forecast data: %d %s\n",
- msg->status_code, msg->reason_phrase);
- _gweather_info_request_done (info);
+ if (msg->status_code != SOUP_STATUS_CANCELLED)
+ g_message ("Failed to get OpenWeatherMap forecast data: %d %s\n",
+ msg->status_code, msg->reason_phrase);
+ _gweather_info_request_done (info, msg);
return;
}
parse_forecast_xml (info, msg->response_body);
- _gweather_info_request_done (info);
+ _gweather_info_request_done (info, msg);
}
gboolean
@@ -442,10 +443,9 @@ owm_start_open (GWeatherInfo *info)
#undef TEMPLATE
message = soup_message_new ("GET", url);
+ _gweather_info_begin_request (info, message);
soup_session_queue_message (priv->session, message, owm_finish, info);
- priv->requests_pending++;
-
g_free (url);
return TRUE;
diff --git a/libgweather/weather-priv.h b/libgweather/weather-priv.h
index f81c228..09c7e99 100644
--- a/libgweather/weather-priv.h
+++ b/libgweather/weather-priv.h
@@ -134,7 +134,7 @@ struct _GWeatherInfoPrivate {
GdkPixbufLoader *radar_loader;
GdkPixbufAnimation *radar;
SoupSession *session;
- gint requests_pending;
+ GSList *requests_pending;
};
/* Values common to the parsing source files */
@@ -191,7 +191,10 @@ gboolean owm_start_open (GWeatherInfo *info);
gboolean metar_parse (gchar *metar,
GWeatherInfo *info);
-void _gweather_info_request_done (GWeatherInfo *info);
+void _gweather_info_begin_request (GWeatherInfo *info,
+ SoupMessage *message);
+void _gweather_info_request_done (GWeatherInfo *info,
+ SoupMessage *message);
void ecl2equ (gdouble t,
gdouble eclipLon,
diff --git a/libgweather/weather-wx.c b/libgweather/weather-wx.c
index 567e072..2701dce 100644
--- a/libgweather/weather-wx.c
+++ b/libgweather/weather-wx.c
@@ -34,10 +34,11 @@ wx_finish (SoupSession *session, SoupMessage *msg, gpointer data)
priv = info->priv;
if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
- g_warning ("Failed to get radar map image: %d %s.\n",
- msg->status_code, msg->reason_phrase);
+ if (msg->status_code != SOUP_STATUS_CANCELLED)
+ g_warning ("Failed to get radar map image: %d %s.\n",
+ msg->status_code, msg->reason_phrase);
g_object_unref (priv->radar_loader);
- _gweather_info_request_done (info);
+ _gweather_info_request_done (info, msg);
return;
}
@@ -51,7 +52,7 @@ wx_finish (SoupSession *session, SoupMessage *msg, gpointer data)
}
g_object_unref (priv->radar_loader);
- _gweather_info_request_done (info);
+ _gweather_info_request_done (info, msg);
}
static void
@@ -103,8 +104,8 @@ wx_start_open (GWeatherInfo *info)
g_signal_connect (msg, "got-chunk", G_CALLBACK (wx_got_chunk), info);
soup_message_body_set_accumulate (msg->response_body, FALSE);
+ _gweather_info_begin_request (info, msg);
soup_session_queue_message (priv->session, msg, wx_finish, info);
- g_free (url);
- priv->requests_pending++;
+ g_free (url);
}
diff --git a/libgweather/weather-yahoo.c b/libgweather/weather-yahoo.c
index 778169e..a44ae21 100644
--- a/libgweather/weather-yahoo.c
+++ b/libgweather/weather-yahoo.c
@@ -249,14 +249,15 @@ yahoo_finish (SoupSession *session,
if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
/* forecast data is not really interesting anyway ;) */
- g_warning ("Failed to get Yahoo! Weather forecast data: %d %s\n",
- msg->status_code, msg->reason_phrase);
- _gweather_info_request_done (info);
+ if (msg->status_code != SOUP_STATUS_CANCELLED)
+ g_warning ("Failed to get Yahoo! Weather forecast data: %d %s\n",
+ msg->status_code, msg->reason_phrase);
+ _gweather_info_request_done (info, msg);
return;
}
parse_forecast_xml (info, msg->response_body);
- _gweather_info_request_done (info);
+ _gweather_info_request_done (info, msg);
}
gboolean
@@ -280,10 +281,9 @@ yahoo_start_open (GWeatherInfo *info)
url = g_strdup_printf("http://weather.yahooapis.com/forecastrss?w=%s&u=f", loc->yahoo_id);
message = soup_message_new ("GET", url);
+ _gweather_info_begin_request (info, message);
soup_session_queue_message (priv->session, message, yahoo_finish, info);
- priv->requests_pending++;
-
g_free (url);
return TRUE;
diff --git a/libgweather/weather-yrno.c b/libgweather/weather-yrno.c
index 3b42a48..f7db931 100644
--- a/libgweather/weather-yrno.c
+++ b/libgweather/weather-yrno.c
@@ -458,14 +458,15 @@ yrno_finish_old (SoupSession *session,
if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
/* forecast data is not really interesting anyway ;) */
- g_message ("Failed to get Yr.no forecast data: %d %s\n",
- msg->status_code, msg->reason_phrase);
- _gweather_info_request_done (info);
+ if (msg->status_code != SOUP_STATUS_CANCELLED)
+ g_message ("Failed to get Yr.no forecast data: %d %s\n",
+ msg->status_code, msg->reason_phrase);
+ _gweather_info_request_done (info, msg);
return;
}
parse_forecast_xml_old (info, msg->response_body);
- _gweather_info_request_done (info);
+ _gweather_info_request_done (info, msg);
}
static gboolean
@@ -482,10 +483,9 @@ yrno_start_open_old (GWeatherInfo *info)
return FALSE;
message = soup_message_new ("GET", url);
+ _gweather_info_begin_request (info, message);
soup_session_queue_message (priv->session, message, yrno_finish_old, info);
- priv->requests_pending++;
-
g_free (url);
return TRUE;
@@ -500,15 +500,16 @@ yrno_finish_new (SoupSession *session,
if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
/* forecast data is not really interesting anyway ;) */
- g_message ("Failed to get Yr.no forecast data: %d %s\n",
- msg->status_code, msg->reason_phrase);
- _gweather_info_request_done (info);
+ if (msg->status_code != SOUP_STATUS_CANCELLED)
+ g_message ("Failed to get Yr.no forecast data: %d %s\n",
+ msg->status_code, msg->reason_phrase);
+ _gweather_info_request_done (info, msg);
return;
}
parse_forecast_xml_new (info, msg->response_body);
- _gweather_info_request_done (info);
+ _gweather_info_request_done (info, msg);
}
static gboolean
@@ -534,10 +535,9 @@ yrno_start_open_new (GWeatherInfo *info)
url = g_strdup_printf("http://api.yr.no/weatherapi/locationforecast/1.8/?lat=%s;lon=%s", latstr, lonstr);
message = soup_message_new ("GET", url);
+ _gweather_info_begin_request (info, message);
soup_session_queue_message (priv->session, message, yrno_finish_new, info);
- priv->requests_pending++;
-
g_free (url);
return TRUE;
diff --git a/libgweather/weather.c b/libgweather/weather.c
index d9b7807..9d97cac 100644
--- a/libgweather/weather.c
+++ b/libgweather/weather.c
@@ -226,9 +226,21 @@ requests_init (GWeatherInfo *info)
}
void
-_gweather_info_request_done (GWeatherInfo *info)
+_gweather_info_begin_request (GWeatherInfo *info,
+ SoupMessage *message)
{
- if (!--info->priv->requests_pending)
+ info->priv->requests_pending = g_slist_prepend (info->priv->requests_pending, message);
+ g_object_ref (message);
+}
+
+void
+_gweather_info_request_done (GWeatherInfo *info,
+ SoupMessage *message)
+{
+ info->priv->requests_pending = g_slist_remove (info->priv->requests_pending, message);
+ g_object_ref (message);
+
+ if (info->priv->requests_pending == NULL)
g_signal_emit (info, gweather_info_signals[SIGNAL_UPDATED], 0);
}
@@ -423,7 +435,7 @@ settings_changed_cb (GSettings *settings,
Otherwise just wait for the update that will happen at
the end
*/
- if (priv->requests_pending == 0)
+ if (priv->requests_pending == NULL)
g_signal_emit (info, gweather_info_signals[SIGNAL_UPDATED], 0);
}
@@ -589,12 +601,25 @@ gweather_info_update (GWeatherInfo *info)
void
gweather_info_abort (GWeatherInfo *info)
{
+ GSList *list, *iter;
+ GSList dummy = { NULL, NULL };
+
g_return_if_fail (GWEATHER_IS_INFO (info));
- if (info->priv->session) {
- soup_session_abort (info->priv->session);
- info->priv->requests_pending = 0;
+ if (info->priv->session == NULL) {
+ g_assert (info->priv->requests_pending == NULL);
+ return;
}
+
+ list = info->priv->requests_pending;
+ /* to block updated signals */
+ info->priv->requests_pending = &dummy;
+
+ for (iter = list; iter; iter = iter->next)
+ soup_session_cancel_message (info->priv->session, iter->data, SOUP_STATUS_CANCELLED);
+ g_slist_free (list);
+
+ info->priv->requests_pending = NULL;
}
static void