summaryrefslogtreecommitdiff
path: root/plugins/option/mm-broadband-bearer-hso.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/option/mm-broadband-bearer-hso.c')
-rw-r--r--plugins/option/mm-broadband-bearer-hso.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/plugins/option/mm-broadband-bearer-hso.c b/plugins/option/mm-broadband-bearer-hso.c
index 0db9dac8..06858818 100644
--- a/plugins/option/mm-broadband-bearer-hso.c
+++ b/plugins/option/mm-broadband-bearer-hso.c
@@ -40,6 +40,7 @@ struct _MMBroadbandBearerHsoPrivate {
gpointer connect_pending;
guint connect_pending_id;
gulong connect_cancellable_id;
+ gulong connect_port_closed_id;
};
/*****************************************************************************/
@@ -372,6 +373,11 @@ mm_broadband_bearer_hso_report_connection_status (MMBroadbandBearerHso *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_HSO_CONNECTION_STATUS_UNKNOWN:
break;
@@ -461,6 +467,12 @@ connect_timed_out_cb (MMBroadbandBearerHso *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;
@@ -505,6 +517,16 @@ connect_cancelled_cb (GCancellable *cancellable,
}
static void
+forced_close_cb (MMSerialPort *port,
+ MMBroadbandBearerHso *self)
+{
+ /* Just treat the forced close event as any other unsolicited message */
+ mm_broadband_bearer_hso_report_connection_status (
+ self,
+ MM_BROADBAND_BEARER_HSO_CONNECTION_STATUS_CONNECTION_FAILED);
+}
+
+static void
activate_ready (MMBaseModem *modem,
GAsyncResult *res,
MMBroadbandBearerHso *self)
@@ -546,6 +568,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 authenticate (Dial3gppContext *ctx);