00001 #include <dbus-gvalue.h>
00002
00003 gboolean
00004 dbus_gvalue_demarshal (DBusMessageIter *iter, GValue *value)
00005 {
00006 gboolean can_convert = TRUE;
00007
00008 switch (dbus_message_iter_get_arg_type (iter))
00009 {
00010 #define MAP(d_t, d_get, g_t, g_set) \
00011 case DBUS_##d_t: \
00012 g_value_init (value, G_##g_t); \
00013 g_value_##g_set (value, dbus_message_iter_##d_get (iter)); \
00014 break
00015
00016 MAP(TYPE_BYTE, get_byte, TYPE_UCHAR, set_uchar);
00017 MAP(TYPE_BOOLEAN, get_boolean, TYPE_BOOLEAN , set_boolean);
00018 MAP(TYPE_INT32, get_int32, TYPE_INT , set_int);
00019 MAP(TYPE_UINT32, get_uint32, TYPE_UINT , set_uint);
00020 #ifdef DBUS_HAVE_INT64
00021 MAP(TYPE_INT64, get_int64, TYPE_INT64 , set_int64);
00022 MAP(TYPE_UINT64, get_uint64, TYPE_UINT64 , set_uint64);
00023 #endif
00024 MAP(TYPE_DOUBLE, get_double, TYPE_DOUBLE , set_double);
00025 case DBUS_TYPE_STRING:
00026 {
00027 char *s;
00028
00029 g_value_init (value, G_TYPE_STRING);
00030
00031 s = dbus_message_iter_get_string (iter);
00032 g_value_set_string (value, s);
00033 g_free (s);
00034 }
00035 break;
00036 default:
00037
00038
00039 can_convert = FALSE;
00040 break;
00041 }
00042 #undef MAP
00043 return can_convert;
00044 }
00045
00046 gboolean
00047 dbus_gvalue_marshal (DBusMessageIter *iter, GValue *value)
00048 {
00049 gboolean can_convert = TRUE;
00050 GType value_type = G_VALUE_TYPE (value);
00051
00052 value_type = G_VALUE_TYPE (value);
00053
00054 switch (value_type)
00055 {
00056 case G_TYPE_CHAR:
00057 dbus_message_iter_append_byte (iter,
00058 g_value_get_char (value));
00059 break;
00060 case G_TYPE_UCHAR:
00061 dbus_message_iter_append_byte (iter,
00062 g_value_get_uchar (value));
00063 break;
00064 case G_TYPE_BOOLEAN:
00065 dbus_message_iter_append_boolean (iter,
00066 g_value_get_boolean (value));
00067 break;
00068 case G_TYPE_INT:
00069 dbus_message_iter_append_int32 (iter,
00070 g_value_get_int (value));
00071 break;
00072 case G_TYPE_UINT:
00073 dbus_message_iter_append_uint32 (iter,
00074 g_value_get_uint (value));
00075 break;
00076
00077
00078
00079 case G_TYPE_LONG:
00080 dbus_message_iter_append_int32 (iter,
00081 g_value_get_long (value));
00082 break;
00083 case G_TYPE_ULONG:
00084 dbus_message_iter_append_uint32 (iter,
00085 g_value_get_ulong (value));
00086 break;
00087 #ifdef DBUS_HAVE_INT64
00088 case G_TYPE_INT64:
00089 dbus_message_iter_append_int64 (iter,
00090 g_value_get_int64 (value));
00091 break;
00092 case G_TYPE_UINT64:
00093 dbus_message_iter_append_uint64 (iter,
00094 g_value_get_uint64 (value));
00095 break;
00096 #endif
00097 case G_TYPE_FLOAT:
00098 dbus_message_iter_append_double (iter,
00099 g_value_get_float (value));
00100 break;
00101 case G_TYPE_DOUBLE:
00102 dbus_message_iter_append_double (iter,
00103 g_value_get_double (value));
00104 break;
00105 case G_TYPE_STRING:
00106
00107 dbus_message_iter_append_string (iter,
00108 g_value_get_string (value));
00109 break;
00110 default:
00111
00112
00113 can_convert = FALSE;
00114 break;
00115 }
00116
00117 return can_convert;
00118 }
00119