Main Page | Modules | Data Structures | Directories | 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 Tue Dec 20 14:16:39 2005 for D-BUS by  doxygen 1.4.2