Re: [PATCH 2/3] time: Poll for timezone
- From: Dan Williams <dcbw redhat com>
- To: Thomas Tuttle <ttuttle chromium org>
- Cc: networkmanager-list gnome org
- Subject: Re: [PATCH 2/3] time: Poll for timezone
- Date: Wed, 01 Feb 2012 16:05:55 -0600
On Fri, 2012-01-27 at 13:24 -0500, Thomas Tuttle wrote:
> Signed-off-by: Thomas Tuttle <ttuttle chromium org>
> ---
> src/mm-modem-base.c | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++
> src/mm-modem-base.h | 3 ++
> src/mm-modem-time.c | 15 +++++++++
> src/mm-modem-time.h | 8 +++++
> 4 files changed, 114 insertions(+), 0 deletions(-)
Pushed, thanks.
Dan
> diff --git a/src/mm-modem-base.c b/src/mm-modem-base.c
> index 6348621..08c098d 100644
> --- a/src/mm-modem-base.c
> +++ b/src/mm-modem-base.c
> @@ -80,6 +80,8 @@ typedef struct {
> GHashTable *ports;
>
> GHashTable *tz_data;
> + guint tz_poll_id;
> + guint tz_poll_count;
> } MMModemBasePrivate;
>
>
> @@ -503,6 +505,81 @@ value_destroy (gpointer data)
> g_slice_free (GValue, v);
> }
>
> +static void
> +timezone_poll_done (MMModem *modem, GError *error, gpointer user_data)
> +{
> + /* do nothing; modem will call mm_modem_base_set_network_timezone if
> + it has timezone data, and then we will stop nagging it. */
> +}
> +
> +static gboolean
> +timezone_poll_callback (gpointer data)
> +{
> + MMModemBase *self = (MMModemBase *) data;
> + MMModemBasePrivate *priv = MM_MODEM_BASE_GET_PRIVATE (self);
> + gboolean result;
> +
> + if (priv->tz_poll_count == 0)
> + goto stop_polling;
> +
> + priv->tz_poll_count--;
> + result = mm_modem_time_poll_network_timezone (MM_MODEM_TIME (self),
> + timezone_poll_done,
> + NULL);
> + if (!result)
> + goto stop_polling;
> +
> + return TRUE;
> +
> +stop_polling:
> + mm_modem_base_set_network_timezone (self, NULL, NULL, NULL);
> + priv->tz_poll_id = 0;
> + return FALSE;
> +}
> +
> +#define TIMEZONE_POLL_INTERVAL_SEC 5
> +#define TIMEZONE_POLL_RETRIES 6
> +
> +void
> +mm_modem_base_set_network_timezone_polling (MMModemBase *self,
> + gboolean should_poll)
> +{
> + MMModemBasePrivate *priv;
> +
> + g_return_if_fail (self != NULL);
> + g_return_if_fail (MM_IS_MODEM_BASE (self));
> +
> + priv = MM_MODEM_BASE_GET_PRIVATE (self);
> +
> + if (should_poll == !!priv->tz_poll_id)
> + return;
> +
> + if (should_poll) {
> + priv->tz_poll_count = TIMEZONE_POLL_RETRIES;
> + priv->tz_poll_id = g_timeout_add_seconds (TIMEZONE_POLL_INTERVAL_SEC,
> + timezone_poll_callback,
> + self);
> + } else {
> + g_source_remove (priv->tz_poll_id);
> + priv->tz_poll_id = 0;
> + }
> +}
> +
> +static void
> +modem_state_changed (MMModemBase *self, GParamSpec *pspec, gpointer user_data)
> +{
> + MMModemState state;
> + gboolean registered;
> +
> + state = mm_modem_get_state (MM_MODEM (self));
> + registered = (state >= MM_MODEM_STATE_REGISTERED);
> +
> + mm_modem_base_set_network_timezone_polling (self, registered);
> +
> + if (!registered)
> + mm_modem_base_set_network_timezone (self, NULL, NULL, NULL);
> +}
> +
> void
> mm_modem_base_set_network_timezone (MMModemBase *self, gint *offset,
> gint *dst_offset, gint *leap_seconds)
> @@ -530,6 +607,8 @@ mm_modem_base_set_network_timezone (MMModemBase *self, gint *offset,
> g_hash_table_remove (priv->tz_data, "leap_seconds");
>
> g_object_notify (G_OBJECT (self), MM_MODEM_TIME_NETWORK_TIMEZONE);
> +
> + mm_modem_base_set_network_timezone_polling (self, FALSE);
> }
>
> /*************************************************************************/
> @@ -752,6 +831,7 @@ mm_modem_base_init (MMModemBase *self)
>
> priv->ports = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
> priv->tz_data = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, value_destroy);
> + priv->tz_poll_id = 0;
>
> mm_properties_changed_signal_register_property (G_OBJECT (self),
> MM_MODEM_ENABLED,
> @@ -785,6 +865,11 @@ mm_modem_base_init (MMModemBase *self)
> MM_MODEM_TIME_NETWORK_TIMEZONE,
> NULL,
> MM_DBUS_INTERFACE_MODEM_TIME);
> +
> + g_signal_connect (self,
> + "notify::" MM_MODEM_STATE,
> + G_CALLBACK (modem_state_changed),
> + NULL);
> }
>
> static void
> @@ -959,6 +1044,9 @@ finalize (GObject *object)
>
> mm_auth_provider_cancel_for_owner (priv->authp, object);
>
> + if (priv->tz_poll_id)
> + g_source_remove (priv->tz_poll_id);
> +
> g_hash_table_destroy (priv->ports);
> g_hash_table_destroy (priv->tz_data);
> g_free (priv->driver);
> diff --git a/src/mm-modem-base.h b/src/mm-modem-base.h
> index a7b8afe..a386bd7 100644
> --- a/src/mm-modem-base.h
> +++ b/src/mm-modem-base.h
> @@ -81,6 +81,9 @@ void mm_modem_base_set_network_timezone (MMModemBase *self,
> gint *dst_offset,
> gint *leap_seconds);
>
> +void mm_modem_base_set_network_timezone_polling (MMModemBase *self,
> + gboolean should_poll);
> +
> const char *mm_modem_base_get_manf (MMModemBase *self);
> void mm_modem_base_set_manf (MMModemBase *self, const char *manf);
>
> diff --git a/src/mm-modem-time.c b/src/mm-modem-time.c
> index a1878c8..1bc5f27 100644
> --- a/src/mm-modem-time.c
> +++ b/src/mm-modem-time.c
> @@ -87,6 +87,21 @@ mm_modem_time_get_network_time (MMModemTime *self,
> async_get_call_not_supported (self, callback, user_data);
> }
>
> +gboolean
> +mm_modem_time_poll_network_timezone (MMModemTime *self,
> + MMModemFn callback,
> + gpointer user_data)
> +{
> + g_return_val_if_fail (MM_IS_MODEM_TIME (self), FALSE);
> + g_return_val_if_fail (callback != NULL, FALSE);
> +
> + if (MM_MODEM_TIME_GET_INTERFACE (self)->poll_network_timezone)
> + return MM_MODEM_TIME_GET_INTERFACE (self)->poll_network_timezone
> + (self, callback, user_data);
> + else
> + return FALSE;
> +}
> +
> static void
> impl_modem_time_get_network_time (MMModemTime *self,
> DBusGMethodInvocation *context)
> diff --git a/src/mm-modem-time.h b/src/mm-modem-time.h
> index 485e234..eb37520 100644
> --- a/src/mm-modem-time.h
> +++ b/src/mm-modem-time.h
> @@ -41,6 +41,10 @@ struct _MMModemTime {
> void (*get_network_time) (MMModemTime *self,
> MMModemTimeGetNetworkTimeFn callback,
> gpointer user_data);
> +
> + gboolean (*poll_network_timezone) (MMModemTime *self,
> + MMModemFn callback,
> + gpointer user_data);
> };
>
> GType mm_modem_time_get_type (void);
> @@ -49,4 +53,8 @@ void mm_modem_time_get_network_time (MMModemTime *self,
> MMModemTimeGetNetworkTimeFn callback,
> gpointer user_data);
>
> +gboolean mm_modem_time_poll_network_timezone (MMModemTime *self,
> + MMModemFn callback,
> + gpointer user_data);
> +
> #endif /* MM_MODEM_TIME_H */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]