aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 */