gboolean ibus_serializable_serialize (IBusSerializable *object, IBusMessageIter *iter) { g_return_val_if_fail (IBUS_IS_SERIALIZABLE (object), FALSE); g_return_val_if_fail (iter != NULL, FALSE); IBusMessageIter variant_iter; IBusMessageIter sub_iter; gboolean retval; gchar *signature; signature = g_strdup_printf ("(s%s)", IBUS_SERIALIZABLE_GET_CLASS (object)->signature->str); retval = ibus_message_iter_open_container (iter, IBUS_TYPE_VARIANT, signature, &variant_iter); g_free (signature); g_return_val_if_fail (retval, FALSE); retval = ibus_message_iter_open_container (&variant_iter, IBUS_TYPE_STRUCT, NULL, &sub_iter); g_return_val_if_fail (retval, FALSE); const gchar *type_name = g_type_name (G_OBJECT_TYPE (object)); g_return_val_if_fail (type_name != NULL, FALSE); retval = ibus_message_iter_append (&sub_iter, G_TYPE_STRING, &type_name); g_return_val_if_fail (retval, FALSE); retval = IBUS_SERIALIZABLE_GET_CLASS (object)->serialize (object, &sub_iter); g_return_val_if_fail (retval, FALSE); retval = ibus_message_iter_close_container (&variant_iter, &sub_iter); g_return_val_if_fail (retval, FALSE); retval = ibus_message_iter_close_container (iter, &variant_iter); g_return_val_if_fail (retval, FALSE); return TRUE; }
IBusSerializable * ibus_serializable_deserialize (IBusMessageIter *iter) { g_return_val_if_fail (iter != NULL, NULL); gboolean retval; IBusMessageIter variant_iter; IBusMessageIter sub_iter; gchar *type_name; GType type; IBusSerializable *object; type = ibus_message_iter_get_arg_type (iter); if (type == IBUS_TYPE_VARIANT) { retval = ibus_message_iter_recurse (iter, IBUS_TYPE_VARIANT, &variant_iter); g_return_val_if_fail (retval, NULL); retval = ibus_message_iter_recurse (&variant_iter, IBUS_TYPE_STRUCT, &sub_iter); g_return_val_if_fail (retval, NULL); } else if (type == IBUS_TYPE_STRUCT) { retval = ibus_message_iter_recurse (iter, IBUS_TYPE_STRUCT, &sub_iter); g_return_val_if_fail (retval, NULL); } else g_return_val_if_reached (NULL); retval = ibus_message_iter_get (&sub_iter, G_TYPE_STRING, &type_name); g_return_val_if_fail (retval, NULL); ibus_message_iter_next (&sub_iter); type = g_type_from_name (type_name); g_return_val_if_fail (g_type_is_a (type, IBUS_TYPE_SERIALIZABLE), NULL); object = g_object_new (type, NULL); retval = IBUS_SERIALIZABLE_GET_CLASS (object)->deserialize (object, &sub_iter); if (retval) return object; g_object_unref (object); g_return_val_if_reached (NULL); }
IBusSerializable * ibus_serializable_copy (IBusSerializable *object) { g_return_val_if_fail (IBUS_IS_SERIALIZABLE (object), NULL); GType type; IBusSerializable *new_object; type = G_OBJECT_TYPE (object); new_object = g_object_new (type, NULL); g_return_val_if_fail (new_object != NULL, NULL); if (IBUS_SERIALIZABLE_GET_CLASS (new_object)->copy (new_object, object)) { return new_object; } g_object_unref (new_object); g_return_val_if_reached (NULL); }