diff options
author | Tambet Ingo <tambet@gmail.com> | 2009-02-18 14:48:08 +0200 |
---|---|---|
committer | Tambet Ingo <tambet@gmail.com> | 2009-02-18 14:48:08 +0200 |
commit | 1215bd6a9d607018e0af7ad7afa85bc35cb713a0 (patch) | |
tree | cc33208fdbd4de15703fe8fefbd578f2d68908be /plugins/mm-modem-hso.c | |
parent | 13facad4fa3be24d07768892135caebd88e95fcc (diff) |
Rework unsolicited message handling.
Implement registration using unsolicited messages for generic GSM class (which
is disabled by default, HSO and Huawei plugins enable it).
Modify all GSM modem subclasses that used unsolicited messages to use the new
method.
Diffstat (limited to 'plugins/mm-modem-hso.c')
-rw-r--r-- | plugins/mm-modem-hso.c | 46 |
1 files changed, 16 insertions, 30 deletions
diff --git a/plugins/mm-modem-hso.c b/plugins/mm-modem-hso.c index 9c9d7d20..26b986cd 100644 --- a/plugins/mm-modem-hso.c +++ b/plugins/mm-modem-hso.c @@ -12,7 +12,6 @@ #include "mm-serial.h" #include "mm-serial-parsers.h" #include "mm-errors.h" -#include "mm-util.h" #include "mm-callback-info.h" static void impl_hso_authenticate (MMModemHso *self, @@ -27,9 +26,6 @@ static gpointer mm_modem_hso_parent_class = NULL; #define MM_MODEM_HSO_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MM_TYPE_MODEM_HSO, MMModemHsoPrivate)) typedef struct { - GRegex *connection_enabled_regex; - gpointer std_parser; - /* Pending connection attempt */ MMCallbackInfo *connect_pending_data; guint connect_pending_id; @@ -412,25 +408,20 @@ impl_hso_authenticate (MMModemHso *self, } static void -connection_enabled (const char *str, gpointer data) -{ - if (str && strlen (str) == 4) { - if (str[3] == '1') - connect_pending_done (MM_MODEM_HSO (data)); - if (str[3] == '0') - /* FIXME: disconnected. do something when we have modem status signals */ - ; - } -} - -static gboolean -hso_parse_response (gpointer data, GString *response, GError **error) +connection_enabled (MMSerial *serial, + GMatchInfo *info, + gpointer user_data) { - MMModemHsoPrivate *priv = MM_MODEM_HSO_GET_PRIVATE (data); + char *str; - mm_util_strip_string (response, priv->connection_enabled_regex, connection_enabled, data); + str = g_match_info_fetch (info, 2); + if (str[0] == '1') + connect_pending_done (MM_MODEM_HSO (serial)); + else if (str[0] == '0') + /* FIXME: disconnected. do something when we have modem status signals */ + ; - return mm_serial_parser_v1_parse (priv->std_parser, response, error); + g_free (str); } /*****************************************************************************/ @@ -525,13 +516,13 @@ simple_connect (MMModemSimple *simple, static void mm_modem_hso_init (MMModemHso *self) { - MMModemHsoPrivate *priv = MM_MODEM_HSO_GET_PRIVATE (self); + GRegex *regex; - priv->connection_enabled_regex = g_regex_new ("_OWANCALL: (\\d, \\d)\\r\\n", - G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); + mm_generic_gsm_set_unsolicited_registration (MM_GENERIC_GSM (self), TRUE); - priv->std_parser = (gpointer) mm_serial_parser_v1_new (); - mm_serial_set_response_parser (MM_SERIAL (self), hso_parse_response, self, NULL); + regex = g_regex_new ("_OWANCALL: (\\d), (\\d)\\r\\n", G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL); + mm_serial_add_unsolicited_msg_handler (MM_SERIAL (self), regex, connection_enabled, NULL, NULL); + g_regex_unref (regex); } static void @@ -585,14 +576,9 @@ constructor (GType type, static void finalize (GObject *object) { - MMModemHsoPrivate *priv = MM_MODEM_HSO_GET_PRIVATE (object); - /* Clear the pending connection if necessary */ connect_pending_done (MM_MODEM_HSO (object)); - g_regex_unref (priv->connection_enabled_regex); - mm_serial_parser_v1_destroy (priv->std_parser); - G_OBJECT_CLASS (mm_modem_hso_parent_class)->finalize (object); } |