static IBusMessage * _dbus_list_names (BusDBusImpl *dbus, IBusMessage *message, BusConnection *connection) { IBusMessage *reply_message; IBusMessageIter iter, sub_iter; GList *name, *names; reply_message = ibus_message_new_method_return (message); ibus_message_iter_init_append (message, &iter); ibus_message_iter_open_container (&iter, IBUS_TYPE_ARRAY, "s", &sub_iter); // append unique names names = g_hash_table_get_keys (dbus->unique_names); names = g_list_sort (names, (GCompareFunc) g_strcmp0); for (name = names; name != NULL; name = name->next) { ibus_message_iter_append (&sub_iter, G_TYPE_STRING, &(name->data)); } g_list_free (names); // append well-known names names = g_hash_table_get_keys (dbus->names); names = g_list_sort (names, (GCompareFunc) g_strcmp0); for (name = names; name != NULL; name = name->next) { ibus_message_iter_append (&sub_iter, G_TYPE_STRING, &(name->data)); } g_list_free (names); ibus_message_iter_close_container (&iter, &sub_iter); return reply_message; }
gboolean ibus_message_append_args_valist (IBusMessage *message, GType first_arg_type, va_list va_args) { GType type; gboolean retval; IBusMessageIter iter; ibus_message_iter_init_append (message, &iter); type = first_arg_type; while (type != G_TYPE_INVALID) { gpointer value = va_arg (va_args, gpointer); retval = ibus_message_iter_append (&iter, type, value); type = va_arg (va_args, GType); g_return_val_if_fail (retval, FALSE); } return TRUE; }