[gnome-calendar/wip/flb/weather-forecast: 97/135] Weather: Change weather update signal.



commit c5c832241e43ca4920d07fa15753c3efc58f0838
Author: Florian Brosch <flo brosch gmail com>
Date:   Thu Oct 12 23:51:57 2017 +0200

    Weather: Change weather update signal.

 src/gcal-weather-service.c | 49 ++++++++++++++++++++++++++++++++++------------
 src/gcal-weather-service.h |  6 ++++--
 2 files changed, 40 insertions(+), 15 deletions(-)
---
diff --git a/src/gcal-weather-service.c b/src/gcal-weather-service.c
index a2a70969..b8ef25b4 100644
--- a/src/gcal-weather-service.c
+++ b/src/gcal-weather-service.c
@@ -37,7 +37,8 @@ G_BEGIN_DECLS
  *                           freed by gcal_weather_service_stop().
  * @location_cancellable:    Used to deal with async location service construction.
  * @locaton_running:         Whether location service is active.
- * @weather_info:            The weather info to query.
+ * @weather_infos:           List of #GcalWeatherInfo objects.
+ * @gweather_info:           The weather info to query.
  * @max_days:                Number of days we want weather information for.
  * @weather_service_running: True if weather service is active.
  *
@@ -69,6 +70,7 @@ struct _GcalWeatherService
   gboolean         location_service_running;
 
   /* weather: */
+  GSList          *weather_infos;        /* owned[owned] */
   GWeatherInfo    *gweather_info;        /* owned, nullable */
   guint            max_days;
   gboolean         weather_service_running;
@@ -181,6 +183,8 @@ gcal_weather_service_finalize (GObject *object)
   g_cancellable_cancel (self->location_cancellable);
   g_clear_object (&self->location_cancellable);
 
+  g_slist_free_full (self->weather_infos, g_object_unref);
+
   if (self->gweather_info != NULL)
     g_clear_object (&self->gweather_info);
 
@@ -294,10 +298,11 @@ gcal_weather_service_class_init (GcalWeatherServiceClass *klass)
   /**
    * GcalWeatherService::weather-changed:
    * @sender: The #GcalWeatherService
-   * @gwi:    A SList containing updated #GcalWeatherInfos.
    * @self:   data pointer.
    *
-   * Triggered on weather changes.
+   * Triggered on weather changes. Call
+   * gcal_weather_service_get_weather_infos() to
+   * retrieve predictions.
    */
   gcal_weather_service_signals[SIG_WEATHER_CHANGED]
     = g_signal_new ("weather-changed",
@@ -306,10 +311,9 @@ gcal_weather_service_class_init (GcalWeatherServiceClass *klass)
                     0,
                     NULL,
                     NULL,
-                    g_cclosure_marshal_VOID__POINTER,
+                    g_cclosure_marshal_VOID__VOID,
                     G_TYPE_NONE,
-                    1,
-                    G_TYPE_POINTER);
+                    0);
 }
 
 
@@ -323,6 +327,7 @@ gcal_weather_service_init (GcalWeatherService *self)
   self->location_cancellable = g_cancellable_new ();
   self->location_service_running = FALSE;
   self->location_service = NULL;
+  self->weather_infos = NULL;
   self->gweather_info = NULL;
   self->weather_service_running = FALSE;
   self->max_days = 0;
@@ -918,12 +923,14 @@ static void
 gcal_weather_service_update_weather (GWeatherInfo       *info,
                                      GcalWeatherService *self)
 {
-  GSList *gcinfos = NULL; /* owned[owned] */
-
   g_return_if_fail (info == NULL || GWEATHER_IS_INFO (info));
   g_return_if_fail (GCAL_IS_WEATHER_SERVICE (self));
 
-  /* Compute a list of weather infos. */
+  /* Free previously received weather infos */
+  g_slist_free_full (self->weather_infos, g_object_unref);
+  self->weather_infos = NULL;
+
+  /* Compute a list of newly received weather infos. */
   if (info == NULL)
     {
       g_debug ("Could not retrieve valid weather");
@@ -935,7 +942,7 @@ gcal_weather_service_update_weather (GWeatherInfo       *info,
       g_debug ("Received valid weather information");
 
       gwforecast = gweather_info_get_forecast_list (info);
-      gcinfos = preprocess_gweather_reports (self, gwforecast);
+      self->weather_infos = preprocess_gweather_reports (self, gwforecast);
     }
   else
     {
@@ -943,8 +950,7 @@ gcal_weather_service_update_weather (GWeatherInfo       *info,
       g_debug ("Could not retrieve valid weather for location '%s'", location_name);
     }
 
-  g_signal_emit (self, gcal_weather_service_signals[SIG_WEATHER_CHANGED], 0, gcinfos);
-  g_slist_free_full (gcinfos, g_object_unref);
+  g_signal_emit (self, gcal_weather_service_signals[SIG_WEATHER_CHANGED], 0);
 }
 
 
@@ -1189,7 +1195,8 @@ gcal_weather_service_get_time_zone (GcalWeatherService *self)
 
 
 
-/* gcal_weather_service_set_time_zone:
+/**
+ * gcal_weather_service_set_time_zone:
  * @self: The #GcalWeatherService instance.
  * @days: Number of days.
  *
@@ -1235,3 +1242,19 @@ gcal_weather_service_get_check_interval (GcalWeatherService *self)
 
   return self->check_interval;
 }
+
+
+
+/**
+ * gcal_weather_service_get_weather_infos:
+ * @self: The #GcalWeatherService instance.
+ *
+ * Returns: (transfer none): list of known weather reports.
+ */
+GSList*
+gcal_weather_service_get_weather_infos (GcalWeatherService *self)
+{
+  g_return_val_if_fail (GCAL_IS_WEATHER_SERVICE (self), NULL);
+
+  return self->weather_infos;
+}
diff --git a/src/gcal-weather-service.h b/src/gcal-weather-service.h
index 806cb224..0874e3eb 100644
--- a/src/gcal-weather-service.h
+++ b/src/gcal-weather-service.h
@@ -38,8 +38,8 @@ GcalWeatherService* gcal_weather_service_new                (GTimeZone
 
 GTimeZone*          gcal_weather_service_get_time_zone      (GcalWeatherService *self);
 
-void                gcal_weather_service_set_time_zone      (GcalWeatherService  *self,
-                                                             GTimeZone           *value);
+void                gcal_weather_service_set_time_zone      (GcalWeatherService *self,
+                                                             GTimeZone          *value);
 
 void                gcal_weather_service_run                (GcalWeatherService *self,
                                                              GWeatherLocation   *location);
@@ -50,6 +50,8 @@ guint               gcal_weather_service_get_max_days       (GcalWeatherService
 
 guint               gcal_weather_service_get_check_interval (GcalWeatherService *self);
 
+GSList*             gcal_weather_service_get_weather_infos  (GcalWeatherService *self);
+
 
 G_END_DECLS
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]