diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2018-09-10 23:36:45 +0200 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2018-09-12 17:15:46 +0000 |
commit | 4c669d3bf46da3b4f924968e43fc2edfbfa0b5d7 (patch) | |
tree | 26d99b73db7841cd78877cf036ee769b03aef354 | |
parent | fc1beefe927adb8d9bed3f554ddfb73a09593630 (diff) | |
download | ModemManager-4c669d3bf46da3b4f924968e43fc2edfbfa0b5d7.tar.gz |
modem-helpers: reuse nicknames for the flow control tags
And check that the string given in the tag is actually a valid one.
-rw-r--r-- | src/mm-base-modem.c | 20 | ||||
-rw-r--r-- | src/mm-modem-helpers.c | 30 | ||||
-rw-r--r-- | src/mm-modem-helpers.h | 3 | ||||
-rw-r--r-- | src/mm-port-probe.c | 60 |
4 files changed, 70 insertions, 43 deletions
diff --git a/src/mm-base-modem.c b/src/mm-base-modem.c index bb9abb559..c0ebb7f12 100644 --- a/src/mm-base-modem.c +++ b/src/mm-base-modem.c @@ -255,11 +255,21 @@ mm_base_modem_grab_port (MMBaseModem *self, NULL); flow_control_tag = mm_kernel_device_get_property (kernel_device, "ID_MM_TTY_FLOW_CONTROL"); - if (flow_control_tag) - g_object_set (port, - MM_PORT_SERIAL_FLOW_CONTROL, - mm_parse_flow_control_tag (flow_control_tag), - NULL); + if (flow_control_tag) { + MMFlowControl flow_control; + GError *inner_error = NULL; + + flow_control = mm_flow_control_from_string (flow_control_tag, &inner_error); + if (flow_control == MM_FLOW_CONTROL_UNKNOWN) { + mm_warn ("(%s/%s) unsupported flow control settings in port: %s", + subsys, name, inner_error->message); + g_error_free (inner_error); + } else { + g_object_set (port, + MM_PORT_SERIAL_FLOW_CONTROL, flow_control, + NULL); + } + } } /* Net ports... */ else if (g_str_equal (subsys, "net")) { diff --git a/src/mm-modem-helpers.c b/src/mm-modem-helpers.c index 1df643415..01d04eee7 100644 --- a/src/mm-modem-helpers.c +++ b/src/mm-modem-helpers.c @@ -30,6 +30,7 @@ #include "mm-sms-part.h" #include "mm-modem-helpers.h" +#include "mm-helper-enums-types.h" #include "mm-log.h" /*****************************************************************************/ @@ -647,22 +648,25 @@ out: } MMFlowControl -mm_parse_flow_control_tag (const gchar *flow_control_tag) +mm_flow_control_from_string (const gchar *str, + GError **error) { - MMFlowControl flow_control; - - if (g_strcmp0 ("xonxoff", flow_control_tag) == 0) - flow_control = MM_FLOW_CONTROL_XON_XOFF; - else if (g_strcmp0 ("rtscts", flow_control_tag) == 0) - flow_control = MM_FLOW_CONTROL_RTS_CTS; - else if (g_strcmp0 ("none", flow_control_tag) == 0) - flow_control = MM_FLOW_CONTROL_NONE; - else { - mm_warn ("Cannot parse flow control tag: '%s', setting as unknown", flow_control_tag); - flow_control = MM_FLOW_CONTROL_UNKNOWN; + GFlagsClass *flags_class; + guint i; + + flags_class = G_FLAGS_CLASS (g_type_class_ref (MM_TYPE_FLOW_CONTROL)); + + for (i = 0; flags_class->values[i].value_nick; i++) { + if (!g_ascii_strcasecmp (str, flags_class->values[i].value_nick)) + return flags_class->values[i].value; } - return flow_control; + g_set_error (error, + MM_CORE_ERROR, + MM_CORE_ERROR_INVALID_ARGS, + "Couldn't match '%s' with a valid MMFlowControl value", + str); + return MM_FLOW_CONTROL_UNKNOWN; } /*************************************************************************/ diff --git a/src/mm-modem-helpers.h b/src/mm-modem-helpers.h index fcac9f133..1897038c2 100644 --- a/src/mm-modem-helpers.h +++ b/src/mm-modem-helpers.h @@ -112,7 +112,8 @@ typedef enum { /*< underscore_name=mm_flow_control >*/ MMFlowControl mm_parse_ifc_test_response (const gchar *response, GError **error); -MMFlowControl mm_parse_flow_control_tag (const gchar *flow_control); +MMFlowControl mm_flow_control_from_string (const gchar *str, + GError **error); /*****************************************************************************/ /* 3GPP specific helpers and utilities */ diff --git a/src/mm-port-probe.c b/src/mm-port-probe.c index 84a56761e..fd66d20a7 100644 --- a/src/mm-port-probe.c +++ b/src/mm-port-probe.c @@ -630,6 +630,39 @@ wdm_probe (MMPortProbe *self) } /***************************************************************/ + +static void +common_serial_port_setup (MMPortProbe *self, + MMPortSerial *serial) +{ + const gchar *flow_control_tag; + + if (mm_kernel_device_has_property (self->priv->port, "ID_MM_TTY_BAUDRATE")) + g_object_set (serial, + MM_PORT_SERIAL_BAUD, mm_kernel_device_get_property_as_int (self->priv->port, "ID_MM_TTY_BAUDRATE"), + NULL); + + flow_control_tag = mm_kernel_device_get_property (self->priv->port, "ID_MM_TTY_FLOW_CONTROL"); + if (flow_control_tag) { + MMFlowControl flow_control; + GError *error = NULL; + + flow_control = mm_flow_control_from_string (flow_control_tag, &error); + if (flow_control == MM_FLOW_CONTROL_UNKNOWN) { + mm_warn ("(%s/%s) Unsupported flow control settings in port: %s", + mm_kernel_device_get_subsystem (self->priv->port), + mm_kernel_device_get_name (self->priv->port), + error->message); + g_error_free (error); + } else { + g_object_set (serial, + MM_PORT_SERIAL_FLOW_CONTROL, flow_control, + NULL); + } + } +} + +/***************************************************************/ /* QCDM */ static void @@ -711,7 +744,6 @@ serial_probe_qcdm (MMPortProbe *self) gint len; guint8 marker = 0x7E; PortProbeRunContext *ctx; - const gchar *flow_control_tag; g_assert (self->priv->task); ctx = g_task_get_task_data (self->priv->task); @@ -748,17 +780,8 @@ serial_probe_qcdm (MMPortProbe *self) return G_SOURCE_REMOVE; } - if (mm_kernel_device_has_property (self->priv->port, "ID_MM_TTY_BAUDRATE")) - g_object_set (ctx->serial, - MM_PORT_SERIAL_BAUD, mm_kernel_device_get_property_as_int (self->priv->port, "ID_MM_TTY_BAUDRATE"), - NULL); - flow_control_tag = mm_kernel_device_get_property (self->priv->port, - "ID_MM_TTY_FLOW_CONTROL"); - if (flow_control_tag) - g_object_set (ctx->serial, - MM_PORT_SERIAL_FLOW_CONTROL, - mm_parse_flow_control_tag (flow_control_tag), - NULL); + /* Setup port if needed */ + common_serial_port_setup (self, ctx->serial); /* Try to open the port */ if (!mm_port_serial_open (ctx->serial, &error)) { @@ -1264,7 +1287,6 @@ serial_open_at (MMPortProbe *self) { GError *error = NULL; PortProbeRunContext *ctx; - const gchar *flow_control_tag; g_assert (self->priv->task); ctx = g_task_get_task_data (self->priv->task); @@ -1300,17 +1322,7 @@ serial_open_at (MMPortProbe *self) MM_PORT_SERIAL_AT_SEND_LF, ctx->at_send_lf, NULL); - if (mm_kernel_device_has_property (self->priv->port, "ID_MM_TTY_BAUDRATE")) - g_object_set (ctx->serial, - MM_PORT_SERIAL_BAUD, mm_kernel_device_get_property_as_int (self->priv->port, "ID_MM_TTY_BAUDRATE"), - NULL); - flow_control_tag = mm_kernel_device_get_property (self->priv->port, - "ID_MM_TTY_FLOW_CONTROL"); - if (flow_control_tag) - g_object_set (ctx->serial, - MM_PORT_SERIAL_FLOW_CONTROL, - mm_parse_flow_control_tag (flow_control_tag), - NULL); + common_serial_port_setup (self, ctx->serial); parser = mm_serial_parser_v1_new (); mm_serial_parser_v1_add_filter (parser, |