aboutsummaryrefslogtreecommitdiff
path: root/plugins/huawei/mm-modem-helpers-huawei.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/huawei/mm-modem-helpers-huawei.c')
-rw-r--r--plugins/huawei/mm-modem-helpers-huawei.c98
1 files changed, 98 insertions, 0 deletions
diff --git a/plugins/huawei/mm-modem-helpers-huawei.c b/plugins/huawei/mm-modem-helpers-huawei.c
index f8baf829..2cd94e6a 100644
--- a/plugins/huawei/mm-modem-helpers-huawei.c
+++ b/plugins/huawei/mm-modem-helpers-huawei.c
@@ -25,6 +25,7 @@
#include "mm-log-object.h"
#include "mm-modem-helpers.h"
#include "mm-modem-helpers-huawei.h"
+#include "mm-huawei-enums-types.h"
/*****************************************************************************/
/* ^NDISSTAT / ^NDISSTATQRY response parser */
@@ -1467,3 +1468,100 @@ mm_huawei_parse_cvoice_response (const gchar *response,
return ret;
}
+
+/*****************************************************************************/
+/* ^GETPORTMODE response parser */
+
+#define GETPORTMODE_PREFIX "^GETPORTMODE:"
+
+GArray *
+mm_huawei_parse_getportmode_response (const gchar *response,
+ gpointer log_object,
+ GError **error)
+{
+ g_autoptr(GArray) modes = NULL;
+ g_auto(GStrv) split = NULL;
+ guint i;
+ gint n_items;
+
+ split = g_strsplit (response, ",", -1);
+ n_items = g_strv_length (split) - 1;
+ if (n_items < 1) {
+ g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
+ "Unexpected number of items in response");
+ return NULL;
+ }
+
+ /* validate response prefix */
+ if (g_ascii_strncasecmp (split[0], GETPORTMODE_PREFIX, strlen (GETPORTMODE_PREFIX)) != 0) {
+ g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
+ "Unexpected response prefix");
+ return NULL;
+ }
+
+ mm_obj_dbg (log_object, "processing ^GETPORTMODE response...");
+
+ modes = g_array_sized_new (FALSE, FALSE, sizeof (MMHuaweiPortMode), n_items);
+
+ /* iterate all port items found */
+ for (i = 1; split[i]; i++) {
+ MMHuaweiPortMode mode = MM_HUAWEI_PORT_MODE_NONE;
+ gchar *separator;
+ guint port_number;
+
+ separator = strchr (split[i], ':');
+ if (!separator)
+ continue;
+
+ /* the reported port number may start either by 0 or by 1; the important
+ * thing is therefore no the number itself, only that it's a number */
+ g_strstrip (&separator[1]);
+ if (!mm_get_uint_from_str (&separator[1], &port_number)) {
+ mm_obj_warn (log_object, " couldn't parse port number: %s", split[i]);
+ break;
+ }
+
+ *separator = '\0';
+ g_strstrip (split[i]);
+
+ if (g_ascii_strcasecmp (split[i], "pcui") == 0)
+ mode = MM_HUAWEI_PORT_MODE_PCUI;
+ else if ((g_ascii_strcasecmp (split[i], "mdm") == 0) ||
+ (g_ascii_strcasecmp (split[i], "modem") == 0) ||
+ (g_ascii_strcasecmp (split[i], "3g_modem") == 0))
+ mode = MM_HUAWEI_PORT_MODE_MODEM;
+ else if ((g_ascii_strcasecmp (split[i], "diag") == 0) ||
+ (g_ascii_strcasecmp (split[i], "3g_diag") == 0) ||
+ (g_ascii_strcasecmp (split[i], "4g_diag") == 0))
+ mode = MM_HUAWEI_PORT_MODE_DIAG;
+ else if (g_ascii_strcasecmp (split[i], "gps") == 0)
+ mode = MM_HUAWEI_PORT_MODE_GPS;
+ else if ((g_ascii_strcasecmp (split[i], "ndis") == 0) ||
+ (g_ascii_strcasecmp (split[i], "rndis") == 0) ||
+ (g_ascii_strcasecmp (split[i], "ncm") == 0) ||
+ (g_ascii_strcasecmp (split[i], "ecm") == 0))
+ mode = MM_HUAWEI_PORT_MODE_NET;
+ else if (g_ascii_strcasecmp (split[i], "cdrom") == 0)
+ mode = MM_HUAWEI_PORT_MODE_CDROM;
+ else if ((g_ascii_strcasecmp (split[i], "sd") == 0) ||
+ (g_ascii_strncasecmp (split[i], "mass", 4) == 0))
+ mode = MM_HUAWEI_PORT_MODE_SD;
+ else if (g_ascii_strcasecmp (split[i], "bt") == 0)
+ mode = MM_HUAWEI_PORT_MODE_BT;
+ else if ((g_ascii_strcasecmp (split[i], "a_shell") == 0) ||
+ (g_ascii_strcasecmp (split[i], "c_shell") == 0))
+ mode = MM_HUAWEI_PORT_MODE_SHELL;
+
+ mm_obj_dbg (log_object, " port mode %s reported at port number %u",
+ mm_huawei_port_mode_get_string (mode), port_number);
+ g_array_append_val (modes, mode);
+ }
+
+ if (!modes->len) {
+ g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
+ "No port modes loaded");
+ return NULL;
+ }
+
+ return g_steal_pointer (&modes);
+}