summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2018-09-10 23:36:45 +0200
committerAleksander Morgado <aleksander@aleksander.es>2018-09-10 23:36:45 +0200
commit69e4fe07f87b611a25c3d2f7b025e99a0859348b (patch)
treedca1f61365d9102a37a54cf89f6e8ef452480679
parent034192aa71cf7243e70405650f875480aa2f0f1a (diff)
downloadModemManager-aleksander/serial-port-flow-control.tar.gz
modem-helpers: reuse nicknames for the flow control tagsaleksander/serial-port-flow-control
And check that the string given in the tag is actually a valid one.
-rw-r--r--src/mm-base-modem.c20
-rw-r--r--src/mm-modem-helpers.c30
-rw-r--r--src/mm-modem-helpers.h3
-rw-r--r--src/mm-port-probe.c60
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 e7d4ee766..78a4e3e70 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 ed6057753..ef5bc9903 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,