aboutsummaryrefslogtreecommitdiffstats
path: root/src/libqmi-glib/qmi-message-context.c
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2017-01-22 18:17:09 +0100
committerAleksander Morgado <aleksander@aleksander.es>2017-01-29 10:37:53 +0100
commit9bd604224f56fcf6fb0be577a646e62f59200594 (patch)
treee0eb725cd2f094502f8c613866ce027536a4aa42 /src/libqmi-glib/qmi-message-context.c
parent132bd1b0ef5c3b8b9f2544261a9e57e0fd589c14 (diff)
downloadexternal_libqmi-9bd604224f56fcf6fb0be577a646e62f59200594.zip
external_libqmi-9bd604224f56fcf6fb0be577a646e62f59200594.tar.gz
external_libqmi-9bd604224f56fcf6fb0be577a646e62f59200594.tar.bz2
libqmi-glib: support vendor-specific request/responses
We want to support non-standard messages that may be encoded with different TLVs depending on how the vendor implemented them. Anyway, right now this is really just to support the correct translation of TLVs and message contents in the get_printable() methods. The support is only included for QMI request/responses, and not for QMI indications. This is because the library knows in which moment the requests are created (and can apply the same rules to the matched response when it is received). For the indications, though, there is no such context configurable yet.
Diffstat (limited to 'src/libqmi-glib/qmi-message-context.c')
-rw-r--r--src/libqmi-glib/qmi-message-context.c123
1 files changed, 123 insertions, 0 deletions
diff --git a/src/libqmi-glib/qmi-message-context.c b/src/libqmi-glib/qmi-message-context.c
new file mode 100644
index 0000000..96f7a67
--- /dev/null
+++ b/src/libqmi-glib/qmi-message-context.c
@@ -0,0 +1,123 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+
+/*
+ * libqmi-glib -- GLib/GIO based library to control QMI devices
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ * Copyright (C) 2017 Aleksander Morgado <aleksander@aleksander.es>
+ */
+
+#include <glib.h>
+
+#include "qmi-message-context.h"
+
+/*****************************************************************************/
+/* Basic context */
+
+struct _QmiMessageContext {
+ volatile gint ref_count;
+
+ /* Vendor ID */
+ guint16 vendor_id;
+};
+
+/**
+ * qmi_message_context_new:
+ *
+ * Create a new empty #QmiMessageContext.
+ *
+ * Returns: (transfer full): a newly created #QmiMessageContext. The returned value should be freed with qmi_message_context_unref().
+ */
+QmiMessageContext *
+qmi_message_context_new (void)
+{
+ QmiMessageContext *self;
+
+ self = g_slice_new0 (QmiMessageContext);
+ self->ref_count = 1;
+ return self;
+}
+
+GType
+qmi_message_context_get_type (void)
+{
+ static volatile gsize g_define_type_id__volatile = 0;
+
+ if (g_once_init_enter (&g_define_type_id__volatile)) {
+ GType g_define_type_id =
+ g_boxed_type_register_static (g_intern_static_string ("QmiMessageContext"),
+ (GBoxedCopyFunc) qmi_message_context_ref,
+ (GBoxedFreeFunc) qmi_message_context_unref);
+
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
+
+ return g_define_type_id__volatile;
+}
+
+/**
+ * qmi_message_context_ref:
+ * @self: a #QmiMessageContext.
+ *
+ * Atomically increments the reference count of @self by one.
+ *
+ * Returns: (transfer full) the new reference to @self.
+ */
+QmiMessageContext *
+qmi_message_context_ref (QmiMessageContext *self)
+{
+ g_return_val_if_fail (self != NULL, NULL);
+
+ g_atomic_int_inc (&self->ref_count);
+ return self;
+}
+
+/**
+ * qmi_message_context_unref:
+ * @self: a #QmiMessageContext.
+ *
+ * Atomically decrements the reference count of @self by one.
+ * If the reference count drops to 0, @self is completely disposed.
+ */
+void
+qmi_message_context_unref (QmiMessageContext *self)
+{
+ g_return_if_fail (self != NULL);
+
+ if (g_atomic_int_dec_and_test (&self->ref_count)) {
+ g_slice_free (QmiMessageContext, self);
+ }
+}
+
+/*****************************************************************************/
+/* Vendor ID */
+
+void
+qmi_message_context_set_vendor_id (QmiMessageContext *self,
+ guint16 vendor_id)
+{
+ g_return_if_fail (self != NULL);
+
+ self->vendor_id = vendor_id;
+}
+
+guint16
+qmi_message_context_get_vendor_id (QmiMessageContext *self)
+{
+ g_return_val_if_fail (self != NULL, QMI_MESSAGE_VENDOR_GENERIC);
+ return self->vendor_id;
+}