diff options
-rw-r--r-- | plugins/icera/mm-broadband-bearer-icera.c | 30 | ||||
-rw-r--r-- | plugins/option/mm-broadband-bearer-hso.c | 28 | ||||
-rw-r--r-- | src/mm-serial-port.c | 13 | ||||
-rw-r--r-- | src/mm-serial-port.h | 1 |
4 files changed, 71 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 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); diff --git a/src/mm-serial-port.c b/src/mm-serial-port.c index 04cac88c..87f06e27 100644 --- a/src/mm-serial-port.c +++ b/src/mm-serial-port.c @@ -57,6 +57,7 @@ enum { enum { BUFFER_FULL, TIMED_OUT, + FORCED_CLOSE, LAST_SIGNAL }; @@ -1093,6 +1094,9 @@ mm_serial_port_close_force (MMSerialPort *self) /* Mark as having forced the close, so that we don't warn about incorrect * open counts */ priv->forced_close = TRUE; + + /* Notify about the forced close status */ + g_signal_emit (self, signals[FORCED_CLOSE], 0); } static void @@ -1670,4 +1674,13 @@ mm_serial_port_class_init (MMSerialPortClass *klass) NULL, NULL, g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); + + signals[FORCED_CLOSE] = + g_signal_new ("forced-close", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (MMSerialPortClass, forced_close), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); } diff --git a/src/mm-serial-port.h b/src/mm-serial-port.h index 77db3219..31cd5a78 100644 --- a/src/mm-serial-port.h +++ b/src/mm-serial-port.h @@ -100,6 +100,7 @@ struct _MMSerialPortClass { /* Signals */ void (*buffer_full) (MMSerialPort *port, const GByteArray *buffer); void (*timed_out) (MMSerialPort *port, guint n_consecutive_replies); + void (*forced_close) (MMSerialPort *port); }; GType mm_serial_port_get_type (void); |