weather: Update on 00:00
This commit is contained in:
committed by
Georges Basile Stavracas Neto
parent
24d9e0c390
commit
1a98df6524
@@ -47,6 +47,7 @@ typedef struct
|
|||||||
* @check_interval_new: Amount of seconds to wait before fetching weather infos.
|
* @check_interval_new: Amount of seconds to wait before fetching weather infos.
|
||||||
* @check_interval_renew: Amount of seconds to wait before re-fetching weather information.
|
* @check_interval_renew: Amount of seconds to wait before re-fetching weather information.
|
||||||
* @duration_timer Timer used to request weather report updates.
|
* @duration_timer Timer used to request weather report updates.
|
||||||
|
* @midnight_timer Timer used to update weather reports at midnight.
|
||||||
* @network_changed_sid "network-changed" signal ID.
|
* @network_changed_sid "network-changed" signal ID.
|
||||||
* @location_service: Used to monitor location changes.
|
* @location_service: Used to monitor location changes.
|
||||||
* Initialized by gcal_weather_service_run(),
|
* Initialized by gcal_weather_service_run(),
|
||||||
@@ -82,6 +83,7 @@ struct _GcalWeatherService
|
|||||||
guint check_interval_new;
|
guint check_interval_new;
|
||||||
guint check_interval_renew;
|
guint check_interval_renew;
|
||||||
GcalTimer *duration_timer;
|
GcalTimer *duration_timer;
|
||||||
|
GcalTimer *midnight_timer;
|
||||||
|
|
||||||
/* network monitoring */
|
/* network monitoring */
|
||||||
gulong network_changed_sid;
|
gulong network_changed_sid;
|
||||||
@@ -128,6 +130,8 @@ G_DEFINE_TYPE (GcalWeatherService, gcal_weather_service, G_TYPE_OBJECT)
|
|||||||
/* Timer Helpers: */
|
/* Timer Helpers: */
|
||||||
static void update_timeout_interval (GcalWeatherService *self);
|
static void update_timeout_interval (GcalWeatherService *self);
|
||||||
|
|
||||||
|
static void schedule_midnight (GcalWeatherService *self);
|
||||||
|
|
||||||
static void start_timer (GcalWeatherService *self);
|
static void start_timer (GcalWeatherService *self);
|
||||||
|
|
||||||
static void stop_timer (GcalWeatherService *self);
|
static void stop_timer (GcalWeatherService *self);
|
||||||
@@ -192,6 +196,9 @@ static gint get_icon_name_sortkey (const gchar
|
|||||||
static void on_duration_timer_timeout (GcalTimer *timer,
|
static void on_duration_timer_timeout (GcalTimer *timer,
|
||||||
GcalWeatherService *self);
|
GcalWeatherService *self);
|
||||||
|
|
||||||
|
static void on_midnight_timer_timeout (GcalTimer *timer,
|
||||||
|
GcalWeatherService *self);
|
||||||
|
|
||||||
static gboolean get_time_day_start (GcalWeatherService *self,
|
static gboolean get_time_day_start (GcalWeatherService *self,
|
||||||
GDate *ret_date,
|
GDate *ret_date,
|
||||||
gint64 *ret_unix,
|
gint64 *ret_unix,
|
||||||
@@ -226,6 +233,9 @@ gcal_weather_service_finalize (GObject *object)
|
|||||||
gcal_timer_free (self->duration_timer);
|
gcal_timer_free (self->duration_timer);
|
||||||
self->duration_timer = NULL;
|
self->duration_timer = NULL;
|
||||||
|
|
||||||
|
gcal_timer_free (self->midnight_timer);
|
||||||
|
self->midnight_timer = NULL;
|
||||||
|
|
||||||
if (self->time_zone != NULL)
|
if (self->time_zone != NULL)
|
||||||
{
|
{
|
||||||
g_time_zone_unref (self->time_zone);
|
g_time_zone_unref (self->time_zone);
|
||||||
@@ -426,6 +436,8 @@ gcal_weather_service_init (GcalWeatherService *self)
|
|||||||
|
|
||||||
self->duration_timer = gcal_timer_new (GCAL_WEATHER_CHECK_INTERVAL_NEW_DFLT);
|
self->duration_timer = gcal_timer_new (GCAL_WEATHER_CHECK_INTERVAL_NEW_DFLT);
|
||||||
gcal_timer_set_callback (self->duration_timer, (GCalTimerFunc) on_duration_timer_timeout, self, NULL);
|
gcal_timer_set_callback (self->duration_timer, (GCalTimerFunc) on_duration_timer_timeout, self, NULL);
|
||||||
|
self->midnight_timer = gcal_timer_new (24*60*60);
|
||||||
|
gcal_timer_set_callback (self->midnight_timer, (GCalTimerFunc) on_midnight_timer_timeout, self, NULL);
|
||||||
self->time_zone = NULL;
|
self->time_zone = NULL;
|
||||||
self->check_interval_new = GCAL_WEATHER_CHECK_INTERVAL_NEW_DFLT;
|
self->check_interval_new = GCAL_WEATHER_CHECK_INTERVAL_NEW_DFLT;
|
||||||
self->check_interval_renew = GCAL_WEATHER_CHECK_INTERVAL_RENEW_DFLT;
|
self->check_interval_renew = GCAL_WEATHER_CHECK_INTERVAL_RENEW_DFLT;
|
||||||
@@ -1305,6 +1317,12 @@ on_gweather_update (GWeatherInfo *info,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* update_timeout_interval:
|
||||||
|
* @self: The #GcalWeatherService instance.
|
||||||
|
*
|
||||||
|
* Selects the right duration timer timeout based
|
||||||
|
* on locally-stored weather information.
|
||||||
|
*/
|
||||||
static void
|
static void
|
||||||
update_timeout_interval (GcalWeatherService *self)
|
update_timeout_interval (GcalWeatherService *self)
|
||||||
{
|
{
|
||||||
@@ -1322,6 +1340,46 @@ update_timeout_interval (GcalWeatherService *self)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* schedule_midnight:
|
||||||
|
* @self: The #GcalWeatherService instance.
|
||||||
|
*
|
||||||
|
* Sets the midnight timer timeout to midnight.
|
||||||
|
* The timer needs to be reset when it
|
||||||
|
* emits.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
schedule_midnight (GcalWeatherService *self)
|
||||||
|
{
|
||||||
|
g_autoptr (GTimeZone) zone = NULL;
|
||||||
|
g_autoptr (GDateTime) now = NULL;
|
||||||
|
g_autoptr (GDateTime) tom = NULL;
|
||||||
|
g_autoptr (GDateTime) mid = NULL;
|
||||||
|
gint64 real_now;
|
||||||
|
gint64 real_mid;
|
||||||
|
|
||||||
|
g_return_if_fail (GCAL_IS_WEATHER_SERVICE (self));
|
||||||
|
|
||||||
|
zone = (self->time_zone == NULL)
|
||||||
|
? g_time_zone_new_local ()
|
||||||
|
: g_time_zone_ref (self->time_zone);
|
||||||
|
|
||||||
|
now = g_date_time_new_now (zone);
|
||||||
|
tom = g_date_time_add_days (now, 1);
|
||||||
|
mid = g_date_time_new (zone,
|
||||||
|
g_date_time_get_year (tom),
|
||||||
|
g_date_time_get_month (tom),
|
||||||
|
g_date_time_get_day_of_month (tom),
|
||||||
|
0, 0, 0);
|
||||||
|
|
||||||
|
real_mid = g_date_time_to_unix (mid);
|
||||||
|
real_now = g_date_time_to_unix (now);
|
||||||
|
|
||||||
|
gcal_timer_set_default_duration (self->midnight_timer,
|
||||||
|
real_mid - real_now);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* start_timer:
|
/* start_timer:
|
||||||
* @self: The #GcalWeatherService instance.
|
* @self: The #GcalWeatherService instance.
|
||||||
*
|
*
|
||||||
@@ -1339,6 +1397,9 @@ start_timer (GcalWeatherService *self)
|
|||||||
{
|
{
|
||||||
update_timeout_interval (self);
|
update_timeout_interval (self);
|
||||||
gcal_timer_start (self->duration_timer);
|
gcal_timer_start (self->duration_timer);
|
||||||
|
|
||||||
|
schedule_midnight (self);
|
||||||
|
gcal_timer_start (self->duration_timer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1355,6 +1416,7 @@ stop_timer (GcalWeatherService *self)
|
|||||||
g_return_if_fail (GCAL_IS_WEATHER_SERVICE (self));
|
g_return_if_fail (GCAL_IS_WEATHER_SERVICE (self));
|
||||||
|
|
||||||
gcal_timer_stop (self->duration_timer);
|
gcal_timer_stop (self->duration_timer);
|
||||||
|
gcal_timer_stop (self->midnight_timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1437,7 +1499,6 @@ gcal_weather_service_set_check_interval_renew (GcalWeatherService *self,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* on_duration_timer_timeout
|
/* on_duration_timer_timeout
|
||||||
* @self: A #GcalWeatherService.
|
* @self: A #GcalWeatherService.
|
||||||
*
|
*
|
||||||
@@ -1456,6 +1517,29 @@ on_duration_timer_timeout (GcalTimer *timer,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* on_midnight_timer_timeout
|
||||||
|
* @self: A #GcalWeatherService.
|
||||||
|
*
|
||||||
|
* Handles scheduled weather report updates.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
on_midnight_timer_timeout (GcalTimer *timer,
|
||||||
|
GcalWeatherService *self)
|
||||||
|
{
|
||||||
|
g_return_if_fail (timer != NULL);
|
||||||
|
g_return_if_fail (GCAL_IS_WEATHER_SERVICE (self));
|
||||||
|
|
||||||
|
if (self->gweather_info != NULL)
|
||||||
|
gweather_info_update (self->gweather_info);
|
||||||
|
|
||||||
|
if (gcal_timer_is_running (self->duration_timer))
|
||||||
|
gcal_timer_reset (self->duration_timer);
|
||||||
|
|
||||||
|
schedule_midnight (self);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*************
|
/*************
|
||||||
* < public >
|
* < public >
|
||||||
*************/
|
*************/
|
||||||
@@ -1650,6 +1734,9 @@ gcal_weather_service_set_time_zone (GcalWeatherService *self,
|
|||||||
/* make sure we provide correct weather infos */
|
/* make sure we provide correct weather infos */
|
||||||
gweather_info_update (self->gweather_info);
|
gweather_info_update (self->gweather_info);
|
||||||
|
|
||||||
|
/* make sure midnight is timed correctly: */
|
||||||
|
schedule_midnight (self);
|
||||||
|
|
||||||
g_object_notify ((GObject*) self, "time-zone");
|
g_object_notify ((GObject*) self, "time-zone");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user