diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2012-03-13 19:02:03 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-03-13 19:46:36 +0100 |
commit | 796e3ab45a8e0d5183efd03a7fe166f3e5ef1db1 (patch) | |
tree | 6bbb9590aab8abbe61a1d7d9990d68ebcff2f97f | |
parent | 8b7a434d4d4dfc129fc3a9e477199dc0f1e1b30d (diff) |
at-serial-port: new property to control whether echo removal should be applied
-rw-r--r-- | src/mm-at-serial-port.c | 61 | ||||
-rw-r--r-- | src/mm-at-serial-port.h | 2 |
2 files changed, 60 insertions, 3 deletions
diff --git a/src/mm-at-serial-port.c b/src/mm-at-serial-port.c index cd4bb133..5bc17899 100644 --- a/src/mm-at-serial-port.c +++ b/src/mm-at-serial-port.c @@ -29,14 +29,21 @@ G_DEFINE_TYPE (MMAtSerialPort, mm_at_serial_port, MM_TYPE_SERIAL_PORT) #define MM_AT_SERIAL_PORT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MM_TYPE_AT_SERIAL_PORT, MMAtSerialPortPrivate)) +enum { + PROP_0, + PROP_REMOVE_ECHO, + LAST_PROP +}; + typedef struct { /* Response parser data */ MMAtSerialResponseParserFn response_parser_fn; gpointer response_parser_user_data; GDestroyNotify response_parser_notify; GSList *unsolicited_msg_handlers; -} MMAtSerialPortPrivate; + gboolean remove_echo; +} MMAtSerialPortPrivate; /*****************************************************************************/ @@ -89,7 +96,8 @@ parse_response (MMSerialPort *port, GByteArray *response, GError **error) g_return_val_if_fail (priv->response_parser_fn != NULL, FALSE); /* Remove echo */ - mm_at_serial_port_remove_echo (response); + if (priv->remove_echo) + mm_at_serial_port_remove_echo (response); /* Construct the string that AT-parsing functions expect */ string = g_string_sized_new (response->len + 1); @@ -183,7 +191,8 @@ parse_unsolicited (MMSerialPort *port, GByteArray *response) GSList *iter; /* Remove echo */ - mm_at_serial_port_remove_echo (response); + if (priv->remove_echo) + mm_at_serial_port_remove_echo (response); for (iter = priv->unsolicited_msg_handlers; iter; iter = iter->next) { MMAtUnsolicitedMsgHandler *handler = (MMAtUnsolicitedMsgHandler *) iter->data; @@ -340,6 +349,42 @@ mm_at_serial_port_new (const char *name, MMPortType ptype) static void mm_at_serial_port_init (MMAtSerialPort *self) { + MMAtSerialPortPrivate *priv = MM_AT_SERIAL_PORT_GET_PRIVATE (self); + + /* By default, remove echo */ + priv->remove_echo = TRUE; +} + +static void +set_property (GObject *object, guint prop_id, + const GValue *value, GParamSpec *pspec) +{ + MMAtSerialPortPrivate *priv = MM_AT_SERIAL_PORT_GET_PRIVATE (object); + + switch (prop_id) { + case PROP_REMOVE_ECHO: + priv->remove_echo = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +get_property (GObject *object, guint prop_id, + GValue *value, GParamSpec *pspec) +{ + MMAtSerialPortPrivate *priv = MM_AT_SERIAL_PORT_GET_PRIVATE (object); + + switch (prop_id) { + case PROP_REMOVE_ECHO: + g_value_set_boolean (value, priv->remove_echo); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } } static void @@ -375,10 +420,20 @@ mm_at_serial_port_class_init (MMAtSerialPortClass *klass) g_type_class_add_private (object_class, sizeof (MMAtSerialPortPrivate)); /* Virtual methods */ + object_class->set_property = set_property; + object_class->get_property = get_property; object_class->finalize = finalize; port_class->parse_unsolicited = parse_unsolicited; port_class->parse_response = parse_response; port_class->handle_response = handle_response; port_class->debug_log = debug_log; + + g_object_class_install_property + (object_class, PROP_REMOVE_ECHO, + g_param_spec_boolean (MM_AT_SERIAL_PORT_REMOVE_ECHO, + "Remove echo", + "Built-in echo removal should be applied", + TRUE, + G_PARAM_READWRITE)); } diff --git a/src/mm-at-serial-port.h b/src/mm-at-serial-port.h index 689c184f..3079470f 100644 --- a/src/mm-at-serial-port.h +++ b/src/mm-at-serial-port.h @@ -45,6 +45,8 @@ typedef void (*MMAtSerialResponseFn) (MMAtSerialPort *port, GError *error, gpointer user_data); +#define MM_AT_SERIAL_PORT_REMOVE_ECHO "remove-echo" + struct _MMAtSerialPort { MMSerialPort parent; }; |