diff options
Diffstat (limited to 'glib/glib/gvariant-core.c')
-rw-r--r-- | glib/glib/gvariant-core.c | 48 |
1 files changed, 45 insertions, 3 deletions
diff --git a/glib/glib/gvariant-core.c b/glib/glib/gvariant-core.c index 1633463..dc20c32 100644 --- a/glib/glib/gvariant-core.c +++ b/glib/glib/gvariant-core.c @@ -18,6 +18,8 @@ * Boston, MA 02111-1307, USA. */ +#include "config.h" + #include <glib/gvariant-core.h> #include <glib/gvariant-serialiser.h> @@ -484,8 +486,7 @@ g_variant_alloc (const GVariantType *type, return value; } -/* -- internal -- */ -/* < internal > +/** * g_variant_new_from_bytes: * @type: a #GVariantType * @bytes: a #GBytes @@ -497,7 +498,9 @@ g_variant_alloc (const GVariantType *type, * * A reference is taken on @bytes. * - * Returns: a new #GVariant with a floating reference + * Returns: (transfer none): a new #GVariant with a floating reference + * + * Since: 2.36 */ GVariant * g_variant_new_from_bytes (const GVariantType *type, @@ -535,6 +538,8 @@ g_variant_new_from_bytes (const GVariantType *type, return value; } +/* -- internal -- */ + /* < internal > * g_variant_new_from_children: * @type: a #GVariantType @@ -862,6 +867,43 @@ g_variant_get_data (GVariant *value) } /** + * g_variant_get_data_as_bytes: + * @value: a #GVariant + * + * Returns a pointer to the serialised form of a #GVariant instance. + * The semantics of this function are exactly the same as + * g_variant_get_data(), except that the returned #GBytes holds + * a reference to the variant data. + * + * Returns: (transfer full): A new #GBytes representing the variant data + * + * Since: 2.36 + */ +GBytes * +g_variant_get_data_as_bytes (GVariant *value) +{ + const gchar *bytes_data; + const gchar *data; + gsize bytes_size; + gsize size; + + g_variant_lock (value); + g_variant_ensure_serialised (value); + g_variant_unlock (value); + + bytes_data = g_bytes_get_data (value->contents.serialised.bytes, &bytes_size); + data = value->contents.serialised.data; + size = value->size; + + if (data == bytes_data && size == bytes_size) + return g_bytes_ref (value->contents.serialised.bytes); + else + return g_bytes_new_from_bytes (value->contents.serialised.bytes, + data - bytes_data, size); +} + + +/** * g_variant_n_children: * @value: a container #GVariant * |