static IBusMessage * _dbus_release_name (BusDBusImpl *dbus, IBusMessage *message, BusConnection *connection) { IBusMessage *reply_message; IBusError *error; gchar *name; guint retval; if (!ibus_message_get_args (message, &error, G_TYPE_STRING, &name, G_TYPE_INVALID)) { reply_message = ibus_message_new_error (message, error->name, error->message); ibus_error_free (error); return reply_message; } reply_message = ibus_message_new_method_return (message); if (bus_connection_remove_name (connection, name)) { retval = 1; } else { retval = 2; } ibus_message_append_args (message, G_TYPE_UINT, &retval, G_TYPE_INVALID); return reply_message; }
static IBusMessage * _dbus_add_match (BusDBusImpl *dbus, IBusMessage *message, BusConnection *connection) { IBusMessage *reply_message; IBusError *error; gboolean retval; gchar *rule_text; BusMatchRule *rule; GList *link; retval = ibus_message_get_args (message, &error, G_TYPE_STRING, &rule_text, G_TYPE_INVALID); if (!retval) { reply_message = ibus_message_new_error (message, error->name, error->message); ibus_error_free (error); return reply_message; } rule = bus_match_rule_new (rule_text); if (rule == NULL) { reply_message = ibus_message_new_error_printf (message, DBUS_ERROR_MATCH_RULE_INVALID, "Parse rule [%s] failed", rule_text); return reply_message; } for (link = dbus->rules; link != NULL; link = link->next) { if (bus_match_rule_is_equal (rule, BUS_MATCH_RULE (link->data))) { bus_match_rule_add_recipient (BUS_MATCH_RULE (link->data), connection); g_object_unref (rule); rule = NULL; break; } } if (rule) { bus_match_rule_add_recipient (rule, connection); dbus->rules = g_list_append (dbus->rules, rule); g_signal_connect (rule, "destroy", G_CALLBACK (_rule_destroy_cb), dbus); } reply_message = ibus_message_new_method_return (message); return reply_message; }
static IBusMessage * _dbus_request_name (BusDBusImpl *dbus, IBusMessage *message, BusConnection *connection) { IBusMessage *reply_message; IBusError *error; gchar *name; guint flags; guint retval; if (!ibus_message_get_args (message, &error, G_TYPE_STRING, &name, G_TYPE_UINT, &flags, G_TYPE_INVALID)) { reply_message = ibus_message_new_error (message, error->name, error->message); ibus_error_free (error); return reply_message; } if (g_hash_table_lookup (dbus->names, name) != NULL) { reply_message = ibus_message_new_error_printf (message, DBUS_ERROR_FAILED, "Name %s has owner", name); return reply_message; } retval = 1; g_hash_table_insert (dbus->names, (gpointer )bus_connection_add_name (connection, name), connection); reply_message = ibus_message_new_method_return (message); ibus_message_append_args (reply_message, G_TYPE_UINT, &retval, G_TYPE_INVALID); ibus_connection_send ((IBusConnection *) connection, reply_message); ibus_message_unref (reply_message); ibus_connection_flush ((IBusConnection *) connection); g_signal_emit (dbus, dbus_signals[NAME_OWNER_CHANGED], 0, name, "", bus_connection_get_unique_name (connection)); return NULL; }
static IBusMessage * _dbus_get_name_owner (BusDBusImpl *dbus, IBusMessage *message, BusConnection *connection) { gchar *name; BusConnection *owner; gboolean retval; const gchar *owner_name = NULL; IBusMessage *reply_message; IBusError *error; retval = ibus_message_get_args (message, &error, G_TYPE_STRING, &name, G_TYPE_INVALID); if (! retval) { reply_message = ibus_message_new_error (message, error->name, error->message); ibus_error_free (error); return reply_message; } if (g_strcmp0 (name, DBUS_SERVICE_DBUS) == 0 || g_strcmp0 (name, IBUS_SERVICE_IBUS) == 0) { owner_name = name; } else { owner = bus_dbus_impl_get_connection_by_name (dbus, name); if (owner != NULL) { owner_name = bus_connection_get_unique_name (owner); } } if (owner_name != NULL) { reply_message = ibus_message_new_method_return (message); ibus_message_append_args (reply_message, G_TYPE_STRING, &owner_name, G_TYPE_INVALID); } else { reply_message = ibus_message_new_error_printf (message, DBUS_ERROR_NAME_HAS_NO_OWNER, "Name '%s' does have owner", name); } return reply_message; }
static IBusMessage * _dbus_remove_match (BusDBusImpl *dbus, IBusMessage *message, BusConnection *connection) { IBusMessage *reply_message; IBusError *error; gchar *rule_text; BusMatchRule *rule; GList *link; if (!ibus_message_get_args (message, &error, G_TYPE_STRING, &rule_text, G_TYPE_INVALID)) { reply_message = ibus_message_new_error (message, error->name, error->message); ibus_error_free (error); return reply_message; } rule = bus_match_rule_new (rule_text); if (rule == NULL ) { reply_message = ibus_message_new_error_printf (message, DBUS_ERROR_MATCH_RULE_INVALID, "Parse rule [%s] failed", rule_text); return reply_message; } for (link = dbus->rules; link != NULL; link = link->next) { if (bus_match_rule_is_equal (rule, BUS_MATCH_RULE (link->data))) { bus_match_rule_remove_recipient (BUS_MATCH_RULE (link->data), connection); break; } } g_object_unref (rule); reply_message = ibus_message_new_method_return (message); return reply_message; }
static IBusMessage * _dbus_hello (BusDBusImpl *dbus, IBusMessage *message, BusConnection *connection) { IBusMessage *reply_message; if (bus_connection_get_unique_name (connection) != NULL) { reply_message = ibus_message_new_error (message, DBUS_ERROR_FAILED, "Already handled an Hello message"); } else { gchar *name; name = g_strdup_printf (":1.%d", dbus->id ++); bus_connection_set_unique_name (connection, name); g_free (name); name = (gchar *) bus_connection_get_unique_name (connection); g_hash_table_insert (dbus->unique_names, name, connection); reply_message = ibus_message_new_method_return (message); ibus_message_append_args (reply_message, G_TYPE_STRING, &name, G_TYPE_INVALID); ibus_connection_send ((IBusConnection *) connection, reply_message); ibus_message_unref (reply_message); ibus_connection_flush ((IBusConnection *) connection); reply_message = NULL; g_signal_emit (dbus, dbus_signals[NAME_OWNER_CHANGED], 0, name, "", name); } return reply_message; }
IBusMessage * ibus_message_new_error_printf (IBusMessage *reply_to, const gchar *error_name, const gchar *error_format, ...) { va_list va_args; gchar *error_message; IBusMessage *message; va_start (va_args, error_format); error_message = g_strdup_vprintf (error_format, va_args); va_end (va_args); message = ibus_message_new_error (reply_to, error_name, error_message); g_free (error_message); return message; }
static IBusMessage * _dbus_name_has_owner (BusDBusImpl *dbus, IBusMessage *message, BusConnection *connection) { gchar *name; gboolean retval; gboolean has_owner; IBusMessage *reply_message; IBusError *error; retval = ibus_message_get_args (message, &error, G_TYPE_STRING, &name, G_TYPE_INVALID); if (! retval) { reply_message = ibus_message_new_error (message, error->name, error->message); ibus_error_free (error); return reply_message; } if (name[0] == ':') { has_owner = g_hash_table_lookup (dbus->unique_names, name) != NULL; } else { has_owner = g_hash_table_lookup (dbus->names, name) != NULL; } reply_message = ibus_message_new_method_return (message); ibus_message_append_args (reply_message, G_TYPE_BOOLEAN, &has_owner, G_TYPE_INVALID); return reply_message; }
static IBusMessage * _dbus_get_id (BusDBusImpl *dbus, IBusMessage *message, BusConnection *connection) { IBusMessage *reply_message; const gchar *name; name = bus_connection_get_unique_name (connection); if (name == NULL) { reply_message = ibus_message_new_error (message, DBUS_ERROR_FAILED, "Can not GetId before Hello"); return reply_message; } reply_message = ibus_message_new_method_return (message); ibus_message_append_args (reply_message, G_TYPE_STRING, &name, G_TYPE_INVALID); return reply_message; }
static gboolean ibus_config_service_ibus_message (IBusConfigService *config, IBusConnection *connection, IBusMessage *message) { g_assert (IBUS_IS_CONFIG_SERVICE (config)); g_assert (IBUS_IS_CONNECTION (connection)); g_assert (message != NULL); IBusMessage *reply = NULL; if (ibus_message_is_method_call (message, IBUS_INTERFACE_CONFIG, "SetValue")) { gchar *section; gchar *name; GValue value = { 0 }; IBusError *error = NULL; gboolean retval; retval = ibus_message_get_args (message, &error, G_TYPE_STRING, §ion, G_TYPE_STRING, &name, G_TYPE_VALUE, &value, G_TYPE_INVALID); if (!retval) { reply = ibus_message_new_error_printf (message, DBUS_ERROR_INVALID_ARGS, "Can not parse arguments 1 of SetValue"); ibus_error_free (error); } else if (!IBUS_CONFIG_SERVICE_GET_CLASS (config)->set_value (config, section, name, &value, &error)) { reply = ibus_message_new_error (message, error->name, error->message); ibus_error_free (error); } else { reply = ibus_message_new_method_return (message); } } else if (ibus_message_is_method_call (message, IBUS_INTERFACE_CONFIG, "GetValue")) { gchar *section; gchar *name; GValue value = { 0 }; IBusError *error = NULL; gboolean retval; retval = ibus_message_get_args (message, &error, G_TYPE_STRING, §ion, G_TYPE_STRING, &name, G_TYPE_INVALID); if (!retval) { reply = ibus_message_new_error (message, error->name, error->message); ibus_error_free (error); } else if (!IBUS_CONFIG_SERVICE_GET_CLASS (config)->get_value (config, section, name, &value, &error)) { reply = ibus_message_new_error (message, error->name, error->message); ibus_error_free (error); } else { reply = ibus_message_new_method_return (message); ibus_message_append_args (reply, G_TYPE_VALUE, &value, G_TYPE_INVALID); g_value_unset (&value); } } if (reply) { ibus_connection_send (connection, reply); ibus_message_unref (reply); return TRUE; } return parent_class->ibus_message ((IBusService *) config, connection, message); }
static gboolean ibus_panel_service_ibus_message (IBusPanelService *panel, IBusConnection *connection, IBusMessage *message) { g_assert (IBUS_IS_PANEL_SERVICE (panel)); g_assert (IBUS_IS_CONNECTION (connection)); g_assert (message != NULL); const static struct { const gchar *name; const gint offset; } no_arg_methods [] = { { "CursorUpLookupTable" , G_STRUCT_OFFSET (IBusPanelServiceClass, cursor_down_lookup_table) }, { "CursorDownLookupTable", G_STRUCT_OFFSET (IBusPanelServiceClass, cursor_up_lookup_table) }, { "Destroy", G_STRUCT_OFFSET (IBusPanelServiceClass, destroy) }, { "HideAuxiliaryText", G_STRUCT_OFFSET (IBusPanelServiceClass, hide_auxiliary_text) }, { "HideLanguageBar", G_STRUCT_OFFSET (IBusPanelServiceClass, hide_language_bar) }, { "HideLookupTable", G_STRUCT_OFFSET (IBusPanelServiceClass, hide_lookup_table) }, { "HidePreeditText", G_STRUCT_OFFSET (IBusPanelServiceClass, hide_preedit_text) }, { "PageDownLookupTable", G_STRUCT_OFFSET (IBusPanelServiceClass, page_down_lookup_table) }, { "PageUpLookupTable", G_STRUCT_OFFSET (IBusPanelServiceClass, page_up_lookup_table) }, { "Reset", G_STRUCT_OFFSET (IBusPanelServiceClass, reset) }, { "ShowAuxiliaryText", G_STRUCT_OFFSET (IBusPanelServiceClass, show_auxiliary_text) }, { "ShowLanguageBar", G_STRUCT_OFFSET (IBusPanelServiceClass, show_language_bar) }, { "ShowLookupTable", G_STRUCT_OFFSET (IBusPanelServiceClass, show_lookup_table) }, { "ShowPreeditText", G_STRUCT_OFFSET (IBusPanelServiceClass, show_preedit_text) }, { "StartSetup", G_STRUCT_OFFSET (IBusPanelServiceClass, start_setup) }, { "StateChanged", G_STRUCT_OFFSET (IBusPanelServiceClass, state_changed) }, }; IBusMessage *reply = NULL; gint i; for (i = 0; i < G_N_ELEMENTS (no_arg_methods); i++) { if (!ibus_message_is_method_call (message, IBUS_INTERFACE_PANEL, no_arg_methods[i].name)) continue; IBusMessageIter iter; ibus_message_iter_init (message, &iter); if (ibus_message_iter_has_next (&iter)) { reply = ibus_message_new_error_printf (message, DBUS_ERROR_INVALID_ARGS, "%s.%s: Method does not have arguments", IBUS_INTERFACE_PANEL, no_arg_methods[i].name); } else { IBusError *error = NULL; typedef gboolean (* NoArgFunc) (IBusPanelService *, IBusError **); NoArgFunc func; func = G_STRUCT_MEMBER (NoArgFunc, IBUS_PANEL_SERVICE_GET_CLASS (panel), no_arg_methods[i].offset); if (!func (panel, &error)) { reply = ibus_message_new_error (message, error->name, error->message); ibus_error_free (error); } else { reply = ibus_message_new_method_return (message); } } ibus_connection_send (connection, reply); ibus_message_unref (reply); return TRUE; } if (ibus_message_is_method_call (message, IBUS_INTERFACE_PANEL, "FocusIn")) { const gchar* input_context_path = NULL; IBusError *error = NULL; gboolean retval; retval = ibus_message_get_args (message, &error, IBUS_TYPE_OBJECT_PATH, &input_context_path, G_TYPE_INVALID); if (!retval || !IBUS_PANEL_SERVICE_GET_CLASS (panel)->focus_in (panel, input_context_path, &error)) { reply = ibus_message_new_error (message, error->name, error->message); ibus_error_free (error); } else { reply = ibus_message_new_method_return (message); } } else if (ibus_message_is_method_call (message, IBUS_INTERFACE_PANEL, "FocusOut")) { const gchar* input_context_path = NULL; gboolean retval; IBusError *error = NULL; retval = ibus_message_get_args (message, &error, IBUS_TYPE_OBJECT_PATH, &input_context_path, G_TYPE_INVALID); if (!retval || !IBUS_PANEL_SERVICE_GET_CLASS (panel)->focus_out (panel, input_context_path, &error)) { reply = ibus_message_new_error(message, error->name, error->message); ibus_error_free (error); } else { reply = ibus_message_new_method_return (message); } } else if (ibus_message_is_method_call (message, IBUS_INTERFACE_PANEL, "RegisterProperties")) { IBusPropList *prop_list = NULL; gboolean retval; IBusError *error = NULL; retval = ibus_message_get_args (message, &error, IBUS_TYPE_PROP_LIST, &prop_list, G_TYPE_INVALID); if (!retval || !IBUS_PANEL_SERVICE_GET_CLASS (panel)->register_properties (panel, prop_list, &error)) { reply = ibus_message_new_error(message, error->name, error->message); ibus_error_free (error); } else { reply = ibus_message_new_method_return (message); } if (prop_list != NULL && g_object_is_floating (prop_list)) g_object_unref (prop_list); } else if (ibus_message_is_method_call (message, IBUS_INTERFACE_PANEL, "UpdateAuxiliaryText")) { IBusText *text = NULL; gboolean visible; gboolean retval; IBusError *error = NULL; retval = ibus_message_get_args (message, &error, IBUS_TYPE_TEXT, &text, G_TYPE_BOOLEAN, &visible, G_TYPE_INVALID); if (!retval || !IBUS_PANEL_SERVICE_GET_CLASS (panel)->update_auxiliary_text (panel, text, visible, &error)) { reply = ibus_message_new_error(message, error->name, error->message); ibus_error_free (error); } else { reply = ibus_message_new_method_return (message); } if (text != NULL && g_object_is_floating (text)) g_object_unref (text); } else if (ibus_message_is_method_call (message, IBUS_INTERFACE_PANEL, "UpdateLookupTable")) { IBusLookupTable *table = NULL; gboolean visible = FALSE; gboolean retval; IBusError *error = NULL; retval = ibus_message_get_args (message, &error, IBUS_TYPE_LOOKUP_TABLE, &table, G_TYPE_BOOLEAN, &visible, G_TYPE_INVALID); if (!retval || !IBUS_PANEL_SERVICE_GET_CLASS (panel)->update_lookup_table (panel, table, visible, &error)) { reply = ibus_message_new_error(message, error->name, error->message); ibus_error_free (error); } else { reply = ibus_message_new_method_return (message); } if (table != NULL && g_object_is_floating (table)) g_object_unref (table); } else if (ibus_message_is_method_call (message, IBUS_INTERFACE_PANEL, "UpdatePreeditText")) { IBusText *text = NULL; guint cursor_pos; gboolean visible; gboolean retval; IBusError *error = NULL; retval = ibus_message_get_args (message, &error, IBUS_TYPE_TEXT, &text, G_TYPE_UINT, &cursor_pos, G_TYPE_BOOLEAN, &visible, G_TYPE_INVALID); if (!retval || !IBUS_PANEL_SERVICE_GET_CLASS (panel)->update_preedit_text (panel, text, cursor_pos, visible, &error)) { reply = ibus_message_new_error(message, error->name, error->message); ibus_error_free (error); } else { reply = ibus_message_new_method_return (message); } if (text != NULL && g_object_is_floating (text)) g_object_unref (text); } else if (ibus_message_is_method_call (message, IBUS_INTERFACE_PANEL, "UpdateProperty")) { IBusProperty *property = NULL; gboolean retval; IBusError *error = NULL; retval = ibus_message_get_args (message, &error, IBUS_TYPE_PROPERTY, &property, G_TYPE_INVALID); if (!retval || !IBUS_PANEL_SERVICE_GET_CLASS (panel)->update_property (panel, property, &error)) { reply = ibus_message_new_error(message, error->name, error->message); ibus_error_free (error); } else { reply = ibus_message_new_method_return (message); } if (property != NULL && g_object_is_floating (property)) g_object_unref (property); } else if (ibus_message_is_method_call (message, IBUS_INTERFACE_PANEL, "SetCursorLocation")) { guint x, y, w, h; gboolean retval; IBusError *error = NULL; retval = ibus_message_get_args (message, &error, G_TYPE_INT, &x, G_TYPE_INT, &y, G_TYPE_INT, &w, G_TYPE_INT, &h, G_TYPE_INVALID); if (!retval || !IBUS_PANEL_SERVICE_GET_CLASS (panel)->set_cursor_location (panel, x, y, w, h, &error)) { reply = ibus_message_new_error(message, error->name, error->message); ibus_error_free (error); } else { reply = ibus_message_new_method_return (message); } } if (reply) { ibus_connection_send (connection, reply); ibus_message_unref (reply); return TRUE; } return TRUE; }