diff options
author | Michael Meeks <michael@ximian.com> | 2004-03-29 13:24:50 +0000 |
---|---|---|
committer | Michael Meeks <michael@ximian.com> | 2004-03-29 13:24:50 +0000 |
commit | b498dbcc1af41796186e721bcfea916d9fccb2c5 (patch) | |
tree | 4a3829304b82100d4dd21097c37e273d53cadb48 /glib/dbus-gvalue.c | |
parent | 004b37eca4ed9a33269d4850525a0e1c2f5deaff (diff) |
2004-03-29 Michael Meeks <michael@ximian.com>
* glib/dbus-gobject.c (set_object_property): split out /
re-work, use the property type, and not the message type(!)
(get_object_property): ditto.
* glib/dbus-gvalue.c (dbus_gvalue_demarshal),
(dbus_gvalue_marshal): make this code re-usable, needed
for signals too, also on both proxy and server side.
Re-write for more efficiency / readability.
Diffstat (limited to 'glib/dbus-gvalue.c')
-rw-r--r-- | glib/dbus-gvalue.c | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/glib/dbus-gvalue.c b/glib/dbus-gvalue.c new file mode 100644 index 00000000..06bf2182 --- /dev/null +++ b/glib/dbus-gvalue.c @@ -0,0 +1,115 @@ +#include <dbus-gvalue.h> + +gboolean +dbus_gvalue_demarshal (DBusMessageIter *iter, GValue *value) +{ + gboolean can_convert = TRUE; + + switch (dbus_message_iter_get_arg_type (iter)) + { +#define MAP(d_t, d_get, g_t, g_set) \ + case DBUS_##d_t: \ + g_value_init (value, G_##g_t); \ + g_value_##g_set (value, dbus_message_iter_##d_get (iter)); \ + break + + MAP(TYPE_BYTE, get_byte, TYPE_UCHAR, set_uchar); + MAP(TYPE_BOOLEAN, get_boolean, TYPE_BOOLEAN , set_boolean); + MAP(TYPE_INT32, get_int32, TYPE_INT , set_int); + MAP(TYPE_UINT32, get_uint32, TYPE_UINT , set_uint); + MAP(TYPE_INT64, get_int64, TYPE_INT64 , set_int64); + MAP(TYPE_UINT64, get_uint64, TYPE_UINT64 , set_uint64); + MAP(TYPE_DOUBLE, get_double, TYPE_DOUBLE , set_double); + case DBUS_TYPE_STRING: + { + char *s; /* FIXME use a const string accessor */ + + g_value_init (value, G_TYPE_STRING); + + s = dbus_message_iter_get_string (iter); + g_value_set_string (value, s); + g_free (s); + } + break; + default: + /* FIXME: we need to define custom boxed types for arrays + etc. so we can map them transparently / pleasantly */ + can_convert = FALSE; + break; + } +#undef MAP + return can_convert; +} + +gboolean +dbus_gvalue_marshal (DBusMessageIter *iter, GValue *value) +{ + gboolean can_convert = TRUE; + GType value_type = G_VALUE_TYPE (value); + + value_type = G_VALUE_TYPE (value); + + switch (value_type) + { + case G_TYPE_CHAR: + dbus_message_iter_append_byte (iter, + g_value_get_char (value)); + break; + case G_TYPE_UCHAR: + dbus_message_iter_append_byte (iter, + g_value_get_uchar (value)); + break; + case G_TYPE_BOOLEAN: + dbus_message_iter_append_boolean (iter, + g_value_get_boolean (value)); + break; + case G_TYPE_INT: + dbus_message_iter_append_int32 (iter, + g_value_get_int (value)); + break; + case G_TYPE_UINT: + dbus_message_iter_append_uint32 (iter, + g_value_get_uint (value)); + break; + /* long gets cut to 32 bits so the remote API is consistent + * on all architectures + */ + case G_TYPE_LONG: + dbus_message_iter_append_int32 (iter, + g_value_get_long (value)); + break; + case G_TYPE_ULONG: + dbus_message_iter_append_uint32 (iter, + g_value_get_ulong (value)); + break; + case G_TYPE_INT64: + dbus_message_iter_append_int64 (iter, + g_value_get_int64 (value)); + break; + case G_TYPE_UINT64: + dbus_message_iter_append_uint64 (iter, + g_value_get_uint64 (value)); + break; + case G_TYPE_FLOAT: + dbus_message_iter_append_double (iter, + g_value_get_float (value)); + break; + case G_TYPE_DOUBLE: + dbus_message_iter_append_double (iter, + g_value_get_double (value)); + break; + case G_TYPE_STRING: + /* FIXME, the GValue string may not be valid UTF-8 */ + dbus_message_iter_append_string (iter, + g_value_get_string (value)); + break; + default: + /* FIXME: we need to define custom boxed types for arrays + etc. so we can map them transparently / pleasantly */ + can_convert = FALSE; + break; + } + + return can_convert; +} + |