weather: Prepare global time zone support.

This patch allows to change time-zones for
weather reports.
This commit is contained in:
Florian Brosch
2017-12-11 21:23:19 -02:00
committed by Georges Basile Stavracas Neto
parent 13342ac82e
commit 8d85af0960
2 changed files with 83 additions and 3 deletions
+81 -2
View File
@@ -29,6 +29,7 @@ G_BEGIN_DECLS
/* GcalWeatherService:
*
* @time_zone: The current time zone
* @check_interval: Amount of seconds to wait before re-fetching weather infos.
* @timeout_id: Time-out event ID or %0. Timer is used to periodically update weather infos.
* @location_service: Used to monitor location changes.
@@ -56,6 +57,7 @@ struct _GcalWeatherService
/* <public> */
/* <private> */
GTimeZone *time_zone; /* owned, nullable */
/* timer: */
guint check_interval;
@@ -78,6 +80,7 @@ enum
{
PROP_0,
PROP_MAX_DAYS,
PROP_TIME_ZONE,
PROP_CHECK_INTERVAL,
PROP_NUM,
};
@@ -160,6 +163,12 @@ gcal_weather_service_finalize (GObject *object)
self = (GcalWeatherService *) object;
if (self->time_zone != NULL)
{
g_time_zone_unref (self->time_zone);
self->time_zone = NULL;
}
if (self->location_service != NULL)
g_clear_object (&self->location_service);
@@ -188,6 +197,9 @@ gcal_weather_service_get_property (GObject *object,
case PROP_MAX_DAYS:
g_value_set_uint (value, gcal_weather_service_get_max_days (self));
break;
case PROP_TIME_ZONE:
g_value_set_pointer (value, gcal_weather_service_get_time_zone (self));
break;
case PROP_CHECK_INTERVAL:
g_value_set_uint (value, gcal_weather_service_get_check_interval (self));
break;
@@ -213,6 +225,9 @@ gcal_weather_service_set_property (GObject *object,
case PROP_MAX_DAYS:
gcal_weather_service_set_max_days (self, g_value_get_uint (value));
break;
case PROP_TIME_ZONE:
gcal_weather_service_set_time_zone (self, g_value_get_pointer (value));
break;
case PROP_CHECK_INTERVAL:
gcal_weather_service_set_check_interval (self, g_value_get_uint (value));
break;
@@ -246,6 +261,17 @@ gcal_weather_service_class_init (GcalWeatherServiceClass *klass)
1, G_MAXUINT, 3,
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
/**
* GcalWeatherServiceClass:time-zone:
*
* The time zone to use.
*/
g_object_class_install_property
(G_OBJECT_CLASS (klass),
PROP_TIME_ZONE,
g_param_spec_pointer ("time-zone", "time-zone", "time-zone",
G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE));
/**
* GcalWeatherServiceClass:check-interval:
*
@@ -285,6 +311,7 @@ gcal_weather_service_class_init (GcalWeatherServiceClass *klass)
static void
gcal_weather_service_init (GcalWeatherService *self)
{
self->time_zone = NULL;
self->check_interval = 0;
self->timeout_id = 0;
self->location_cancellable = g_cancellable_new ();
@@ -323,7 +350,9 @@ get_time_day_start (GcalWeatherService *self,
g_return_val_if_fail (ret_date != NULL, FALSE);
g_return_val_if_fail (ret_unix != NULL, FALSE);
now = g_date_time_new_now_local ();
now = (self->time_zone == NULL)
? g_date_time_new_now_local ()
: g_date_time_new_now (self->time_zone);
day = g_date_time_add_full (now,
0, /* years */
0, /* months */
@@ -941,10 +970,12 @@ on_timer_timeout (GcalWeatherService *self)
* Returns: (transfer full): A newly created #GcalWeatherService.
*/
GcalWeatherService *
gcal_weather_service_new (guint max_days,
gcal_weather_service_new (GTimeZone *time_zone,
guint max_days,
guint check_interval)
{
return g_object_new (GCAL_TYPE_WEATHER_SERVICE,
"time-zone", time_zone,
"max-days", max_days,
"check-interval", check_interval,
NULL);
@@ -1054,6 +1085,54 @@ gcal_weather_service_get_max_days (GcalWeatherService *self)
/**
* gcal_weather_service_get_time_zone:
* @self: The #GcalWeatherService instance.
*
* Getter for #GcalWeatherService:time-zone.
*/
GTimeZone*
gcal_weather_service_get_time_zone (GcalWeatherService *self)
{
g_return_val_if_fail (self != NULL, NULL);
return self->time_zone;
}
/* gcal_weather_service_set_time_zone:
* @self: The #GcalWeatherService instance.
* @days: Number of days.
*
* Setter for #GcalWeatherInfos:time-zone.
*/
void
gcal_weather_service_set_time_zone (GcalWeatherService *self,
GTimeZone *value)
{
g_return_if_fail (self != NULL);
if (self->time_zone != value)
{
if (self->time_zone != NULL)
{
g_time_zone_unref (self->time_zone);
self->time_zone = NULL;
}
if (value != NULL)
self->time_zone = g_time_zone_ref (value);
/* make sure we provide correct weather infos */
gweather_info_update (self->weather_info);
g_object_notify ((GObject*) self, "time-zone");
}
}
/**
* gcal_weather_service_get_max_days:
* @self: The #GcalWeatherService instance.
+2 -1
View File
@@ -32,7 +32,8 @@ G_BEGIN_DECLS
G_DECLARE_FINAL_TYPE (GcalWeatherService, gcal_weather_service, GCAL, WEATHER_SERVICE, GObject)
GcalWeatherService* gcal_weather_service_new (guint max_days,
GcalWeatherService* gcal_weather_service_new (GTimeZone *time_zone,
guint max_days,
guint check_interval);
GTimeZone* gcal_weather_service_get_time_zone (GcalWeatherService *self);