summaryrefslogtreecommitdiffstats
path: root/glib/dbus-gvalue.c
diff options
context:
space:
mode:
Diffstat (limited to 'glib/dbus-gvalue.c')
-rw-r--r--glib/dbus-gvalue.c1854
1 files changed, 0 insertions, 1854 deletions
diff --git a/glib/dbus-gvalue.c b/glib/dbus-gvalue.c
deleted file mode 100644
index b81b4a65..00000000
--- a/glib/dbus-gvalue.c
+++ /dev/null
@@ -1,1854 +0,0 @@
-/* -*- mode: C; c-file-style: "gnu" -*- */
-/* dbus-gvalue.c GValue to-from DBusMessageIter
- *
- * Copyright (C) 2004 Ximian, Inc.
- * Copyright (C) 2005 Red Hat, Inc.
- *
- * Licensed under the Academic Free License version 2.1
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "config.h"
-#include "dbus-gtest.h"
-#include "dbus-gvalue.h"
-#include "dbus-gsignature.h"
-#include "dbus-gobject.h"
-#include "dbus-gvalue-utils.h"
-#include "dbus/dbus-glib.h"
-#include <string.h>
-#include <glib.h>
-#include <glib/gi18n.h>
-#include "dbus/dbus-signature.h"
-
-static gboolean demarshal_static_variant (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error);
-
-
-static gboolean marshal_basic (DBusMessageIter *iter,
- const GValue *value);
-static gboolean demarshal_basic (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error);
-static gboolean marshal_strv (DBusMessageIter *iter,
- const GValue *value);
-static gboolean demarshal_strv (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error);
-static gboolean marshal_valuearray (DBusMessageIter *iter,
- const GValue *value);
-static gboolean demarshal_valuearray (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error);
-static gboolean marshal_variant (DBusMessageIter *iter,
- const GValue *value);
-static gboolean demarshal_variant (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error);
-static gboolean marshal_proxy (DBusMessageIter *iter,
- const GValue *value);
-static gboolean demarshal_proxy (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error);
-static gboolean marshal_object_path (DBusMessageIter *iter,
- const GValue *value);
-static gboolean demarshal_object_path (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error);
-static gboolean marshal_object (DBusMessageIter *iter,
- const GValue *value);
-static gboolean demarshal_object (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error);
-static gboolean marshal_map (DBusMessageIter *iter,
- const GValue *value);
-static gboolean demarshal_map (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error);
-
-static gboolean marshal_collection (DBusMessageIter *iter,
- const GValue *value);
-static gboolean marshal_collection_ptrarray (DBusMessageIter *iter,
- const GValue *value);
-static gboolean marshal_collection_array (DBusMessageIter *iter,
- const GValue *value);
-static gboolean demarshal_collection (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error);
-static gboolean demarshal_collection_ptrarray (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error);
-static gboolean demarshal_collection_array (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error);
-static gboolean marshal_struct (DBusMessageIter *iter,
- const GValue *value);
-static gboolean demarshal_struct (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error);
-
-
-typedef gboolean (*DBusGValueMarshalFunc) (DBusMessageIter *iter,
- const GValue *value);
-typedef gboolean (*DBusGValueDemarshalFunc) (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error);
-
-typedef struct {
- DBusGValueMarshalFunc marshaller;
- DBusGValueDemarshalFunc demarshaller;
-} DBusGTypeMarshalVtable;
-
-typedef struct {
- const char *sig;
- const DBusGTypeMarshalVtable *vtable;
-} DBusGTypeMarshalData;
-
-static GQuark
-dbus_g_type_metadata_data_quark ()
-{
- static GQuark quark;
- if (!quark)
- quark = g_quark_from_static_string ("DBusGTypeMetaData");
-
- return quark;
-}
-
-static void
-set_type_metadata (GType type, const DBusGTypeMarshalData *data)
-{
- g_type_set_qdata (type, dbus_g_type_metadata_data_quark (), (gpointer) data);
-}
-
-static void
-register_basic (int typecode, const DBusGTypeMarshalData *typedata)
-{
- set_type_metadata (_dbus_gtype_from_basic_typecode (typecode), typedata);
-}
-
-void
-_dbus_g_value_types_init (void)
-{
- static gboolean types_initialized;
-
- static const DBusGTypeMarshalVtable basic_vtable = {
- marshal_basic,
- demarshal_basic
- };
-
- if (types_initialized)
- return;
-
- dbus_g_type_specialized_init ();
- _dbus_g_type_specialized_builtins_init ();
-
- /* Register basic types */
- {
- static const DBusGTypeMarshalData typedata = {
- DBUS_TYPE_BOOLEAN_AS_STRING,
- &basic_vtable,
- };
- register_basic (DBUS_TYPE_BOOLEAN, &typedata);
- }
- {
- static const DBusGTypeMarshalData typedata = {
- DBUS_TYPE_BYTE_AS_STRING,
- &basic_vtable,
- };
- register_basic (DBUS_TYPE_BYTE, &typedata);
- }
- {
- static const DBusGTypeMarshalData typedata = {
- DBUS_TYPE_INT16_AS_STRING,
- &basic_vtable,
- };
- register_basic (DBUS_TYPE_INT16, &typedata);
- }
- {
- static const DBusGTypeMarshalData typedata = {
- DBUS_TYPE_UINT16_AS_STRING,
- &basic_vtable,
- };
- register_basic (DBUS_TYPE_UINT16, &typedata);
- }
- {
- static const DBusGTypeMarshalData typedata = {
- DBUS_TYPE_UINT32_AS_STRING,
- &basic_vtable,
- };
- register_basic (DBUS_TYPE_UINT32, &typedata);
- }
- {
- static const DBusGTypeMarshalData typedata = {
- DBUS_TYPE_INT32_AS_STRING,
- &basic_vtable,
- };
- register_basic (DBUS_TYPE_INT32, &typedata);
- }
- {
- static const DBusGTypeMarshalData typedata = {
- DBUS_TYPE_UINT64_AS_STRING,
- &basic_vtable,
- };
- register_basic (DBUS_TYPE_UINT64, &typedata);
- }
- {
- static const DBusGTypeMarshalData typedata = {
- DBUS_TYPE_INT64_AS_STRING,
- &basic_vtable,
- };
- register_basic (DBUS_TYPE_INT64, &typedata);
- }
- {
- static const DBusGTypeMarshalData typedata = {
- DBUS_TYPE_DOUBLE_AS_STRING,
- &basic_vtable,
- };
- register_basic (DBUS_TYPE_DOUBLE, &typedata);
- }
- {
- static const DBusGTypeMarshalData typedata = {
- DBUS_TYPE_STRING_AS_STRING,
- &basic_vtable,
- };
- register_basic (DBUS_TYPE_STRING, &typedata);
- }
- /* fundamental GTypes that don't map 1:1 with D-BUS types */
- {
- static const DBusGTypeMarshalData typedata = {
- DBUS_TYPE_BYTE_AS_STRING,
- &basic_vtable,
- };
- set_type_metadata (G_TYPE_CHAR, &typedata);
- }
- {
- static const DBusGTypeMarshalData typedata = {
- DBUS_TYPE_INT32_AS_STRING,
- &basic_vtable,
- };
- set_type_metadata (G_TYPE_LONG, &typedata);
- }
- {
- static const DBusGTypeMarshalData typedata = {
- DBUS_TYPE_UINT32_AS_STRING,
- &basic_vtable,
- };
- set_type_metadata (G_TYPE_ULONG, &typedata);
- }
- {
- static const DBusGTypeMarshalData typedata = {
- DBUS_TYPE_DOUBLE_AS_STRING,
- &basic_vtable,
- };
- set_type_metadata (G_TYPE_FLOAT, &typedata);
- }
-
- /* Register complex types with builtin GType mappings */
- {
- static const DBusGTypeMarshalVtable vtable = {
- marshal_variant,
- demarshal_variant
- };
- static const DBusGTypeMarshalData typedata = {
- DBUS_TYPE_VARIANT_AS_STRING,
- &vtable
- };
- set_type_metadata (G_TYPE_VALUE, &typedata);
- };
- {
- static const DBusGTypeMarshalVtable vtable = {
- marshal_strv,
- demarshal_strv
- };
- static const DBusGTypeMarshalData typedata = {
- DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_STRING_AS_STRING,
- &vtable
- };
- set_type_metadata (G_TYPE_STRV, &typedata);
- };
-
-
- /* Register some types specific to the D-BUS GLib bindings */
- {
- static const DBusGTypeMarshalVtable vtable = {
- marshal_proxy,
- demarshal_proxy
- };
- static const DBusGTypeMarshalData typedata = {
- DBUS_TYPE_OBJECT_PATH_AS_STRING,
- &vtable
- };
- set_type_metadata (DBUS_TYPE_G_PROXY, &typedata);
- }
-
- {
- static const DBusGTypeMarshalVtable vtable = {
- marshal_object_path,
- demarshal_object_path
- };
- static const DBusGTypeMarshalData typedata = {
- DBUS_TYPE_OBJECT_PATH_AS_STRING,
- &vtable
- };
- set_type_metadata (DBUS_TYPE_G_OBJECT_PATH, &typedata);
- }
-
- {
- static const DBusGTypeMarshalVtable vtable = {
- marshal_object,
- demarshal_object
- };
- static const DBusGTypeMarshalData typedata = {
- DBUS_TYPE_OBJECT_PATH_AS_STRING,
- &vtable
- };
- set_type_metadata (G_TYPE_OBJECT, &typedata);
- }
-
- types_initialized = TRUE;
-}
-
-/**
- * Get the GLib type ID for a DBusGObjectPath boxed type.
- *
- * @returns GLib type
- */
-GType
-dbus_g_object_path_get_g_type (void)
-{
- static GType type_id = 0;
-
- if (!type_id)
- type_id = g_boxed_type_register_static ("DBusGObjectPath",
- (GBoxedCopyFunc) g_strdup,
- (GBoxedFreeFunc) g_free);
- return type_id;
-}
-
-
-char *
-_dbus_gtype_to_signature (GType gtype)
-{
- char *ret;
- DBusGTypeMarshalData *typedata;
-
- if (dbus_g_type_is_collection (gtype))
- {
- GType elt_gtype;
- char *subsig;
-
- elt_gtype = dbus_g_type_get_collection_specialization (gtype);
- subsig = _dbus_gtype_to_signature (elt_gtype);
- ret = g_strconcat (DBUS_TYPE_ARRAY_AS_STRING, subsig, NULL);
- g_free (subsig);
- }
- else if (dbus_g_type_is_map (gtype))
- {
- GType key_gtype;
- GType val_gtype;
- char *key_subsig;
- char *val_subsig;
-
- key_gtype = dbus_g_type_get_map_key_specialization (gtype);
- val_gtype = dbus_g_type_get_map_value_specialization (gtype);
- key_subsig = _dbus_gtype_to_signature (key_gtype);
- val_subsig = _dbus_gtype_to_signature (val_gtype);
- ret = g_strconcat (DBUS_TYPE_ARRAY_AS_STRING DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING, key_subsig, val_subsig, DBUS_DICT_ENTRY_END_CHAR_AS_STRING, NULL);
- g_free (key_subsig);
- g_free (val_subsig);
- }
- else if (dbus_g_type_is_struct (gtype))
- {
- guint i, size;
- GString *sig;
- size = dbus_g_type_get_struct_size (gtype);
- sig = g_string_sized_new (size+2); /*some sensible starting size*/
- g_string_assign (sig, DBUS_STRUCT_BEGIN_CHAR_AS_STRING);
- for (i = 0; i < size; i++)
- {
- gchar *subsig;
- subsig = _dbus_gtype_to_signature (
- dbus_g_type_get_struct_member_type (gtype, i));
- g_string_append (sig, subsig);
- g_free (subsig);
- }
- g_string_append (sig, DBUS_STRUCT_END_CHAR_AS_STRING);
- ret = g_string_free (sig, FALSE);
- }
- else
- {
- typedata = g_type_get_qdata (gtype, dbus_g_type_metadata_data_quark ());
- if (typedata == NULL)
- return NULL;
- ret = g_strdup (typedata->sig);
- }
- return ret;
-}
-
-char *
-_dbus_gvalue_to_signature (const GValue *val)
-{
- GType gtype;
-
- gtype = G_VALUE_TYPE (val);
- if (g_type_is_a (gtype, G_TYPE_VALUE_ARRAY))
- {
- GString *str;
- guint i;
- GValueArray *array;
-
- array = g_value_get_boxed (val);
-
- str = g_string_new (DBUS_STRUCT_BEGIN_CHAR_AS_STRING);
- for (i = 0; i < array->n_values; i++)
- {
- char *sig;
- sig = _dbus_gvalue_to_signature (g_value_array_get_nth (array, i));
- g_string_append (str, sig);
- g_free (sig);
- }
- g_string_append (str, DBUS_STRUCT_END_CHAR_AS_STRING);
-
- return g_string_free (str, FALSE);
- }
- else
- return _dbus_gtype_to_signature (gtype);
-}
-
-static gboolean
-demarshal_basic (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error)
-{
- int current_type;
-
- current_type = dbus_message_iter_get_arg_type (iter);
- g_assert (dbus_type_is_basic (current_type));
-
- switch (current_type)
- {
- case DBUS_TYPE_BOOLEAN:
- {
- dbus_bool_t bool;
- dbus_message_iter_get_basic (iter, &bool);
- g_value_set_boolean (value, bool);
- return TRUE;
- }
- case DBUS_TYPE_BYTE:
- {
- unsigned char byte;
- dbus_message_iter_get_basic (iter, &byte);
- g_value_set_uchar (value, byte);
- return TRUE;
- }
- case DBUS_TYPE_INT32:
- {
- dbus_int32_t intval;
- dbus_message_iter_get_basic (iter, &intval);
- g_value_set_int (value, intval);
- return TRUE;
- }
- case DBUS_TYPE_UINT32:
- {
- dbus_uint32_t intval;
- dbus_message_iter_get_basic (iter, &intval);
- g_value_set_uint (value, intval);
- return TRUE;
- }
- case DBUS_TYPE_INT64:
- {
- dbus_int64_t intval;
- dbus_message_iter_get_basic (iter, &intval);
- g_value_set_int64 (value, intval);
- return TRUE;
- }
- case DBUS_TYPE_UINT64:
- {
- dbus_uint64_t intval;
- dbus_message_iter_get_basic (iter, &intval);
- g_value_set_uint64 (value, intval);
- return TRUE;
- }
- case DBUS_TYPE_DOUBLE:
- {
- double dval;
- dbus_message_iter_get_basic (iter, &dval);
- g_value_set_double (value, dval);
- return TRUE;
- }
- case DBUS_TYPE_INT16:
- {
- dbus_int16_t v;
- dbus_message_iter_get_basic (iter, &v);
- g_value_set_int (value, v);
- return TRUE;
- }
- case DBUS_TYPE_UINT16:
- {
- dbus_uint16_t v;
- dbus_message_iter_get_basic (iter, &v);
- g_value_set_uint (value, v);
- return TRUE;
- }
- case DBUS_TYPE_STRING:
- {
- const char *s;
- dbus_message_iter_get_basic (iter, &s);
- g_value_set_string (value, s);
- return TRUE;
- }
- default:
- g_assert_not_reached ();
- return FALSE;
- }
-}
-
-static gboolean
-demarshal_static_variant (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error)
-{
- char *sig;
- int current_type;
- DBusMessageIter subiter;
- GType variant_type;
-
- current_type = dbus_message_iter_get_arg_type (iter);
- dbus_message_iter_recurse (iter, &subiter);
- sig = dbus_message_iter_get_signature (&subiter);
-
- variant_type = _dbus_gtype_from_signature (sig, context->proxy != NULL);
- if (variant_type != G_TYPE_INVALID)
- {
- g_value_init (value, variant_type);
-
- if (!_dbus_gvalue_demarshal (context, &subiter, value, error))
- {
- dbus_free (sig);
- return FALSE;
- }
- }
- dbus_free (sig);
- return TRUE;
-}
-
-static gboolean
-demarshal_variant (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error)
-
-{
- GValue *variant_val;
- variant_val = g_new0 (GValue, 1);
-
- if (!demarshal_static_variant (context, iter, variant_val, error))
- return FALSE;
-
- g_value_set_boxed_take_ownership (value, variant_val);
- return TRUE;
-}
-
-static gboolean
-demarshal_proxy (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error)
-{
- DBusGProxy *new_proxy;
- const char *objpath;
- int current_type;
-
- current_type = dbus_message_iter_get_arg_type (iter);
- if (current_type != DBUS_TYPE_OBJECT_PATH)
- {
- g_set_error (error,
- DBUS_GERROR,
- DBUS_GERROR_INVALID_ARGS,
- _("Expected D-BUS object path, got type code \'%c\'"), (guchar) current_type);
- return FALSE;
- }
-
- g_assert (context->proxy != NULL);
-
- dbus_message_iter_get_basic (iter, &objpath);
-
- new_proxy = dbus_g_proxy_new_from_proxy (context->proxy, NULL, objpath);
- g_value_set_object_take_ownership (value, new_proxy);
-
- return TRUE;
-}
-
-static gboolean
-demarshal_object_path (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error)
-{
- const char *objpath;
- int current_type;
-
- current_type = dbus_message_iter_get_arg_type (iter);
- if (current_type != DBUS_TYPE_OBJECT_PATH)
- {
- g_set_error (error,
- DBUS_GERROR,
- DBUS_GERROR_INVALID_ARGS,
- _("Expected D-BUS object path, got type code \'%c\'"), (guchar) current_type);
- return FALSE;
- }
-
- dbus_message_iter_get_basic (iter, &objpath);
-
- g_value_set_boxed_take_ownership (value, g_strdup (objpath));
-
- return TRUE;
-}
-
-static gboolean
-demarshal_object (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error)
-{
- const char *objpath;
- int current_type;
- GObject *obj;
-
- current_type = dbus_message_iter_get_arg_type (iter);
- if (current_type != DBUS_TYPE_OBJECT_PATH)
- {
- g_set_error (error,
- DBUS_GERROR,
- DBUS_GERROR_INVALID_ARGS,
- _("Expected D-BUS object path, got type code \'%c\'"), (guchar) current_type);
- return FALSE;
- }
- g_assert (context->proxy == NULL);
-
- dbus_message_iter_get_basic (iter, &objpath);
-
- obj = dbus_g_connection_lookup_g_object (context->gconnection, objpath);
- if (obj == NULL)
- {
- g_set_error (error,
- DBUS_GERROR,
- DBUS_GERROR_INVALID_ARGS,
- _("Unregistered object at path '%s'"),
- objpath);
- return FALSE;
- }
- g_value_set_object (value, obj);
-
- return TRUE;
-}
-
-static gboolean
-demarshal_strv (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error)
-{
- DBusMessageIter subiter;
- int current_type;
- char **ret;
- int len;
- int i;
-
- current_type = dbus_message_iter_get_arg_type (iter);
- if (current_type != DBUS_TYPE_ARRAY)
- {
- g_set_error (error,
- DBUS_GERROR,
- DBUS_GERROR_INVALID_ARGS,
- _("Expected D-BUS array, got type code \'%c\'"), (guchar) current_type);
- return FALSE;
- }
-
- dbus_message_iter_recurse (iter, &subiter);
-
- current_type = dbus_message_iter_get_arg_type (&subiter);
- if (current_type != DBUS_TYPE_INVALID
- && current_type != DBUS_TYPE_STRING)
- {
- g_set_error (error,
- DBUS_GERROR,
- DBUS_GERROR_INVALID_ARGS,
- _("Expected D-BUS string, got type code \'%c\'"), (guchar) current_type);
- return FALSE;
- }
-
- len = dbus_message_iter_get_array_len (&subiter);
- g_assert (len >= 0);
- ret = g_malloc (sizeof (char *) * (len + 1));
-
- i = 0;
- while ((current_type = dbus_message_iter_get_arg_type (&subiter)) != DBUS_TYPE_INVALID)
- {
- g_assert (i < len);
- g_assert (current_type == DBUS_TYPE_STRING);
-
- dbus_message_iter_get_basic (&subiter, &(ret[i]));
- ret[i] = g_strdup (ret[i]);
-
- dbus_message_iter_next (&subiter);
- i++;
- }
- ret[i] = NULL;
- g_value_set_boxed_take_ownership (value, ret);
-
- return TRUE;
-}
-
-static gboolean
-demarshal_valuearray (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error)
-{
- int current_type;
- GValueArray *ret;
- DBusMessageIter subiter;
-
- current_type = dbus_message_iter_get_arg_type (iter);
- if (current_type != DBUS_TYPE_STRUCT)
- {
- g_set_error (error,
- DBUS_GERROR,
- DBUS_GERROR_INVALID_ARGS,
- _("Expected D-BUS struct, got type code \'%c\'"), (guchar) current_type);
- return FALSE;
- }
-
- dbus_message_iter_recurse (iter, &subiter);
-
- ret = g_value_array_new (12);
-
- while ((current_type = dbus_message_iter_get_arg_type (&subiter)) != DBUS_TYPE_INVALID)
- {
- GValue *val;
- GType elt_type;
- char *current_sig;
-
- g_value_array_append (ret, NULL);
- val = g_value_array_get_nth (ret, ret->n_values - 1);
-
- current_sig = dbus_message_iter_get_signature (&subiter);
- elt_type = _dbus_gtype_from_signature (current_sig, TRUE);
-
- dbus_free (current_sig);
- if (elt_type == G_TYPE_INVALID)
- {
- g_value_array_free (ret);
- g_set_error (error,
- DBUS_GERROR,
- DBUS_GERROR_INVALID_ARGS,
- _("Couldn't demarshal argument with signature \"%s\""), current_sig);
- return FALSE;
- }
-
- g_value_init (val, elt_type);
-
- if (!_dbus_gvalue_demarshal (context, &subiter, val, error))
- {
- g_value_array_free (ret);
- return FALSE;
- }
-
- dbus_message_iter_next (&subiter);
- }
-
- g_value_set_boxed_take_ownership (value, ret);
-
- return TRUE;
-}
-
-static gboolean
-demarshal_map (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error)
-{
- GType gtype;
- DBusMessageIter subiter;
- int current_type;
- gpointer ret;
- GType key_gtype;
- GType value_gtype;
- DBusGTypeSpecializedAppendContext appendctx;
-
- current_type = dbus_message_iter_get_arg_type (iter);
- if (current_type != DBUS_TYPE_ARRAY)
- {
- g_set_error (error,
- DBUS_GERROR,
- DBUS_GERROR_INVALID_ARGS,
- _("Expected D-BUS array, got type code \'%c\'"), (guchar) current_type);
- return FALSE;
- }
-
- gtype = G_VALUE_TYPE (value);
-
- dbus_message_iter_recurse (iter, &subiter);
-
- current_type = dbus_message_iter_get_arg_type (&subiter);
- if (current_type != DBUS_TYPE_INVALID
- && current_type != DBUS_TYPE_DICT_ENTRY)
- {
- g_set_error (error,
- DBUS_GERROR,
- DBUS_GERROR_INVALID_ARGS,
- _("Expected D-BUS dict entry, got type code \'%c\'"), (guchar) current_type);
- return FALSE;
- }
-
- key_gtype = dbus_g_type_get_map_key_specialization (gtype);
- value_gtype = dbus_g_type_get_map_value_specialization (gtype);
-
- ret = dbus_g_type_specialized_construct (gtype);
- g_value_set_boxed_take_ownership (value, ret);
-
- dbus_g_type_specialized_init_append (value, &appendctx);
-
- while ((current_type = dbus_message_iter_get_arg_type (&subiter)) != DBUS_TYPE_INVALID)
- {
- DBusMessageIter entry_iter;
- GValue key_value = {0,};
- GValue value_value = {0,};
-
- current_type = dbus_message_iter_get_arg_type (&subiter);
- g_assert (current_type == DBUS_TYPE_DICT_ENTRY);
-
- dbus_message_iter_recurse (&subiter, &entry_iter);
-
- g_value_init (&key_value, key_gtype);
- if (!_dbus_gvalue_demarshal (context,
- &entry_iter,
- &key_value,
- error))
- return FALSE;
-
- dbus_message_iter_next (&entry_iter);
-
- g_value_init (&value_value, value_gtype);
- if (!_dbus_gvalue_demarshal (context,
- &entry_iter,
- &value_value,
- error))
- return FALSE;
-
- dbus_g_type_specialized_map_append (&appendctx, &key_value, &value_value);
- /* Ownership of values passes to map, don't unset */
-
- dbus_message_iter_next (&subiter);
- }
-
- return TRUE;
-}
-
-static gboolean
-demarshal_struct (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error)
-{
- int current_type;
- DBusMessageIter subiter;
- guint i, size;
- GValue val = {0,};
- GType elt_type;
-
- current_type = dbus_message_iter_get_arg_type (iter);
- if (current_type != DBUS_TYPE_STRUCT)
- {
- g_set_error (error,
- DBUS_GERROR,
- DBUS_GERROR_INVALID_ARGS,
- _("Expected D-BUS struct, got type code \'%c\'"), (guchar) current_type);
- return FALSE;
- }
-
- dbus_message_iter_recurse (iter, &subiter);
-
- g_value_set_boxed_take_ownership (value,
- dbus_g_type_specialized_construct (G_VALUE_TYPE (value)));
-
- size = dbus_g_type_get_struct_size (G_VALUE_TYPE (value));
-
- for (i=0; i < size; i++)
- {
-
- elt_type = dbus_g_type_get_struct_member_type (G_VALUE_TYPE(value), i);
- if (elt_type == G_TYPE_INVALID)
- {
- g_value_unset (value);
- g_set_error (error,
- DBUS_GERROR,
- DBUS_GERROR_INVALID_ARGS,
- _("Couldn't demarshal argument, "
- "struct type %s has no member %d"),
- g_type_name (G_VALUE_TYPE(value)), i);
- return FALSE;
- }
-
- g_value_init (&val, elt_type);
-
- if (!_dbus_gvalue_demarshal (context, &subiter, &val, error))
- {
- g_value_unset (&val);
- g_value_unset (value);
- return FALSE;
- }
- if (!dbus_g_type_struct_set_member (value, i, &val))
- {
- g_value_unset (&val);
- g_value_unset (value);
- return FALSE;
- }
-
- dbus_message_iter_next (&subiter);
- g_value_unset (&val);
- }
-
- g_assert (dbus_message_iter_get_arg_type (&subiter) == DBUS_TYPE_INVALID);
-
- return TRUE;
-}
-
-
-static DBusGValueDemarshalFunc
-get_type_demarshaller (GType type)
-{
- DBusGTypeMarshalData *typedata;
-
- typedata = g_type_get_qdata (type, dbus_g_type_metadata_data_quark ());
- if (typedata == NULL)
- {
- if (g_type_is_a (type, G_TYPE_VALUE_ARRAY))
- return demarshal_valuearray;
- if (dbus_g_type_is_collection (type))
- return demarshal_collection;
- if (dbus_g_type_is_map (type))
- return demarshal_map;
- if (dbus_g_type_is_struct (type))
- return demarshal_struct;
-
- g_warning ("No demarshaller registered for type \"%s\"", g_type_name (type));
- return NULL;
- }
- g_assert (typedata->vtable);
- return typedata->vtable->demarshaller;
-}
-
-static gboolean
-demarshal_collection (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error)
-{
- GType coltype;
- GType subtype;
-
- coltype = G_VALUE_TYPE (value);
- subtype = dbus_g_type_get_collection_specialization (coltype);
-
- if (_dbus_g_type_is_fixed (subtype))
- return demarshal_collection_array (context, iter, value, error);
- else
- return demarshal_collection_ptrarray (context, iter, value, error);
-}
-
-static gboolean
-demarshal_collection_ptrarray (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error)
-{
- GType coltype;
- GType subtype;
- gpointer instance;
- DBusGTypeSpecializedAppendContext ctx;
- DBusGValueDemarshalFunc demarshaller;
- DBusMessageIter subiter;
- int current_type;
-
- current_type = dbus_message_iter_get_arg_type (iter);
-
- if (current_type != DBUS_TYPE_ARRAY)
- {
- g_set_error (error,
- DBUS_GERROR,
- DBUS_GERROR_INVALID_ARGS,
- _("Expected D-BUS array, got type code \'%c\'"), (guchar) current_type);
- return FALSE;
- }
-
- dbus_message_iter_recurse (iter, &subiter);
-
- coltype = G_VALUE_TYPE (value);
- subtype = dbus_g_type_get_collection_specialization (coltype);
-
- demarshaller = get_type_demarshaller (subtype);
-
- if (!demarshaller)
- {
- g_set_error (error,
- DBUS_GERROR,
- DBUS_GERROR_INVALID_ARGS,
- _("No demarshaller registered for type \"%s\" of collection \"%s\""),
- g_type_name (coltype),
- g_type_name (subtype));
- return FALSE;
- }
-
- instance = dbus_g_type_specialized_construct (coltype);
- g_value_set_boxed_take_ownership (value, instance);
-
- dbus_g_type_specialized_init_append (value, &ctx);
-
- while ((current_type = dbus_message_iter_get_arg_type (&subiter)) != DBUS_TYPE_INVALID)
- {
- GValue eltval = {0, };
-
- g_value_init (&eltval, subtype);
-
- if (!demarshaller (context, &subiter, &eltval, error))
- {
- dbus_g_type_specialized_collection_end_append (&ctx);
- g_value_unset (value);
- return FALSE;
- }
- dbus_g_type_specialized_collection_append (&ctx, &eltval);
-
- dbus_message_iter_next (&subiter);
- }
- dbus_g_type_specialized_collection_end_append (&ctx);
-
- return TRUE;
-}
-
-static gboolean
-demarshal_collection_array (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error)
-{
- DBusMessageIter subiter;
- GArray *ret;
- GType elt_gtype;
- int elt_size;
- void *msgarray;
- int msgarray_len;
-
- dbus_message_iter_recurse (iter, &subiter);
-
- elt_gtype = dbus_g_type_get_collection_specialization (G_VALUE_TYPE (value));
- g_assert (elt_gtype != G_TYPE_INVALID);
- g_assert (_dbus_g_type_is_fixed (elt_gtype));
-
- elt_size = _dbus_g_type_fixed_get_size (elt_gtype);
-
- ret = g_array_new (FALSE, TRUE, elt_size);
-
- msgarray = NULL;
- dbus_message_iter_get_fixed_array (&subiter,
- &msgarray,
- &msgarray_len);
- g_assert (msgarray != NULL || msgarray_len == 0);
-
- if (msgarray_len)
- g_array_append_vals (ret, msgarray, (guint) msgarray_len);
-
- g_value_set_boxed_take_ownership (value, ret);
-
- return TRUE;
-}
-
-gboolean
-_dbus_gvalue_demarshal (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error)
-{
- GType gtype;
- DBusGValueDemarshalFunc demarshaller;
-
- gtype = G_VALUE_TYPE (value);
-
- demarshaller = get_type_demarshaller (gtype);
-
- if (demarshaller == NULL)
- {
- g_set_error (error,
- DBUS_GERROR,
- DBUS_GERROR_INVALID_ARGS,
- _("No demarshaller registered for type \"%s\""),
- g_type_name (gtype));
- return FALSE;
- }
-
- return demarshaller (context, iter, value, error);
-}
-
-gboolean
-_dbus_gvalue_demarshal_variant (DBusGValueMarshalCtx *context,
- DBusMessageIter *iter,
- GValue *value,
- GError **error)
-{
- return demarshal_static_variant (context, iter, value, error);
-}
-
-GValueArray *
-_dbus_gvalue_demarshal_message (DBusGValueMarshalCtx *context,
- DBusMessage *message,
- guint n_types,
- const GType *types,
- GError **error)
-{
- GValueArray *ret;
- DBusMessageIter iter;
- int current_type;
- guint index;
-
- ret = g_value_array_new (6); /* 6 is a typical maximum for arguments */
-
- dbus_message_iter_init (message, &iter);
- index = 0;
- while ((current_type = dbus_message_iter_get_arg_type (&iter)) != DBUS_TYPE_INVALID)
- {
- GValue *value;
- GType gtype;
-
- if (index >= n_types)
- {
- g_set_error (error, DBUS_GERROR,
- DBUS_GERROR_INVALID_ARGS,
- _("Too many arguments in message"));
- goto lose;
- }
-
- g_value_array_append (ret, NULL);
- value = g_value_array_get_nth (ret, index);
-
- gtype = types[index];
- g_value_init (value, gtype);
-
- if (!_dbus_gvalue_demarshal (context, &iter, value, error))
- goto lose;
- dbus_message_iter_next (&iter);
- index++;
- }
- if (index < n_types)
- {
- g_set_error (error, DBUS_GERROR,
- DBUS_GERROR_INVALID_ARGS,
- _("Too few arguments in message"));
- goto lose;
- }
-
- return ret;
- lose:
- g_value_array_free (ret);
- return NULL;
-}
-
-static gboolean
-marshal_basic (DBusMessageIter *iter, const GValue *value)
-{
- GType value_type;
-
- value_type = G_VALUE_TYPE (value);
-
- switch (value_type)
- {
- case G_TYPE_CHAR:
- {
- char b = g_value_get_char (value);
- if (!dbus_message_iter_append_basic (iter,
- DBUS_TYPE_BYTE,
- &b))
- goto nomem;
- }
- return TRUE;
- case G_TYPE_UCHAR:
- {
- unsigned char b = g_value_get_uchar (value);
- if (!dbus_message_iter_append_basic (iter,
- DBUS_TYPE_BYTE,
- &b))
- goto nomem;
- }
- return TRUE;
- case G_TYPE_BOOLEAN:
- {
- dbus_bool_t b = g_value_get_boolean (value);
- if (!dbus_message_iter_append_basic (iter,
- DBUS_TYPE_BOOLEAN,
- &b))
- goto nomem;
- }
- return TRUE;
- case G_TYPE_INT:
- {
- dbus_int32_t v = g_value_get_int (value);
- if (!dbus_message_iter_append_basic (iter,
- DBUS_TYPE_INT32,
- &v))
- goto nomem;
- }
- return TRUE;
- case G_TYPE_UINT:
- {
- dbus_uint32_t v = g_value_get_uint (value);
- if (!dbus_message_iter_append_basic (iter,
- DBUS_TYPE_UINT32,
- &v))
- goto nomem;
- }
- return TRUE;
- case G_TYPE_LONG:
- {
- dbus_int32_t v = g_value_get_long (value);
- if (!dbus_message_iter_append_basic (iter,
- DBUS_TYPE_INT32,
- &v))
- goto nomem;
- }
- return TRUE;
- case G_TYPE_ULONG:
- {
- dbus_uint32_t v = g_value_get_ulong (value);
- if (!dbus_message_iter_append_basic (iter,
- DBUS_TYPE_UINT32,
- &v))
- goto nomem;
- }
- return TRUE;
- case G_TYPE_INT64:
- {
- gint64 v = g_value_get_int64 (value);
- if (!dbus_message_iter_append_basic (iter,
- DBUS_TYPE_INT64,
- &v))
- goto nomem;
- }
- return TRUE;
- case G_TYPE_UINT64:
- {
- guint64 v = g_value_get_uint64 (value);
- if (!dbus_message_iter_append_basic (iter,
- DBUS_TYPE_UINT64,
- &v))
- goto nomem;
- }
- return TRUE;
- case G_TYPE_FLOAT:
- {
- double v = g_value_get_float (value);
-
- if (!dbus_message_iter_append_basic (iter,
- DBUS_TYPE_DOUBLE,
- &v))
- goto nomem;
- }
- return TRUE;
- case G_TYPE_DOUBLE:
- {
- double v = g_value_get_double (value);
-
- if (!dbus_message_iter_append_basic (iter,
- DBUS_TYPE_DOUBLE,
- &v))
- goto nomem;
- }
- return TRUE;
- case G_TYPE_STRING:
- /* FIXME, the GValue string may not be valid UTF-8 */
- {
- const char *v = g_value_get_string (value);
- if (!v)
- v = "";
- if (!dbus_message_iter_append_basic (iter,
- DBUS_TYPE_STRING,
- &v))
- goto nomem;
- }
- return TRUE;
-
- default:
- {
- g_assert_not_reached ();
- return FALSE;
- }
- }
-
- nomem:
- g_error ("no memory");
- return FALSE;
-}
-
-static gboolean
-marshal_strv (DBusMessageIter *iter,
- const GValue *value)
-{
- DBusMessageIter subiter;
- char **array;
- char **elt;
- gboolean ret = FALSE;
-
- g_assert (G_VALUE_TYPE (value) == g_strv_get_type ());
-
- array = g_value_get_boxed (value);
-
- if (!dbus_message_iter_open_container (iter,
- DBUS_TYPE_ARRAY,
- "s",
- &subiter))
- goto out;
-
- for (elt = array; *elt; elt++)
- {
- if (!dbus_message_iter_append_basic (&subiter,
- DBUS_TYPE_STRING,
- elt))
- goto out;
- }
-
- if (!dbus_message_iter_close_container (iter, &subiter))
- goto out;
- ret = TRUE;
- out:
- return ret;
-}
-
-static gboolean
-marshal_valuearray (DBusMessageIter *iter,
- const GValue *value)
-{
- GValueArray *array;
- guint i;
- DBusMessageIter subiter;
-
- g_assert (G_VALUE_TYPE (value) == G_TYPE_VALUE_ARRAY);
-
- array = g_value_get_boxed (value);
-
- if (!dbus_message_iter_open_container (iter,
- DBUS_TYPE_STRUCT,
- NULL,
- &subiter))
- goto oom;
-
- for (i = 0; i < array->n_values; i++)
- {
- if (!_dbus_gvalue_marshal (&subiter, g_value_array_get_nth (array, i)))
- return FALSE;
- }
-
- if (!dbus_message_iter_close_container (iter, &subiter))
- goto oom;
-
- return TRUE;
- oom:
- g_error ("out of memory");
- return FALSE;
-}
-
-static gboolean
-marshal_proxy (DBusMessageIter *iter,
- const GValue *value)
-{
- const char *path;
- DBusGProxy *proxy;
-
- g_assert (G_VALUE_TYPE (value) == dbus_g_proxy_get_type ());
-
- proxy = g_value_get_object (value);
- path = dbus_g_proxy_get_path (proxy);
-
- if (!dbus_message_iter_append_basic (iter,
- DBUS_TYPE_OBJECT_PATH,
- &path))
- return FALSE;
- return TRUE;
-}
-
-static gboolean
-marshal_object_path (DBusMessageIter *iter,
- const GValue *value)
-{
- const char *path;
-
- g_assert (G_VALUE_TYPE (value) == DBUS_TYPE_G_OBJECT_PATH);
-
- path = (const char*) g_value_get_boxed (value);
-
- if (!dbus_message_iter_append_basic (iter,
- DBUS_TYPE_OBJECT_PATH,
- &path))
- return FALSE;
- return TRUE;
-}
-
-static gboolean
-marshal_object (DBusMessageIter *iter,
- const GValue *value)
-{
- const char *path;
- GObject *obj;
-
- obj = g_value_get_object (value);
- path = _dbus_gobject_get_path (obj);
-
- if (path == NULL)
- /* FIXME should throw error */
- return FALSE;
-
- if (!dbus_message_iter_append_basic (iter,
- DBUS_TYPE_OBJECT_PATH,
- &path))
- return FALSE;
- return TRUE;
-}
-
-struct DBusGLibHashMarshalData
-{
- const char *entry_sig;
- DBusMessageIter *iter;
- gboolean err;
-};
-
-static void
-marshal_map_entry (const GValue *key,
- const GValue *value,
- gpointer data)
-{
- struct DBusGLibHashMarshalData *hashdata = data;
- DBusMessageIter subiter;
-
- if (hashdata->err)
- return;
-
- if (!dbus_message_iter_open_container (hashdata->iter,
- DBUS_TYPE_DICT_ENTRY,
- NULL,
- &subiter))
- goto lose;
-
- if (!_dbus_gvalue_marshal (&subiter, key))
- goto lose;
-
- if (!_dbus_gvalue_marshal (&subiter, value))
- goto lose;
-
- if (!dbus_message_iter_close_container (hashdata->iter, &subiter))
- goto lose;
-
- return;
- lose:
- hashdata->err = TRUE;
-}
-
-static gboolean
-marshal_map (DBusMessageIter *iter,
- const GValue *value)
-{
- GType gtype;
- DBusMessageIter arr_iter;
- gboolean ret;
- struct DBusGLibHashMarshalData hashdata;
- char *key_sig;
- char *value_sig;
- GType key_type;
- GType value_type;
- char *entry_sig;
- char *array_sig;
-
- gtype = G_VALUE_TYPE (value);
-
- ret = FALSE;
-
- key_type = dbus_g_type_get_map_key_specialization (gtype);
- g_assert (_dbus_gtype_is_valid_hash_key (key_type));
- value_type = dbus_g_type_get_map_value_specialization (gtype);
- g_assert (_dbus_gtype_is_valid_hash_value (value_type));
-
- key_sig = _dbus_gtype_to_signature (key_type);
- if (!key_sig)
- {
- g_warning ("Cannot marshal type \"%s\" in map\n", g_type_name (key_type));
- return FALSE;
- }
- value_sig = _dbus_gtype_to_signature (value_type);
- if (!value_sig)
- {
- g_free (key_sig);
- g_warning ("Cannot marshal type \"%s\" in map\n", g_type_name (value_type));
- return FALSE;
- }
- entry_sig = g_strdup_printf ("%s%s", key_sig, value_sig);
- g_free (key_sig);
- g_free (value_sig);
- array_sig = g_strdup_printf ("%c%s%c",
- DBUS_DICT_ENTRY_BEGIN_CHAR,
- entry_sig,
- DBUS_DICT_ENTRY_END_CHAR);
- if (!dbus_message_iter_open_container (iter,
- DBUS_TYPE_ARRAY,
- array_sig,
- &arr_iter))
- goto lose;
-
- hashdata.iter = &arr_iter;
- hashdata.err = FALSE;
- hashdata.entry_sig = entry_sig;
-
- dbus_g_type_map_value_iterate (value,
- marshal_map_entry,
- &hashdata);
-
- if (!dbus_message_iter_close_container (iter, &arr_iter))
- goto lose;
-
- out:
- g_free (entry_sig);
- g_free (array_sig);
- return !hashdata.err;
- lose:
- hashdata.err = TRUE;
- goto out;
-}
-
-static gboolean
-marshal_struct (DBusMessageIter *iter,
- const GValue *value)
-{
- GType gtype;
- DBusMessageIter subiter;
- gboolean ret;
- guint size, i;
- GValue val = {0,};
-
- gtype = G_VALUE_TYPE (value);
-
- ret = FALSE;
-
- size = dbus_g_type_get_struct_size (gtype);
-
- if (!dbus_message_iter_open_container (iter,
- DBUS_TYPE_STRUCT,
- NULL,
- &subiter))
- goto oom;
-
- for (i = 0; i < size; i++)
- {
- g_value_init (&val, dbus_g_type_get_struct_member_type
- (G_VALUE_TYPE(value), i));
- if (!dbus_g_type_struct_get_member (value, i, &val))
- return FALSE;
- if (!_dbus_gvalue_marshal (&subiter, &val))
- return FALSE;
- g_value_unset(&val);
- }
-
- if (!dbus_message_iter_close_container (iter, &subiter))
- goto oom;
-
- return TRUE;
- oom:
- g_error ("out of memory");
- return FALSE;
-}
-
-static gboolean
-marshal_variant (DBusMessageIter *iter,
- const GValue *value)
-{
- GType value_gtype;
- DBusMessageIter subiter;
- char *variant_sig;
- GValue *real_value;
- gboolean ret = FALSE;
-
- real_value = g_value_get_boxed (value);
- value_gtype = G_VALUE_TYPE (real_value);
-
- variant_sig = _dbus_gvalue_to_signature (real_value);
- if (variant_sig == NULL)
- {
- g_warning ("Cannot marshal type \"%s\" in variant", g_type_name (value_gtype));
- return FALSE;
- }
-
- if (!dbus_message_iter_open_container (iter,
- DBUS_TYPE_VARIANT,
- variant_sig,
- &subiter))
- goto out;
-
- if (!_dbus_gvalue_marshal (&subiter, real_value))
- goto out;
-
- if (!dbus_message_iter_close_container (iter, &subiter))
- goto out;
-
- ret = TRUE;
- out:
- g_free (variant_sig);
- return ret;
-}
-
-static DBusGValueMarshalFunc
-get_type_marshaller (GType type)
-{
- DBusGTypeMarshalData *typedata;
-
- typedata = g_type_get_qdata (type, dbus_g_type_metadata_data_quark ());
- if (typedata == NULL)
- {
- if (g_type_is_a (type, G_TYPE_VALUE_ARRAY))
- return marshal_valuearray;
- if (dbus_g_type_is_collection (type))
- return marshal_collection;
- if (dbus_g_type_is_map (type))
- return marshal_map;
- if (dbus_g_type_is_struct (type))
- return marshal_struct;
-
- g_warning ("No marshaller registered for type \"%s\"", g_type_name (type));
- return NULL;
- }
- g_assert (typedata->vtable);
- return typedata->vtable->marshaller;
-}
-
-typedef struct
-{
- DBusMessageIter *iter;
- DBusGValueMarshalFunc marshaller;
- gboolean err;
-} DBusGValueCollectionMarshalData;
-
-static void
-collection_marshal_iterator (const GValue *eltval,
- gpointer user_data)
-{
- DBusGValueCollectionMarshalData *data = user_data;
-
- if (data->err)
- return;
-
- if (!data->marshaller (data->iter, eltval))
- data->err = TRUE;
-}
-
-static gboolean
-marshal_collection (DBusMessageIter *iter,
- const GValue *value)
-{
- GType coltype;
- GType subtype;
-
- coltype = G_VALUE_TYPE (value);
- subtype = dbus_g_type_get_collection_specialization (coltype);
-
- if (_dbus_g_type_is_fixed (subtype))
- return marshal_collection_array (iter, value);
- else
- return marshal_collection_ptrarray (iter, value);
-}
-
-static gboolean
-marshal_collection_ptrarray (DBusMessageIter *iter,
- const GValue *value)
-{
- GType coltype;
- GType elt_gtype;
- DBusGValueCollectionMarshalData data;
- DBusMessageIter subiter;
- char *elt_sig;
-
- coltype = G_VALUE_TYPE (value);
- elt_gtype = dbus_g_type_get_collection_specialization (coltype);
- data.marshaller = get_type_marshaller (elt_gtype);
- if (!data.marshaller)
- return FALSE;
-
- elt_sig = _dbus_gtype_to_signature (elt_gtype);
- if (!elt_sig)
- {
- g_warning ("Cannot marshal type \"%s\" in collection\n", g_type_name (elt_gtype));
- return FALSE;
- }
-
- if (!dbus_message_iter_open_container (iter,
- DBUS_TYPE_ARRAY,
- elt_sig,
- &subiter))
- goto oom;
- g_free (elt_sig);
-
- data.iter = &subiter;
- data.err = FALSE;
-
- dbus_g_type_collection_value_iterate (value,
- collection_marshal_iterator,
- &data);
-
- if (!dbus_message_iter_close_container (iter, &subiter))
- goto oom;
-
- return !data.err;
- oom:
- g_error ("out of memory");
- return FALSE;
-}
-
-
-static gboolean
-marshal_collection_array (DBusMessageIter *iter,
- const GValue *value)
-{
- GType elt_gtype;
- DBusMessageIter subiter;
- GArray *array;
- guint elt_size;
- char *subsignature_str;
-
- elt_gtype = dbus_g_type_get_collection_specialization (G_VALUE_TYPE (value));
- g_assert (_dbus_g_type_is_fixed (elt_gtype));
- subsignature_str = _dbus_gtype_to_signature (elt_gtype);
- if (!subsignature_str)
- {
- g_warning ("Cannot marshal type \"%s\" in collection\n", g_type_name (elt_gtype));
- return FALSE;
- }
-
- elt_size = _dbus_g_type_fixed_get_size (elt_gtype);
-
- array = g_value_get_boxed (value);
-
- if (!dbus_message_iter_open_container (iter,
- DBUS_TYPE_ARRAY,
- subsignature_str,
- &subiter))
- goto oom;
-
- /* TODO - This assumes that basic values are the same size
- * is this always true? If it is we can probably avoid
- * a lot of the overhead in _marshal_basic_instance...
- */
- if (!dbus_message_iter_append_fixed_array (&subiter,
- subsignature_str[0],
- &(array->data),
- array->len))
- goto oom;
-
- if (!dbus_message_iter_close_container (iter, &subiter))
- goto oom;
- g_free (subsignature_str);
- return TRUE;
- oom:
- g_error ("out of memory");
- return FALSE;
-}
-
-gboolean
-_dbus_gvalue_marshal (DBusMessageIter *iter,
- const GValue *value)
-{
- GType gtype;
- DBusGValueMarshalFunc marshaller;
-
- gtype = G_VALUE_TYPE (value);
-
- marshaller = get_type_marshaller (gtype);
- if (marshaller == NULL)
- return FALSE;
- return marshaller (iter, value);
-}
-
-#ifdef DBUS_BUILD_TESTS
-
-static void
-assert_type_maps_to (GType gtype, const char *expected_sig)
-{
- char *sig;
- sig = _dbus_gtype_to_signature (gtype);
- g_assert (sig != NULL);
- g_assert (!strcmp (expected_sig, sig));
- g_free (sig);
-}
-
-static void
-assert_signature_maps_to (const char *sig, GType expected_gtype)
-{
- g_assert (_dbus_gtype_from_signature (sig, TRUE) == expected_gtype);
-}
-
-static void
-assert_bidirectional_mapping (GType gtype, const char *expected_sig)
-{
- assert_type_maps_to (gtype, expected_sig);
- assert_signature_maps_to (expected_sig, gtype);
-}
-
-/**
- * @ingroup DBusGLibInternals
- * Unit test for general glib stuff
- * @returns #TRUE on success.
- */
-gboolean
-_dbus_gvalue_test (const char *test_data_dir)
-{
- _dbus_g_value_types_init ();
-
- assert_bidirectional_mapping (G_TYPE_STRING, DBUS_TYPE_STRING_AS_STRING);
- assert_bidirectional_mapping (G_TYPE_UCHAR, DBUS_TYPE_BYTE_AS_STRING);
- assert_bidirectional_mapping (G_TYPE_UINT, DBUS_TYPE_UINT32_AS_STRING);
-
- assert_bidirectional_mapping (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE),
- DBUS_TYPE_ARRAY_AS_STRING DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING DBUS_DICT_ENTRY_END_CHAR_AS_STRING);
- assert_bidirectional_mapping (dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH),
- DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_OBJECT_PATH_AS_STRING);
- assert_bidirectional_mapping (dbus_g_type_get_collection ("GArray", G_TYPE_INT),
- DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_INT32_AS_STRING);
-
- assert_bidirectional_mapping (dbus_g_type_get_struct ("GValueArray", G_TYPE_INT, G_TYPE_STRING, DBUS_TYPE_G_OBJECT_PATH, G_TYPE_INVALID),
- DBUS_STRUCT_BEGIN_CHAR_AS_STRING DBUS_TYPE_INT32_AS_STRING DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_OBJECT_PATH_AS_STRING DBUS_STRUCT_END_CHAR_AS_STRING );
- return TRUE;
-}
-
-#endif /* DBUS_BUILD_TESTS */