time: poll for timezone

Signed-off-by: Thomas Tuttle <ttuttle@chromium.org>
This commit is contained in:
Thomas Tuttle
2012-01-27 13:24:13 -05:00
committed by Dan Williams
parent 8121b8e319
commit 0e246fb61d
4 changed files with 114 additions and 0 deletions

View File

@@ -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);

View File

@@ -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);

View File

@@ -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)

View File

@@ -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 */