diff options
-rw-r--r-- | plugins/fibocom/mm-broadband-modem-fibocom.c | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/plugins/fibocom/mm-broadband-modem-fibocom.c b/plugins/fibocom/mm-broadband-modem-fibocom.c index 41ab2eb8..9a819432 100644 --- a/plugins/fibocom/mm-broadband-modem-fibocom.c +++ b/plugins/fibocom/mm-broadband-modem-fibocom.c @@ -34,7 +34,8 @@ typedef enum { } FeatureSupport; struct _MMBroadbandModemFibocomPrivate { - FeatureSupport gtrndis_support; + FeatureSupport gtrndis_support; + GRegex *sim_ready_regex; }; /*****************************************************************************/ @@ -188,6 +189,31 @@ modem_reset (MMIfaceModem *self, /*****************************************************************************/ +static void +setup_ports (MMBroadbandModem *_self) +{ + MMBroadbandModemFibocom *self = (MM_BROADBAND_MODEM_FIBOCOM (_self)); + MMPortSerialAt *ports[2]; + guint i; + + /* Call parent's setup ports first always */ + MM_BROADBAND_MODEM_CLASS (mm_broadband_modem_fibocom_parent_class)->setup_ports (_self); + + ports[0] = mm_base_modem_peek_port_primary (MM_BASE_MODEM (self)); + ports[1] = mm_base_modem_peek_port_secondary (MM_BASE_MODEM (self)); + + for (i = 0; i < G_N_ELEMENTS (ports); i++) { + if (!ports[i]) + continue; + mm_port_serial_at_add_unsolicited_msg_handler ( + ports[i], + self->priv->sim_ready_regex, + NULL, NULL, NULL); + } +} + +/*****************************************************************************/ + MMBroadbandModemFibocom * mm_broadband_modem_fibocom_new (const gchar *device, const gchar **drivers, @@ -214,6 +240,19 @@ mm_broadband_modem_fibocom_init (MMBroadbandModemFibocom *self) MMBroadbandModemFibocomPrivate); self->priv->gtrndis_support = FEATURE_SUPPORT_UNKNOWN; + + self->priv->sim_ready_regex = g_regex_new ("\\r\\n\\+SIM READY\\r\\n", + G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); +} + +static void +finalize (GObject *object) +{ + MMBroadbandModemFibocom *self = MM_BROADBAND_MODEM_FIBOCOM (object); + + g_regex_unref (self->priv->sim_ready_regex); + + G_OBJECT_CLASS (mm_broadband_modem_fibocom_parent_class)->finalize (object); } static void @@ -228,6 +267,13 @@ iface_modem_init (MMIfaceModem *iface) static void mm_broadband_modem_fibocom_class_init (MMBroadbandModemFibocomClass *klass) { + GObjectClass *object_class = G_OBJECT_CLASS (klass); + MMBroadbandModemClass *broadband_modem_class = MM_BROADBAND_MODEM_CLASS (klass); + g_type_class_add_private (G_OBJECT_CLASS (klass), sizeof (MMBroadbandModemFibocomPrivate)); + + /* Virtual methods */ + object_class->finalize = finalize; + broadband_modem_class->setup_ports = setup_ports; } |