diff options
author | Guido Günther <agx@sigxcpu.org> | 2014-02-05 08:40:16 +0100 |
---|---|---|
committer | Guido Günther <agx@sigxcpu.org> | 2014-02-05 08:40:16 +0100 |
commit | fa2b467e288cb137ffd792becbf0c1e757d85be4 (patch) | |
tree | ce308eb0886e93805e7d88bccce48c93797fd6dd /plugins/icera | |
parent | afc4b839a31c530d73b91aa2483795f185eb7e52 (diff) |
New upstream version 1.2.0upstream/1.2.0upstream
Diffstat (limited to 'plugins/icera')
-rw-r--r-- | plugins/icera/mm-broadband-bearer-icera.c | 154 | ||||
-rw-r--r-- | plugins/icera/mm-broadband-bearer-icera.h | 10 | ||||
-rw-r--r-- | plugins/icera/mm-broadband-modem-icera.c | 15 |
3 files changed, 76 insertions, 103 deletions
diff --git a/plugins/icera/mm-broadband-bearer-icera.c b/plugins/icera/mm-broadband-bearer-icera.c index b7ea8df..48a2a79 100644 --- a/plugins/icera/mm-broadband-bearer-icera.c +++ b/plugins/icera/mm-broadband-bearer-icera.c @@ -32,6 +32,7 @@ #include "mm-log.h" #include "mm-modem-helpers.h" #include "mm-error-helpers.h" +#include "mm-daemon-enums-types.h" G_DEFINE_TYPE (MMBroadbandBearerIcera, mm_broadband_bearer_icera, MM_TYPE_BROADBAND_BEARER); @@ -360,13 +361,14 @@ disconnect_3gpp_timed_out_cb (MMBroadbandBearerIcera *self) static void report_disconnect_status (MMBroadbandBearerIcera *self, - MMBroadbandBearerIceraConnectionStatus status) + MMBearerConnectionStatus status) { Disconnect3gppContext *ctx; /* Recover context */ ctx = self->priv->disconnect_pending; self->priv->disconnect_pending = NULL; + g_assert (ctx != NULL); /* Cleanup timeout, if any */ if (self->priv->disconnect_pending_id) { @@ -374,42 +376,26 @@ report_disconnect_status (MMBroadbandBearerIcera *self, self->priv->disconnect_pending_id = 0; } - switch (status) { - case MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_UNKNOWN: - g_warn_if_reached (); - break; - - case MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_CONNECTED: - if (!ctx) - break; - + /* Received 'CONNECTED' during a disconnection attempt? */ + if (status == MM_BEARER_CONNECTION_STATUS_CONNECTED) { g_simple_async_result_set_error (ctx->result, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, "Disconnection failed"); disconnect_3gpp_context_complete_and_free (ctx); return; + } - case MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_CONNECTION_FAILED: - if (!ctx) - break; - - /* Well, this actually means disconnection, right? */ - g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE); - disconnect_3gpp_context_complete_and_free (ctx); - return; - - case MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_DISCONNECTED: - if (!ctx) { - mm_dbg ("Received spontaneous %%IPDPACT disconnect"); - mm_bearer_report_disconnection (MM_BEARER (self)); - break; - } - + /* Received 'DISCONNECTED' during a disconnection attempt? */ + if (status == MM_BEARER_CONNECTION_STATUS_DISCONNECTED || + status == MM_BEARER_CONNECTION_STATUS_CONNECTION_FAILED) { g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE); disconnect_3gpp_context_complete_and_free (ctx); return; } + + /* No other status is expected by this implementation */ + g_assert_not_reached (); } static void @@ -658,9 +644,8 @@ forced_close_cb (MMSerialPort *port, MMBroadbandBearerIcera *self) { /* Just treat the forced close event as any other unsolicited message */ - mm_broadband_bearer_icera_report_connection_status ( - self, - MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_CONNECTION_FAILED); + mm_bearer_report_connection_status (MM_BEARER (self), + MM_BEARER_CONNECTION_STATUS_CONNECTION_FAILED); } static void @@ -699,13 +684,18 @@ ier_query_ready (MMBaseModem *modem, static void report_connect_status (MMBroadbandBearerIcera *self, - MMBroadbandBearerIceraConnectionStatus status) + MMBearerConnectionStatus status) { Dial3gppContext *ctx; + g_assert (status == MM_BEARER_CONNECTION_STATUS_CONNECTED || + status == MM_BEARER_CONNECTION_STATUS_CONNECTION_FAILED || + status == MM_BEARER_CONNECTION_STATUS_DISCONNECTED); + /* Recover context and remove it from the private info */ ctx = self->priv->connect_pending; self->priv->connect_pending = NULL; + g_assert (ctx != NULL); /* Cleanup cancellable, timeout and port closed watch, if any */ if (self->priv->connect_pending_id) { @@ -713,29 +703,19 @@ report_connect_status (MMBroadbandBearerIcera *self, self->priv->connect_pending_id = 0; } - if (ctx && self->priv->connect_cancellable_id) { + if (self->priv->connect_cancellable_id) { g_cancellable_disconnect (ctx->cancellable, self->priv->connect_cancellable_id); self->priv->connect_cancellable_id = 0; } - if (ctx && self->priv->connect_port_closed_id) { + if (self->priv->connect_port_closed_id) { g_signal_handler_disconnect (ctx->primary, self->priv->connect_port_closed_id); self->priv->connect_port_closed_id = 0; } - switch (status) { - case MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_UNKNOWN: - break; - - case MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_CONNECTED: - if (!ctx) - /* We may get this if the timeout for the connection attempt is - * reached before the unsolicited response. We should probably - * keep the CID around to request explicit disconnection in this - * case. */ - break; - + /* Received 'CONNECTED' during a connection attempt? */ + if (status == MM_BEARER_CONNECTION_STATUS_CONNECTED) { /* If we wanted to get cancelled before, do it now */ if (ctx->saved_error) { /* Keep error */ @@ -751,20 +731,19 @@ report_connect_status (MMBroadbandBearerIcera *self, (GDestroyNotify)g_object_unref); dial_3gpp_context_complete_and_free (ctx); return; + } - case MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_CONNECTION_FAILED: - if (!ctx) - break; - - /* If we wanted to get cancelled before and now we couldn't connect, - * use the cancelled error and return */ - if (ctx->saved_error) { - g_simple_async_result_take_error (ctx->result, ctx->saved_error); - ctx->saved_error = NULL; - dial_3gpp_context_complete_and_free (ctx); - return; - } + /* If we wanted to get cancelled before and now we couldn't connect, + * use the cancelled error and return */ + if (ctx->saved_error) { + g_simple_async_result_take_error (ctx->result, ctx->saved_error); + ctx->saved_error = NULL; + dial_3gpp_context_complete_and_free (ctx); + return; + } + /* Received CONNECTION_FAILED during a connection attempt? */ + if (status == MM_BEARER_CONNECTION_STATUS_CONNECTION_FAILED) { /* Try to gather additional info about the connection failure */ mm_base_modem_at_command_full ( ctx->modem, @@ -777,32 +756,14 @@ report_connect_status (MMBroadbandBearerIcera *self, (GAsyncReadyCallback)ier_query_ready, ctx); return; - - case MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_DISCONNECTED: - if (ctx) { - /* If we wanted to get cancelled before and now we couldn't connect, - * use the cancelled error and return */ - if (ctx->saved_error) { - g_simple_async_result_take_error (ctx->result, ctx->saved_error); - ctx->saved_error = NULL; - dial_3gpp_context_complete_and_free (ctx); - return; - } - - g_simple_async_result_set_error (ctx->result, - MM_CORE_ERROR, - MM_CORE_ERROR_FAILED, - "Call setup failed"); - dial_3gpp_context_complete_and_free (ctx); - return; - } - - /* Just ensure we mark ourselves as being disconnected... */ - mm_bearer_report_disconnection (MM_BEARER (self)); - return; } - g_warn_if_reached (); + /* Otherwise, received 'DISCONNECTED' during a connection attempt? */ + g_simple_async_result_set_error (ctx->result, + MM_CORE_ERROR, + MM_CORE_ERROR_FAILED, + "Call setup failed"); + dial_3gpp_context_complete_and_free (ctx); } static void @@ -1060,15 +1021,36 @@ dial_3gpp (MMBroadbandBearer *self, /*****************************************************************************/ -void -mm_broadband_bearer_icera_report_connection_status (MMBroadbandBearerIcera *self, - MMBroadbandBearerIceraConnectionStatus status) +static void +report_connection_status (MMBearer *bearer, + MMBearerConnectionStatus status) { - if (self->priv->connect_pending) + MMBroadbandBearerIcera *self = MM_BROADBAND_BEARER_ICERA (bearer); + + /* Process pending connection attempt */ + if (self->priv->connect_pending) { report_connect_status (self, status); + return; + } - if (self->priv->disconnect_pending) + /* Process pending disconnection attempt */ + if (self->priv->disconnect_pending) { report_disconnect_status (self, status); + return; + } + + mm_dbg ("Received spontaneous %%IPDPACT (%s)", + mm_bearer_connection_status_get_string (status)); + + /* Received a random 'DISCONNECTED'...*/ + if (status == MM_BEARER_CONNECTION_STATUS_DISCONNECTED || + status == MM_BEARER_CONNECTION_STATUS_CONNECTION_FAILED) { + /* If no connection/disconnection attempt on-going, make sure we mark ourselves as + * disconnected. Make sure we only pass 'DISCONNECTED' to the parent */ + MM_BEARER_CLASS (mm_broadband_bearer_icera_parent_class)->report_connection_status ( + bearer, + MM_BEARER_CONNECTION_STATUS_DISCONNECTED); + } } /*****************************************************************************/ @@ -1165,12 +1147,14 @@ static void mm_broadband_bearer_icera_class_init (MMBroadbandBearerIceraClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); + MMBearerClass *bearer_class = MM_BEARER_CLASS (klass); MMBroadbandBearerClass *broadband_bearer_class = MM_BROADBAND_BEARER_CLASS (klass); g_type_class_add_private (object_class, sizeof (MMBroadbandBearerIceraPrivate)); object_class->get_property = get_property; object_class->set_property = set_property; + bearer_class->report_connection_status = report_connection_status; broadband_bearer_class->dial_3gpp = dial_3gpp; broadband_bearer_class->dial_3gpp_finish = dial_3gpp_finish; broadband_bearer_class->get_ip_config_3gpp = get_ip_config_3gpp; diff --git a/plugins/icera/mm-broadband-bearer-icera.h b/plugins/icera/mm-broadband-bearer-icera.h index 4edd189..f513659 100644 --- a/plugins/icera/mm-broadband-bearer-icera.h +++ b/plugins/icera/mm-broadband-bearer-icera.h @@ -36,13 +36,6 @@ #define MM_BROADBAND_BEARER_ICERA_DEFAULT_IP_METHOD "broadband-bearer-icera-default-ip-method" -typedef enum { - MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_UNKNOWN, - MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_CONNECTED, - MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_CONNECTION_FAILED, - MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_DISCONNECTED -} MMBroadbandBearerIceraConnectionStatus; - typedef struct _MMBroadbandBearerIcera MMBroadbandBearerIcera; typedef struct _MMBroadbandBearerIceraClass MMBroadbandBearerIceraClass; typedef struct _MMBroadbandBearerIceraPrivate MMBroadbandBearerIceraPrivate; @@ -68,7 +61,4 @@ void mm_broadband_bearer_icera_new (MMBroadbandModem *modem, MMBearer *mm_broadband_bearer_icera_new_finish (GAsyncResult *res, GError **error); -void mm_broadband_bearer_icera_report_connection_status (MMBroadbandBearerIcera *self, - MMBroadbandBearerIceraConnectionStatus status); - #endif /* MM_BROADBAND_BEARER_ICERA_H */ diff --git a/plugins/icera/mm-broadband-modem-icera.c b/plugins/icera/mm-broadband-modem-icera.c index b84cd12..bf3d18b 100644 --- a/plugins/icera/mm-broadband-modem-icera.c +++ b/plugins/icera/mm-broadband-modem-icera.c @@ -397,7 +397,7 @@ modem_set_current_modes (MMIfaceModem *self, typedef struct { guint cid; - MMBroadbandBearerIceraConnectionStatus status; + MMBearerConnectionStatus status; } BearerListReportStatusForeachContext; static void @@ -410,8 +410,7 @@ bearer_list_report_status_foreach (MMBearer *bearer, if (!MM_IS_BROADBAND_BEARER_ICERA (bearer)) return; - mm_broadband_bearer_icera_report_connection_status (MM_BROADBAND_BEARER_ICERA (bearer), - ctx->status); + mm_bearer_report_connection_status (bearer, ctx->status); } static void @@ -431,20 +430,20 @@ ipdpact_received (MMAtSerialPort *port, /* Setup context */ ctx.cid = cid; - ctx.status = MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_UNKNOWN; + ctx.status = MM_BEARER_CONNECTION_STATUS_UNKNOWN; switch (status) { case 0: - ctx.status = MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_DISCONNECTED; + ctx.status = MM_BEARER_CONNECTION_STATUS_DISCONNECTED; break; case 1: - ctx.status = MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_CONNECTED; + ctx.status = MM_BEARER_CONNECTION_STATUS_CONNECTED; break; case 2: /* activating */ break; case 3: - ctx.status = MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_CONNECTION_FAILED; + ctx.status = MM_BEARER_CONNECTION_STATUS_CONNECTION_FAILED; break; default: mm_warn ("Unknown Icera connect status %d", status); @@ -452,7 +451,7 @@ ipdpact_received (MMAtSerialPort *port, } /* If unknown status, don't try to report anything */ - if (ctx.status == MM_BROADBAND_BEARER_ICERA_CONNECTION_STATUS_UNKNOWN) + if (ctx.status == MM_BEARER_CONNECTION_STATUS_UNKNOWN) return; /* If empty bearer list, nothing else to do */ |