diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2011-12-20 10:45:54 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-03-15 14:14:35 +0100 |
commit | e71a9ef971119e342afffaa9867f6011f9e9ce5a (patch) | |
tree | 2386f2392dd922d3ee8fc47a20445a483520cd0b | |
parent | dd2006797565dce831d5e9fd891ac1bd75fa0a75 (diff) |
iface-modem: handle connection related states
Moved from broadband-modem. All this logic is really common not specific to the
generic implementation.
-rw-r--r-- | src/mm-broadband-modem.c | 61 | ||||
-rw-r--r-- | src/mm-iface-modem.c | 72 |
2 files changed, 70 insertions, 63 deletions
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c index 90d99333..6a5cf342 100644 --- a/src/mm-broadband-modem.c +++ b/src/mm-broadband-modem.c @@ -83,61 +83,6 @@ struct _MMBroadbandModemPrivate { /*****************************************************************************/ /* CREATE BEARER */ -typedef struct { - MMBearer *self; - guint others_connected; -} CountConnectedContext; - -static void -bearer_list_count_connected (MMBearer *bearer, - CountConnectedContext *ctx) -{ - /* We can safely compare pointers here */ - if (bearer != ctx->self && - mm_bearer_get_status (bearer) == MM_BEARER_STATUS_CONNECTED) { - ctx->others_connected++; - } -} - -static void -bearer_status_changed (MMBearer *bearer, - GParamSpec *pspec, - MMBroadbandModem *self) -{ - CountConnectedContext ctx; - MMModemState new_state; - - ctx.self = bearer; - ctx.others_connected = 0; - - /* We now count how many *other* bearers are connected */ - mm_bearer_list_foreach (self->priv->modem_bearer_list, - (MMBearerListForeachFunc)bearer_list_count_connected, - &ctx); - - /* If no other bearers are connected, change modem state */ - if (!ctx.others_connected) { - switch (mm_bearer_get_status (bearer)) { - case MM_BEARER_STATUS_CONNECTED: - new_state = MM_MODEM_STATE_CONNECTED; - break; - case MM_BEARER_STATUS_CONNECTING: - new_state = MM_MODEM_STATE_CONNECTING; - break; - case MM_BEARER_STATUS_DISCONNECTING: - new_state = MM_MODEM_STATE_DISCONNECTING; - break; - case MM_BEARER_STATUS_DISCONNECTED: - new_state = MM_MODEM_STATE_REGISTERED; - break; - } - - mm_iface_modem_update_state (MM_IFACE_MODEM (self), - new_state, - MM_MODEM_STATE_CHANGE_REASON_USER_REQUESTED); - } -} - static MMModem3gppRegistrationState get_consolidated_reg_state (MMBroadbandModem *self); static MMBearer * @@ -193,12 +138,6 @@ modem_create_bearer (MMIfaceModem *self, mm_bearer_set_connection_allowed (bearer); else mm_bearer_set_connection_forbidden (bearer); - - /* We want to get reported about bearer status changes */ - g_signal_connect (bearer, - "notify::bearer-status", - (GCallback)bearer_status_changed, - self); } /* Set a new ref to the bearer object as result */ diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c index f6d7d17a..0c93370b 100644 --- a/src/mm-iface-modem.c +++ b/src/mm-iface-modem.c @@ -63,6 +63,66 @@ dbus_call_context_new (MmGdbusModem *skeleton, /*****************************************************************************/ +typedef struct { + MMBearer *self; + guint others_connected; +} CountOthersConnectedContext; + +static void +bearer_list_count_others_connected (MMBearer *bearer, + CountOthersConnectedContext *ctx) +{ + /* We can safely compare pointers here */ + if (bearer != ctx->self && + mm_bearer_get_status (bearer) == MM_BEARER_STATUS_CONNECTED) { + ctx->others_connected++; + } +} + +static void +bearer_status_changed (MMBearer *bearer, + GParamSpec *pspec, + MMIfaceModem *self) +{ + CountOthersConnectedContext ctx; + MMModemState new_state; + MMBearerList *list = NULL; + + g_object_get (self, + MM_IFACE_MODEM_BEARER_LIST, &list, + NULL); + + ctx.self = bearer; + ctx.others_connected = 0; + + /* We now count how many *other* bearers are connected */ + mm_bearer_list_foreach (list, + (MMBearerListForeachFunc)bearer_list_count_others_connected, + &ctx); + + /* If no other bearers are connected, change modem state */ + if (!ctx.others_connected) { + switch (mm_bearer_get_status (bearer)) { + case MM_BEARER_STATUS_CONNECTED: + new_state = MM_MODEM_STATE_CONNECTED; + break; + case MM_BEARER_STATUS_CONNECTING: + new_state = MM_MODEM_STATE_CONNECTING; + break; + case MM_BEARER_STATUS_DISCONNECTING: + new_state = MM_MODEM_STATE_DISCONNECTING; + break; + case MM_BEARER_STATUS_DISCONNECTED: + new_state = MM_MODEM_STATE_REGISTERED; + break; + } + + mm_iface_modem_update_state (self, + new_state, + MM_MODEM_STATE_CHANGE_REASON_USER_REQUESTED); + } +} + static void handle_create_bearer_ready (MMIfaceModem *self, GAsyncResult *res, @@ -85,10 +145,18 @@ handle_create_bearer_ready (MMIfaceModem *self, if (!mm_bearer_list_add_bearer (list, bearer, &error)) g_dbus_method_invocation_take_error (ctx->invocation, error); - else + else { + /* If bearer properly created and added to the list, follow its + * status */ + g_signal_connect (bearer, + "notify::" MM_BEARER_STATUS, + (GCallback)bearer_status_changed, + self); + mm_gdbus_modem_complete_create_bearer (ctx->skeleton, ctx->invocation, mm_bearer_get_path (bearer)); + } g_object_unref (bearer); } dbus_call_context_free (ctx); @@ -182,7 +250,7 @@ bearer_list_count_connected (MMBearer *bearer, guint *count) { if (mm_bearer_get_status (bearer) == MM_BEARER_STATUS_CONNECTED) - *count++; + (*count)++; } void |