static void file_builder_add_value (FileBuilder *fb, GVariant *value, struct gvdb_pointer *pointer) { GVariant *variant, *normal; gpointer data; gsize size; if (fb->byteswap) { value = g_variant_byteswap (value); variant = g_variant_new_variant (value); g_variant_unref (value); } else variant = g_variant_new_variant (value); normal = g_variant_get_normal_form (variant); g_variant_unref (variant); size = g_variant_get_size (normal); data = file_builder_allocate (fb, 8, size, pointer); g_variant_store (normal, data); g_variant_unref (normal); }
/* < private > * g_variant_fill_gvs: * @serialised: a pointer to a #GVariantSerialised * @data: a #GVariant instance * * This is the callback that is passed by a tree-form container instance * to the serialiser. This callback gets called on each child of the * container. Each child is responsible for performing the following * actions: * * - reporting its type * * - reporting its serialised size (requires knowing the size first) * * - possibly storing its serialised form into the provided buffer */ static void g_variant_fill_gvs (GVariantSerialised *serialised, gpointer data) { GVariant *value = data; g_variant_lock (value); g_variant_ensure_size (value); g_variant_unlock (value); if (serialised->type_info == NULL) serialised->type_info = value->type_info; g_assert (serialised->type_info == value->type_info); if (serialised->size == 0) serialised->size = value->size; g_assert (serialised->size == value->size); if (serialised->data) /* g_variant_store() is a public API, so it * it will reacquire the lock if it needs to. */ g_variant_store (value, serialised->data); }