diff options
Diffstat (limited to 'src/libqmi-glib/qmi-message-context.c')
-rw-r--r-- | src/libqmi-glib/qmi-message-context.c | 123 |
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; +} |