mirror of
https://gitlab.freedesktop.org/dbus/dbus.git
synced 2026-04-27 10:40:40 +02:00
2005-06-29 Colin Walters <walters@verbum.org>
* dbus/dbus-glib.h: Delete DBUS_TYPE_G_PROXY_ARRAY. Add DBUS_TYPE_G_OBJECT_PATH. * glib/dbus-gvalue.c (dbus_g_value_types_init): Remove marshallers for G_TYPE_OBJECT and DBUS_TYPE_G_PROXY_ARRAY (the latter should be handled more generically). Add DBUS_TYPE_G_OBJECT_PATH. (dbus_g_object_path_get_g_type): New function. (dbus_gtype_from_signature_iter): Map DBUS_TYPE_OBJECT_PATH to DBUS_TYPE_G_OBJECT_PATH by default. (demarshal_proxy): Remove unused name variable. (demarshal_object_path, marshal_object_path): New functions. (demarshal_proxy_array, marshal_proxy_array): Delete. * glib/dbus-binding-tool-glib.c (dbus_g_type_get_c_name): Map DBUS_TYPE_G_OBJECT_PATH to char *. (dbus_g_type_get_lookup_function): Map builtin DBUS_TYPE_G_OBJECT_PATH. * test/glib/test-dbus-glib.c * test/glib/test-service-glib.c (my_object_objpath): Adapt tests to new object path marshalling.
This commit is contained in:
parent
d8dd432f39
commit
b3c42d2264
6 changed files with 126 additions and 127 deletions
24
ChangeLog
24
ChangeLog
|
|
@ -1,3 +1,27 @@
|
|||
2005-06-29 Colin Walters <walters@verbum.org>
|
||||
|
||||
* dbus/dbus-glib.h: Delete DBUS_TYPE_G_PROXY_ARRAY. Add
|
||||
DBUS_TYPE_G_OBJECT_PATH.
|
||||
|
||||
* glib/dbus-gvalue.c (dbus_g_value_types_init): Remove marshallers
|
||||
for G_TYPE_OBJECT and DBUS_TYPE_G_PROXY_ARRAY (the latter should
|
||||
be handled more generically). Add DBUS_TYPE_G_OBJECT_PATH.
|
||||
(dbus_g_object_path_get_g_type): New function.
|
||||
(dbus_gtype_from_signature_iter): Map DBUS_TYPE_OBJECT_PATH
|
||||
to DBUS_TYPE_G_OBJECT_PATH by default.
|
||||
(demarshal_proxy): Remove unused name variable.
|
||||
(demarshal_object_path, marshal_object_path): New functions.
|
||||
(demarshal_proxy_array, marshal_proxy_array): Delete.
|
||||
|
||||
* glib/dbus-binding-tool-glib.c (dbus_g_type_get_c_name): Map
|
||||
DBUS_TYPE_G_OBJECT_PATH to char *.
|
||||
(dbus_g_type_get_lookup_function): Map builtin
|
||||
DBUS_TYPE_G_OBJECT_PATH.
|
||||
|
||||
* test/glib/test-dbus-glib.c
|
||||
* test/glib/test-service-glib.c (my_object_objpath):
|
||||
Adapt tests to new object path marshalling.
|
||||
|
||||
2005-06-29 John (J5) Palmieri <johnp@redhat.com>
|
||||
|
||||
* configure.in: force check for Python >= 2.4
|
||||
|
|
|
|||
|
|
@ -177,13 +177,13 @@ typedef struct _DBusGValue DBusGValue;
|
|||
|
||||
#define DBUS_TYPE_G_STRING_STRING_HASHTABLE (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_STRING))
|
||||
|
||||
/* D-BUS-specific types */
|
||||
#define DBUS_TYPE_G_PROXY_ARRAY (dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_PROXY))
|
||||
|
||||
/* Generic recursive value */
|
||||
GType dbus_g_value_get_g_type (void) G_GNUC_CONST;
|
||||
#define DBUS_TYPE_G_VALUE (dbus_g_value_get_g_type ())
|
||||
|
||||
GType dbus_g_object_path_get_g_type (void) G_GNUC_CONST;
|
||||
#define DBUS_TYPE_G_OBJECT_PATH (dbus_g_object_path_get_g_type ())
|
||||
|
||||
void dbus_g_value_open (DBusGValue *value,
|
||||
DBusGValueIterator *iter);
|
||||
|
||||
|
|
|
|||
|
|
@ -98,7 +98,8 @@ dbus_g_type_get_c_name (GType gtype)
|
|||
if (dbus_g_type_is_map (gtype))
|
||||
return "GHashTable";
|
||||
|
||||
if (g_type_is_a (gtype, G_TYPE_STRING))
|
||||
if (g_type_is_a (gtype, G_TYPE_STRING)
|
||||
|| g_type_is_a (gtype, DBUS_TYPE_G_OBJECT_PATH))
|
||||
return "char *";
|
||||
|
||||
/* This one is even more hacky...we get an extra *
|
||||
|
|
@ -892,7 +893,7 @@ dbus_g_type_get_lookup_function (GType gtype)
|
|||
MAP_KNOWN(G_TYPE_VALUE);
|
||||
MAP_KNOWN(G_TYPE_STRV);
|
||||
MAP_KNOWN(DBUS_TYPE_G_PROXY);
|
||||
MAP_KNOWN(DBUS_TYPE_G_PROXY_ARRAY);
|
||||
MAP_KNOWN(DBUS_TYPE_G_OBJECT_PATH);
|
||||
return NULL;
|
||||
}
|
||||
#undef MAP_FUNDAMENTAL
|
||||
|
|
|
|||
|
|
@ -88,15 +88,15 @@ static gboolean demarshal_proxy (DBusGValueMarshalCtx *cont
|
|||
DBusMessageIter *iter,
|
||||
GValue *value,
|
||||
GError **error);
|
||||
static gboolean marshal_object (DBusMessageIter *iter,
|
||||
static gboolean marshal_object_path (DBusMessageIter *iter,
|
||||
GValue *value);
|
||||
static gboolean demarshal_object (DBusGValueMarshalCtx *context,
|
||||
static gboolean demarshal_object_path (DBusGValueMarshalCtx *context,
|
||||
DBusMessageIter *iter,
|
||||
GValue *value,
|
||||
GError **error);
|
||||
static gboolean marshal_proxy_array (DBusMessageIter *iter,
|
||||
static gboolean marshal_object (DBusMessageIter *iter,
|
||||
GValue *value);
|
||||
static gboolean demarshal_proxy_array (DBusGValueMarshalCtx *context,
|
||||
static gboolean demarshal_object (DBusGValueMarshalCtx *context,
|
||||
DBusMessageIter *iter,
|
||||
GValue *value,
|
||||
GError **error);
|
||||
|
|
@ -393,6 +393,18 @@ dbus_g_value_types_init (void)
|
|||
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,
|
||||
|
|
@ -405,21 +417,26 @@ dbus_g_value_types_init (void)
|
|||
set_type_metadata (G_TYPE_OBJECT, &typedata);
|
||||
}
|
||||
|
||||
{
|
||||
static const DBusGTypeMarshalVtable vtable = {
|
||||
marshal_proxy_array,
|
||||
demarshal_proxy_array
|
||||
};
|
||||
static const DBusGTypeMarshalData typedata = {
|
||||
DBUS_TYPE_ARRAY_AS_STRING DBUS_TYPE_OBJECT_PATH_AS_STRING,
|
||||
&vtable
|
||||
};
|
||||
set_type_metadata (DBUS_TYPE_G_PROXY_ARRAY, &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;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the GLib type ID for a DBusGValue boxed type.
|
||||
*
|
||||
|
|
@ -592,7 +609,7 @@ dbus_gtype_from_signature_iter (DBusSignatureIter *iter, gboolean is_client)
|
|||
if (dbus_typecode_maps_to_basic (current_type))
|
||||
return basic_typecode_to_gtype (current_type);
|
||||
else if (current_type == DBUS_TYPE_OBJECT_PATH)
|
||||
return is_client ? DBUS_TYPE_G_PROXY : G_TYPE_OBJECT;
|
||||
return DBUS_TYPE_G_OBJECT_PATH;
|
||||
else
|
||||
{
|
||||
DBusSignatureIter subiter;
|
||||
|
|
@ -827,7 +844,6 @@ demarshal_proxy (DBusGValueMarshalCtx *context,
|
|||
GValue *value,
|
||||
GError **error)
|
||||
{
|
||||
const char *name;
|
||||
DBusGProxy *new_proxy;
|
||||
const char *objpath;
|
||||
int current_type;
|
||||
|
|
@ -837,8 +853,6 @@ demarshal_proxy (DBusGValueMarshalCtx *context,
|
|||
|
||||
g_assert (context->proxy != NULL);
|
||||
|
||||
name = dbus_g_proxy_get_bus_name (context->proxy);
|
||||
|
||||
dbus_message_iter_get_basic (iter, &objpath);
|
||||
|
||||
new_proxy = dbus_g_proxy_new_from_proxy (context->proxy, NULL, objpath);
|
||||
|
|
@ -847,6 +861,25 @@ demarshal_proxy (DBusGValueMarshalCtx *context,
|
|||
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);
|
||||
g_assert (current_type == DBUS_TYPE_OBJECT_PATH);
|
||||
|
||||
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,
|
||||
|
|
@ -950,50 +983,6 @@ demarshal_garray_basic (DBusGValueMarshalCtx *context,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
demarshal_proxy_array (DBusGValueMarshalCtx *context,
|
||||
DBusMessageIter *iter,
|
||||
GValue *value,
|
||||
GError **error)
|
||||
{
|
||||
DBusMessageIter subiter;
|
||||
GPtrArray *ret;
|
||||
guint len;
|
||||
guint i;
|
||||
int current_type;
|
||||
|
||||
g_assert (dbus_message_iter_get_arg_type (iter) == DBUS_TYPE_ARRAY);
|
||||
|
||||
dbus_message_iter_recurse (iter, &subiter);
|
||||
|
||||
len = dbus_message_iter_get_array_len (&subiter);
|
||||
g_assert (len >= 0);
|
||||
ret = g_ptr_array_sized_new (len);
|
||||
|
||||
i = 0;
|
||||
while ((current_type = dbus_message_iter_get_arg_type (&subiter)) != DBUS_TYPE_INVALID)
|
||||
{
|
||||
GValue subval = {0, };
|
||||
g_assert (i < len);
|
||||
|
||||
if (!demarshal_proxy (context, &subiter, &subval, error))
|
||||
{
|
||||
for (i = 0; i < ret->len; i++)
|
||||
g_object_unref (g_ptr_array_index (ret, i));
|
||||
g_ptr_array_free (ret, TRUE);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
g_ptr_array_index (ret, i) = g_value_get_boxed (&subval);
|
||||
/* Don't unset value, now owned by ret */
|
||||
|
||||
i++;
|
||||
}
|
||||
g_value_set_boxed_take_ownership (value, ret);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
demarshal_ghashtable (DBusGValueMarshalCtx *context,
|
||||
DBusMessageIter *iter,
|
||||
|
|
@ -1392,6 +1381,23 @@ marshal_proxy (DBusMessageIter *iter,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
marshal_object_path (DBusMessageIter *iter,
|
||||
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,
|
||||
GValue *value)
|
||||
|
|
@ -1413,46 +1419,6 @@ marshal_object (DBusMessageIter *iter,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
marshal_proxy_array (DBusMessageIter *iter,
|
||||
GValue *value)
|
||||
{
|
||||
DBusMessageIter subiter;
|
||||
GPtrArray *array;
|
||||
const char *subsignature_str;
|
||||
gboolean ret = FALSE;
|
||||
guint i;
|
||||
|
||||
subsignature_str = dbus_gtype_to_signature (DBUS_TYPE_G_PROXY);
|
||||
g_assert (subsignature_str != NULL);
|
||||
|
||||
array = g_value_get_boxed (value);
|
||||
|
||||
if (!dbus_message_iter_open_container (iter,
|
||||
DBUS_TYPE_ARRAY,
|
||||
subsignature_str,
|
||||
&subiter))
|
||||
goto out;
|
||||
|
||||
for (i = 0; i < array->len; i++)
|
||||
{
|
||||
GValue val = {0, };
|
||||
|
||||
g_value_init (&val, DBUS_TYPE_G_PROXY);
|
||||
g_value_set_static_boxed (&val, g_ptr_array_index (array, i));
|
||||
|
||||
marshal_proxy (&subiter, &val);
|
||||
|
||||
g_value_unset (&val);
|
||||
}
|
||||
|
||||
if (!dbus_message_iter_close_container (iter, &subiter))
|
||||
goto out;
|
||||
ret = TRUE;
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
struct DBusGLibHashMarshalData
|
||||
{
|
||||
const char *entry_sig;
|
||||
|
|
|
|||
|
|
@ -749,11 +749,14 @@ main (int argc, char **argv)
|
|||
|
||||
{
|
||||
guint val;
|
||||
char *ret_path;
|
||||
DBusGProxy *ret_proxy;
|
||||
|
||||
g_print ("Calling (wrapped) objpath\n");
|
||||
if (!org_freedesktop_DBus_Tests_MyObject_objpath (proxy, proxy, &ret_proxy, &error))
|
||||
lose_gerror ("Failed to complete (wrapped) Objpath call", error);
|
||||
if (!dbus_g_proxy_call (proxy, "Objpath", &error,
|
||||
DBUS_TYPE_G_PROXY, proxy, G_TYPE_INVALID,
|
||||
DBUS_TYPE_G_PROXY, &ret_proxy, G_TYPE_INVALID))
|
||||
lose_gerror ("Failed to complete Objpath call", error);
|
||||
if (strcmp ("/org/freedesktop/DBus/Tests/MyTestObject2",
|
||||
dbus_g_proxy_get_path (ret_proxy)) != 0)
|
||||
lose ("(wrapped) objpath call returned unexpected proxy %s",
|
||||
|
|
@ -802,20 +805,25 @@ main (int argc, char **argv)
|
|||
|
||||
g_print ("Calling objpath again\n");
|
||||
ret_proxy = NULL;
|
||||
if (!org_freedesktop_DBus_Tests_MyObject_objpath (proxy, proxy, &ret_proxy, &error))
|
||||
|
||||
if (!dbus_g_proxy_call (proxy, "Objpath", &error,
|
||||
DBUS_TYPE_G_OBJECT_PATH,
|
||||
dbus_g_proxy_get_path (proxy),
|
||||
G_TYPE_INVALID,
|
||||
DBUS_TYPE_G_OBJECT_PATH,
|
||||
&ret_path,
|
||||
G_TYPE_INVALID))
|
||||
lose_gerror ("Failed to complete (wrapped) Objpath call 2", error);
|
||||
if (strcmp ("/org/freedesktop/DBus/Tests/MyTestObject2",
|
||||
dbus_g_proxy_get_path (ret_proxy)) != 0)
|
||||
lose ("(wrapped) objpath call 2 returned unexpected proxy %s",
|
||||
dbus_g_proxy_get_path (ret_proxy));
|
||||
{
|
||||
const char *iface = dbus_g_proxy_get_interface (ret_proxy);
|
||||
g_print ("returned proxy has interface \"%s\"\n",
|
||||
iface ? iface : "(NULL)");
|
||||
}
|
||||
|
||||
dbus_g_proxy_set_interface (ret_proxy, "org.freedesktop.DBus.Tests.FooObject");
|
||||
if (strcmp ("/org/freedesktop/DBus/Tests/MyTestObject2", ret_path) != 0)
|
||||
lose ("(wrapped) objpath call 2 returned unexpected path %s",
|
||||
ret_path);
|
||||
|
||||
ret_proxy = dbus_g_proxy_new_for_name_owner (connection,
|
||||
"org.freedesktop.DBus.TestSuiteGLibService",
|
||||
ret_path,
|
||||
"org.freedesktop.DBus.Tests.FooObject",
|
||||
&error);
|
||||
|
||||
val = 0;
|
||||
if (!org_freedesktop_DBus_Tests_FooObject_get_value (ret_proxy, &val, &error))
|
||||
lose_gerror ("Failed to complete (wrapped) GetValue call", error);
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ gboolean my_object_many_return (MyObject *obj, guint32 *arg0, char **arg1, gint3
|
|||
gboolean my_object_recursive1 (MyObject *obj, GArray *array, guint32 *len_ret, GError **error);
|
||||
gboolean my_object_recursive2 (MyObject *obj, guint32 reqlen, GArray **array, GError **error);
|
||||
|
||||
gboolean my_object_objpath (MyObject *obj, GObject *in, GObject **arg1, GError **error);
|
||||
gboolean my_object_objpath (MyObject *obj, const char *in, char **arg1, GError **error);
|
||||
|
||||
gboolean my_object_stringify (MyObject *obj, GValue *value, char **ret, GError **error);
|
||||
gboolean my_object_unstringify (MyObject *obj, const char *str, GValue *value, GError **error);
|
||||
|
|
@ -362,9 +362,9 @@ my_object_many_uppercase (MyObject *obj, const char * const *in, char ***out, GE
|
|||
}
|
||||
|
||||
gboolean
|
||||
my_object_objpath (MyObject *obj, GObject *incoming, GObject **outgoing, GError **error)
|
||||
my_object_objpath (MyObject *obj, const char *incoming, char **outgoing, GError **error)
|
||||
{
|
||||
if ((GObject*) obj != incoming)
|
||||
if (strcmp (incoming, "/org/freedesktop/DBus/Tests/MyTestObject"))
|
||||
{
|
||||
g_set_error (error,
|
||||
MY_OBJECT_ERROR,
|
||||
|
|
@ -372,7 +372,7 @@ my_object_objpath (MyObject *obj, GObject *incoming, GObject **outgoing, GError
|
|||
"invalid incoming object");
|
||||
return FALSE;
|
||||
}
|
||||
*outgoing = g_object_ref (obj2);
|
||||
*outgoing = g_strdup ("/org/freedesktop/DBus/Tests/MyTestObject2");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue