summaryrefslogtreecommitdiff
path: root/plugins/icera/mm-broadband-bearer-icera.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/icera/mm-broadband-bearer-icera.c')
-rw-r--r--plugins/icera/mm-broadband-bearer-icera.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/plugins/icera/mm-broadband-bearer-icera.c b/plugins/icera/mm-broadband-bearer-icera.c
index 7dce6859..589bdc4e 100644
--- a/plugins/icera/mm-broadband-bearer-icera.c
+++ b/plugins/icera/mm-broadband-bearer-icera.c
@@ -50,6 +50,7 @@ struct _MMBroadbandBearerIceraPrivate {
gpointer connect_pending;
guint connect_pending_id;
gulong connect_cancellable_id;
+ gulong connect_port_closed_id;
/* Disconnection related */
gpointer disconnect_pending;
@@ -624,6 +625,12 @@ connect_timed_out_cb (MMBroadbandBearerIcera *self)
self->priv->connect_cancellable_id = 0;
}
+ /* Remove closed port watch, if found */
+ if (ctx && 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;
+ }
+
/* Cleanup timeout ID */
self->priv->connect_pending_id = 0;
@@ -665,6 +672,16 @@ connect_cancelled_cb (GCancellable *cancellable,
}
static void
+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);
+}
+
+static void
ier_query_ready (MMBaseModem *modem,
GAsyncResult *res,
Dial3gppContext *ctx)
@@ -708,7 +725,7 @@ report_connect_status (MMBroadbandBearerIcera *self,
ctx = self->priv->connect_pending;
self->priv->connect_pending = NULL;
- /* Cleanup cancellable and timeout, if any */
+ /* Cleanup cancellable, timeout and port closed watch, if any */
if (self->priv->connect_pending_id) {
g_source_remove (self->priv->connect_pending_id);
self->priv->connect_pending_id = 0;
@@ -720,6 +737,11 @@ report_connect_status (MMBroadbandBearerIcera *self,
self->priv->connect_cancellable_id = 0;
}
+ if (ctx && 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;
@@ -845,6 +867,12 @@ activate_ready (MMBaseModem *modem,
G_CALLBACK (connect_cancelled_cb),
self,
NULL);
+
+ /* If we get the port closed, we treat as a connect error */
+ self->priv->connect_port_closed_id = g_signal_connect (ctx->primary,
+ "forced-close",
+ G_CALLBACK (forced_close_cb),
+ self);
}
static void