aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2012-03-13 19:02:03 +0100
committerAleksander Morgado <aleksander@lanedo.com>2012-03-13 19:46:36 +0100
commit796e3ab45a8e0d5183efd03a7fe166f3e5ef1db1 (patch)
tree6bbb9590aab8abbe61a1d7d9990d68ebcff2f97f
parent8b7a434d4d4dfc129fc3a9e477199dc0f1e1b30d (diff)
at-serial-port: new property to control whether echo removal should be applied
-rw-r--r--src/mm-at-serial-port.c61
-rw-r--r--src/mm-at-serial-port.h2
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;
};