aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTambet Ingo <tambet@gmail.com>2008-10-24 16:20:22 +0300
committerTambet Ingo <tambet@gmail.com>2008-10-24 16:20:22 +0300
commitf82b187c2bb3efb117f96e5b6062128f20ab2f39 (patch)
treeb9dad67b61990b30a9c7add57b7b839a5dfee429
parent0bd4f4a6049838dd7b09320c18c1991196ae80ee (diff)
Move the string parser with regexp from huawei plugin to generic utility function.
It's useful for other modems too that need to strip unsolicited messages from responses.
-rw-r--r--plugins/mm-modem-huawei.c55
-rw-r--r--src/Makefile.am4
-rw-r--r--src/mm-util.c54
-rw-r--r--src/mm-util.h20
4 files changed, 80 insertions, 53 deletions
diff --git a/plugins/mm-modem-huawei.c b/plugins/mm-modem-huawei.c
index c32d653a..efcae1bd 100644
--- a/plugins/mm-modem-huawei.c
+++ b/plugins/mm-modem-huawei.c
@@ -7,6 +7,7 @@
#include "mm-modem-gsm-network.h"
#include "mm-errors.h"
#include "mm-callback-info.h"
+#include "mm-util.h"
#include "mm-serial-parsers.h"
static gpointer mm_modem_huawei_parent_class = NULL;
@@ -407,62 +408,12 @@ reg_state_changed (const char *str, gpointer data)
}
static gboolean
-remove_eval_cb (const GMatchInfo *match_info,
- GString *result,
- gpointer user_data)
-{
- int *result_len = (int *) user_data;
- int start;
- int end;
-
- if (g_match_info_fetch_pos (match_info, 0, &start, &end))
- *result_len -= (end - start);
-
- return FALSE;
-}
-
-typedef void (*HuaweiStripFn) (const char *str, gpointer data);
-
-static void
-huawei_strip (GRegex *r, GString *string, HuaweiStripFn fn, gpointer data)
-{
- GMatchInfo *match_info;
- gboolean matches;
- char *str;
-
- matches = g_regex_match_full (r, string->str, string->len, 0, 0, &match_info, NULL);
- if (fn) {
- while (g_match_info_matches (match_info)) {
- str = g_match_info_fetch (match_info, 1);
- fn (str, data);
- g_free (str);
-
- g_match_info_next (match_info, NULL);
- }
- }
-
- g_match_info_free (match_info);
-
- if (matches) {
- /* Remove matches */
- int result_len = string->len;
-
- str = g_regex_replace_eval (r, string->str, string->len, 0, 0,
- remove_eval_cb, &result_len, NULL);
-
- g_string_truncate (string, 0);
- g_string_append_len (string, str, result_len);
- g_free (str);
- }
-}
-
-static gboolean
huawei_parse_response (gpointer data, GString *response, GError **error)
{
MMModemHuaweiPrivate *priv = MM_MODEM_HUAWEI_GET_PRIVATE (data);
- huawei_strip (priv->status_regex, response, handle_status_change, data);
- huawei_strip (priv->reg_state_regex, response, reg_state_changed, data);
+ mm_util_strip_string (response, priv->status_regex, handle_status_change, data);
+ mm_util_strip_string (response, priv->reg_state_regex, reg_state_changed, data);
return mm_serial_parser_v1_parse (priv->std_parser, response, error);
}
diff --git a/src/Makefile.am b/src/Makefile.am
index 8896e47e..b8fe2894 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -36,7 +36,9 @@ modem_manager_SOURCES = \
mm-serial.c \
mm-serial.h \
mm-serial-parsers.c \
- mm-serial-parsers.h
+ mm-serial-parsers.h \
+ mm-util.c \
+ mm-util.h
mm-manager-glue.h: $(top_srcdir)/introspection/mm-manager.xml
dbus-binding-tool --prefix=mm_manager --mode=glib-server --output=$@ $<
diff --git a/src/mm-util.c b/src/mm-util.c
new file mode 100644
index 00000000..33796ac6
--- /dev/null
+++ b/src/mm-util.c
@@ -0,0 +1,54 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+
+#include "mm-util.h"
+
+static gboolean
+remove_eval_cb (const GMatchInfo *match_info,
+ GString *result,
+ gpointer user_data)
+{
+ int *result_len = (int *) user_data;
+ int start;
+ int end;
+
+ if (g_match_info_fetch_pos (match_info, 0, &start, &end))
+ *result_len -= (end - start);
+
+ return FALSE;
+}
+
+void
+mm_util_strip_string (GString *string,
+ GRegex *regex,
+ MMUtilStripFn callback,
+ gpointer user_data)
+{
+ GMatchInfo *match_info;
+ gboolean matches;
+ char *str;
+
+ matches = g_regex_match_full (regex, string->str, string->len, 0, 0, &match_info, NULL);
+ if (callback) {
+ while (g_match_info_matches (match_info)) {
+ str = g_match_info_fetch (match_info, 1);
+ callback (str, user_data);
+ g_free (str);
+
+ g_match_info_next (match_info, NULL);
+ }
+ }
+
+ g_match_info_free (match_info);
+
+ if (matches) {
+ /* Remove matches */
+ int result_len = string->len;
+
+ str = g_regex_replace_eval (regex, string->str, string->len, 0, 0,
+ remove_eval_cb, &result_len, NULL);
+
+ g_string_truncate (string, 0);
+ g_string_append_len (string, str, result_len);
+ g_free (str);
+ }
+}
diff --git a/src/mm-util.h b/src/mm-util.h
new file mode 100644
index 00000000..049b5f94
--- /dev/null
+++ b/src/mm-util.h
@@ -0,0 +1,20 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+
+#ifndef MM_UTIL_H
+#define MM_UTIL_H
+
+#include <glib.h>
+
+typedef void (*MMUtilStripFn) (const char *str,
+ gpointer user_data);
+
+/* Applies the regexp on string and calls the callback (if provided)
+ with each match and user_data. After that, the matches are removed
+ from the string.
+*/
+void mm_util_strip_string (GString *string,
+ GRegex *regex,
+ MMUtilStripFn callback,
+ gpointer user_data);
+
+#endif /* MM_UTIL_H */