[PATCH 2/3] time: Poll for timezone
- From: Thomas Tuttle <ttuttle chromium org>
- To: networkmanager-list gnome org
- Subject: [PATCH 2/3] time: Poll for timezone
- Date: Fri, 27 Jan 2012 13:24:13 -0500
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(-)
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 */
--
1.7.7.3
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]