aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2012-03-15 16:45:47 +0100
committerAleksander Morgado <aleksander@lanedo.com>2012-03-16 14:53:26 +0100
commit52ac88824e17ae26379e263b5a8dbcbdca805325 (patch)
tree7a1b04358dd6864295c76d899a71bab7a1df9702
parentdb052c2e5021066502ebfdd56c29e011abc2f55c (diff)
hso: setup ports
Only the primary port will get the OWANCALL unsolicited messages, so we only setup not to remove the echo in that specific port.
-rw-r--r--plugins/option/mm-broadband-modem-hso.c43
1 files changed, 42 insertions, 1 deletions
diff --git a/plugins/option/mm-broadband-modem-hso.c b/plugins/option/mm-broadband-modem-hso.c
index 161db953..3545f619 100644
--- a/plugins/option/mm-broadband-modem-hso.c
+++ b/plugins/option/mm-broadband-modem-hso.c
@@ -33,10 +33,34 @@
G_DEFINE_TYPE (MMBroadbandModemHso, mm_broadband_modem_hso, MM_TYPE_BROADBAND_MODEM_OPTION);
struct _MMBroadbandModemHsoPrivate {
- gpointer dummy;
+ /* Regex for connected notifications */
+ GRegex *_owancall_regex;
};
/*****************************************************************************/
+/* Setup ports (Broadband modem class) */
+
+static void
+setup_ports (MMBroadbandModem *self)
+{
+ /* Call parent's setup ports first always */
+ MM_BROADBAND_MODEM_CLASS (mm_broadband_modem_hso_parent_class)->setup_ports (self);
+
+ /* _OWANCALL unsolicited messages are only expected in the primary port. */
+ mm_at_serial_port_add_unsolicited_msg_handler (
+ mm_base_modem_peek_port_primary (MM_BASE_MODEM (self)),
+ MM_BROADBAND_MODEM_HSO (self)->priv->_owancall_regex,
+ NULL, NULL, NULL);
+
+ g_object_set (mm_base_modem_peek_port_primary (MM_BASE_MODEM (self)),
+ MM_SERIAL_PORT_SEND_DELAY, (guint64) 0,
+ /* built-in echo removal conflicts with unsolicited _OWANCALL
+ * messages, which are not <CR><LF> prefixed. */
+ MM_AT_SERIAL_PORT_REMOVE_ECHO, FALSE,
+ NULL);
+}
+
+/*****************************************************************************/
MMBroadbandModemHso *
mm_broadband_modem_hso_new (const gchar *device,
@@ -55,18 +79,35 @@ mm_broadband_modem_hso_new (const gchar *device,
}
static void
+finalize (GObject *object)
+{
+ MMBroadbandModemHso *self = MM_BROADBAND_MODEM_HSO (object);
+
+ g_regex_unref (self->priv->_owancall_regex);
+
+ G_OBJECT_CLASS (mm_broadband_modem_hso_parent_class)->finalize (object);
+}
+
+static void
mm_broadband_modem_hso_init (MMBroadbandModemHso *self)
{
/* Initialize private data */
self->priv = G_TYPE_INSTANCE_GET_PRIVATE ((self),
MM_TYPE_BROADBAND_MODEM_HSO,
MMBroadbandModemHsoPrivate);
+
+ self->priv->_owancall_regex = g_regex_new ("_OWANCALL: (\\d),\\s*(\\d)\\r\\n",
+ G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
}
static void
mm_broadband_modem_hso_class_init (MMBroadbandModemHsoClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ MMBroadbandModemClass *broadband_modem_class = MM_BROADBAND_MODEM_CLASS (klass);
g_type_class_add_private (object_class, sizeof (MMBroadbandModemHsoPrivate));
+
+ object_class->finalize = finalize;
+ broadband_modem_class->setup_ports = setup_ports;
}