diff -up evolution-data-server-3.12.11/calendar/backends/weather/e-cal-backend-weather.c.weather-update-units evolution-data-server-3.12.11/calendar/backends/weather/e-cal-backend-weather.c --- evolution-data-server-3.12.11/calendar/backends/weather/e-cal-backend-weather.c.weather-update-units 2016-03-07 13:58:10.305155925 +0100 +++ evolution-data-server-3.12.11/calendar/backends/weather/e-cal-backend-weather.c 2016-03-07 13:58:10.336155765 +0100 @@ -67,13 +67,16 @@ struct _ECalBackendWeatherPrivate { guint reload_timeout_id; guint is_loading : 1; - /* Flags */ - gboolean opened; - /* Weather source */ EWeatherSource *source; guint begin_retrival_id; + + gulong source_changed_id; + + GMutex last_used_mutex; + ESourceWeatherUnits last_used_units; + gchar *last_used_location; }; static gboolean @@ -87,7 +90,6 @@ reload_cb (gpointer user_data) return TRUE; cbw->priv->reload_timeout_id = 0; - cbw->priv->opened = TRUE; begin_retrieval_cb (cbw); return FALSE; @@ -200,13 +202,21 @@ finished_retrieval_cb (GWeatherInfo *inf source = e_backend_get_source (E_BACKEND (cbw)); weather_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_WEATHER_BACKEND); - if (e_source_weather_get_units (weather_extension) == E_SOURCE_WEATHER_UNITS_CENTIGRADE) + g_mutex_lock (&priv->last_used_mutex); + + priv->last_used_units = e_source_weather_get_units (weather_extension); + g_free (priv->last_used_location); + priv->last_used_location = e_source_weather_dup_location (weather_extension); + + if (priv->last_used_units == E_SOURCE_WEATHER_UNITS_CENTIGRADE) unit = GWEATHER_TEMP_UNIT_CENTIGRADE; - else if (e_source_weather_get_units (weather_extension) == E_SOURCE_WEATHER_UNITS_KELVIN) + else if (priv->last_used_units == E_SOURCE_WEATHER_UNITS_KELVIN) unit = GWEATHER_TEMP_UNIT_KELVIN; else /* E_SOURCE_WEATHER_UNITS_FAHRENHEIT */ unit = GWEATHER_TEMP_UNIT_FAHRENHEIT; + g_mutex_unlock (&priv->last_used_mutex); + /* update cache */ comps = e_cal_backend_store_get_components (priv->store); @@ -713,28 +723,29 @@ e_cal_backend_weather_open (ECalBackendS } static void -e_cal_backend_weather_refresh (ECalBackendSync *backend, - EDataCal *cal, - GCancellable *cancellable, - GError **perror) +e_cal_backend_weather_refresh_content (ECalBackendWeather *cbw) { - ECalBackendWeather *cbw; - ECalBackendWeatherPrivate *priv; + g_return_if_fail (E_IS_CAL_BACKEND_WEATHER (cbw)); - cbw = E_CAL_BACKEND_WEATHER (backend); - priv = cbw->priv; - - if (!priv->opened || - priv->is_loading) + if (!e_cal_backend_is_opened (E_CAL_BACKEND (cbw)) || + cbw->priv->is_loading) return; - if (priv->reload_timeout_id) - g_source_remove (priv->reload_timeout_id); - priv->reload_timeout_id = 0; + if (cbw->priv->reload_timeout_id) + g_source_remove (cbw->priv->reload_timeout_id); + cbw->priv->reload_timeout_id = 0; /* wait a second, then start reloading */ - priv->reload_timeout_id = - e_named_timeout_add_seconds (1, reload_cb, cbw); + cbw->priv->reload_timeout_id = e_named_timeout_add_seconds (1, reload_cb, cbw); +} + +static void +e_cal_backend_weather_refresh (ECalBackendSync *backend, + EDataCal *cal, + GCancellable *cancellable, + GError **perror) +{ + e_cal_backend_weather_refresh_content (E_CAL_BACKEND_WEATHER (backend)); } static void @@ -945,6 +956,54 @@ e_cal_backend_weather_notify_online_cb ( } static void +e_cal_backend_weather_source_changed_cb (ESource *source, + ECalBackendWeather *cbw) +{ + ESourceWeather *weather_extension; + gchar *location; + + g_return_if_fail (E_IS_SOURCE (source)); + g_return_if_fail (E_IS_CAL_BACKEND_WEATHER (cbw)); + + weather_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_WEATHER_BACKEND); + location = e_source_weather_dup_location (weather_extension); + + g_mutex_lock (&cbw->priv->last_used_mutex); + + if (cbw->priv->last_used_units != e_source_weather_get_units (weather_extension) || + g_strcmp0 (location, cbw->priv->last_used_location) != 0) { + g_mutex_unlock (&cbw->priv->last_used_mutex); + + e_cal_backend_weather_refresh_content (cbw); + } else { + g_mutex_unlock (&cbw->priv->last_used_mutex); + } + + g_free (location); +} + +static void +e_cal_backend_weather_constructed (GObject *object) +{ + ECalBackendWeather *cbw; + ESource *source; + ESourceWeather *weather_extension; + + /* Chain up to parent's method. */ + G_OBJECT_CLASS (e_cal_backend_weather_parent_class)->constructed (object); + + cbw = E_CAL_BACKEND_WEATHER (object); + source = e_backend_get_source (E_BACKEND (cbw)); + + g_return_if_fail (source != NULL); + + weather_extension = e_source_get_extension (source, E_SOURCE_EXTENSION_WEATHER_BACKEND); + + cbw->priv->last_used_units = e_source_weather_get_units (weather_extension); + cbw->priv->source_changed_id = g_signal_connect (source, "changed", G_CALLBACK (e_cal_backend_weather_source_changed_cb), cbw); +} + +static void e_cal_backend_weather_dispose (GObject *object) { ECalBackendWeatherPrivate *priv; @@ -961,6 +1020,17 @@ e_cal_backend_weather_dispose (GObject * priv->begin_retrival_id = 0; } + if (priv->source_changed_id) { + ESource *source; + + source = e_backend_get_source (E_BACKEND (object)); + if (source) { + g_signal_handler_disconnect (source, priv->source_changed_id); + } + + priv->source_changed_id = 0; + } + g_clear_object (&priv->source); /* Chain up to parent's dispose() method. */ @@ -979,6 +1049,8 @@ e_cal_backend_weather_finalize (GObject priv->store = NULL; } + g_mutex_clear (&priv->last_used_mutex); + /* Chain up to parent's finalize() method. */ G_OBJECT_CLASS (e_cal_backend_weather_parent_class)->finalize (object); } @@ -989,6 +1061,8 @@ e_cal_backend_weather_init (ECalBackendW { cbw->priv = E_CAL_BACKEND_WEATHER_GET_PRIVATE (cbw); + g_mutex_init (&cbw->priv->last_used_mutex); + g_signal_connect ( cbw, "notify::online", G_CALLBACK (e_cal_backend_weather_notify_online_cb), NULL); @@ -1008,6 +1082,7 @@ e_cal_backend_weather_class_init (ECalBa backend_class = (ECalBackendClass *) class; sync_class = (ECalBackendSyncClass *) class; + object_class->constructed = e_cal_backend_weather_constructed; object_class->dispose = e_cal_backend_weather_dispose; object_class->finalize = e_cal_backend_weather_finalize;