Main Page | Modules | Data Structures | File List | Data Fields | Related Pages

dbus-gvalue.c

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; /* FIXME use a const string accessor */ 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 /* FIXME: we need to define custom boxed types for arrays 00038 etc. so we can map them transparently / pleasantly */ 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 /* long gets cut to 32 bits so the remote API is consistent 00077 * on all architectures 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 /* FIXME, the GValue string may not be valid UTF-8 */ 00107 dbus_message_iter_append_string (iter, 00108 g_value_get_string (value)); 00109 break; 00110 default: 00111 /* FIXME: we need to define custom boxed types for arrays 00112 etc. so we can map them transparently / pleasantly */ 00113 can_convert = FALSE; 00114 break; 00115 } 00116 00117 return can_convert; 00118 } 00119

Generated on Mon Jun 27 07:48:21 2005 for D-BUS by doxygen 1.3.7