aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2011-12-20 10:45:54 +0100
committerAleksander Morgado <aleksander@lanedo.com>2012-03-15 14:14:35 +0100
commite71a9ef971119e342afffaa9867f6011f9e9ce5a (patch)
tree2386f2392dd922d3ee8fc47a20445a483520cd0b
parentdd2006797565dce831d5e9fd891ac1bd75fa0a75 (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.c61
-rw-r--r--src/mm-iface-modem.c72
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