gboolean ibus_bus_register_component (IBusBus *bus, IBusComponent *component) { g_assert (IBUS_IS_BUS (bus)); g_assert (IBUS_IS_COMPONENT (component)); gboolean result; result = ibus_bus_call (bus, IBUS_SERVICE_IBUS, IBUS_PATH_IBUS, IBUS_INTERFACE_IBUS, "RegisterComponent", IBUS_TYPE_COMPONENT, &component, G_TYPE_INVALID, G_TYPE_INVALID); return result; #if 0 IBusMessage *message, *reply; IBusError *error; IBusBusPrivate *priv; priv = IBUS_BUS_GET_PRIVATE (bus); message = ibus_message_new_method_call (IBUS_SERVICE_IBUS, IBUS_PATH_IBUS, IBUS_INTERFACE_IBUS, "RegisterComponent"); ibus_message_append_args (message, IBUS_TYPE_COMPONENT, &component, G_TYPE_INVALID); reply = ibus_connection_send_with_reply_and_block ( priv->connection, message, -1, &error); ibus_message_unref (message); if (reply == NULL) { g_warning ("%s : %s", error->name, error->message); ibus_error_free (error); return FALSE; } if ((error = ibus_error_from_message (reply)) != NULL) { g_warning ("%s : %s", error->name, error->message); ibus_error_free (error); ibus_message_unref (reply); return FALSE; } return TRUE; #endif }
static void bus_dbus_impl_name_owner_changed (BusDBusImpl *dbus, gchar *name, gchar *old_name, gchar *new_name) { g_assert (BUS_IS_DBUS_IMPL (dbus)); g_assert (name != NULL); g_assert (old_name != NULL); g_assert (new_name != NULL); IBusMessage *message; message = ibus_message_new_signal (DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS, "NameOwnerChanged"); ibus_message_append_args (message, G_TYPE_STRING, &name, G_TYPE_STRING, &old_name, G_TYPE_STRING, &new_name, G_TYPE_INVALID); ibus_message_set_sender (message, DBUS_SERVICE_DBUS); bus_dbus_impl_dispatch_message_by_rule (dbus, message, NULL); ibus_message_unref (message); }
IBusInputContext * ibus_bus_create_input_context (IBusBus *bus, const gchar *client_name) { g_assert (IBUS_IS_BUS (bus)); g_assert (client_name != NULL); g_return_val_if_fail (ibus_bus_is_connected (bus), NULL); gchar *path; DBusMessage *call = NULL; DBusMessage *reply = NULL; IBusError *error; IBusInputContext *context = NULL; IBusBusPrivate *priv; priv = IBUS_BUS_GET_PRIVATE (bus); call = ibus_message_new_method_call (IBUS_SERVICE_IBUS, IBUS_PATH_IBUS, IBUS_INTERFACE_IBUS, "CreateInputContext"); ibus_message_append_args (call, G_TYPE_STRING, &client_name, G_TYPE_INVALID); reply = ibus_connection_send_with_reply_and_block (priv->connection, call, -1, &error); ibus_message_unref (call); if (reply == NULL) { g_warning ("%s: %s", error->name, error->message); ibus_error_free (error); return NULL; } if ((error = ibus_error_new_from_message (reply)) != NULL) { g_warning ("%s: %s", error->name, error->message); ibus_message_unref (reply); ibus_error_free (error); return NULL; } if (!ibus_message_get_args (reply, &error, IBUS_TYPE_OBJECT_PATH, &path, G_TYPE_INVALID)) { g_warning ("%s: %s", error->name, error->message); ibus_message_unref (reply); ibus_error_free (error); return NULL; } context = ibus_input_context_new (path, priv->connection); ibus_message_unref (reply); return context; }
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_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_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; }
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); }
/* introspectable interface */ static IBusMessage * _dbus_introspect (BusDBusImpl *dbus, IBusMessage *message, BusConnection *connection) { static const gchar *introspect = DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE "<node>\n" " <interface name=\"org.freedesktop.DBus.Introspectable\">\n" " <method name=\"Introspect\">\n" " <arg name=\"data\" direction=\"out\" type=\"s\"/>\n" " </method>\n" " </interface>\n" " <interface name=\"org.freedesktop.DBus\">\n" " <method name=\"Hello\">\n" " <arg direction=\"out\" type=\"s\"/>\n" " </method>\n" " <method name=\"RequestName\">\n" " <arg direction=\"in\" type=\"s\"/>\n" " <arg direction=\"in\" type=\"u\"/>\n" " <arg direction=\"out\" type=\"u\"/>\n" " </method>\n" " <method name=\"ReleaseName\">\n" " <arg direction=\"in\" type=\"s\"/>\n" " <arg direction=\"out\" type=\"u\"/>\n" " </method>\n" " <method name=\"StartServiceByName\">\n" " <arg direction=\"in\" type=\"s\"/>\n" " <arg direction=\"in\" type=\"u\"/>\n" " <arg direction=\"out\" type=\"u\"/>\n" " </method>\n" " <method name=\"UpdateActivationEnvironment\">\n" " <arg direction=\"in\" type=\"a{ss}\"/>\n" " </method>\n" " <method name=\"NameHasOwner\">\n" " <arg direction=\"in\" type=\"s\"/>\n" " <arg direction=\"out\" type=\"b\"/>\n" " </method>\n" " <method name=\"ListNames\">\n" " <arg direction=\"out\" type=\"as\"/>\n" " </method>\n" " <method name=\"ListActivatableNames\">\n" " <arg direction=\"out\" type=\"as\"/>\n" " </method>\n" " <method name=\"AddMatch\">\n" " <arg direction=\"in\" type=\"s\"/>\n" " </method>\n" " <method name=\"RemoveMatch\">\n" " <arg direction=\"in\" type=\"s\"/>\n" " </method>\n" " <method name=\"GetNameOwner\">\n" " <arg direction=\"in\" type=\"s\"/>\n" " <arg direction=\"out\" type=\"s\"/>\n" " </method>\n" " <method name=\"ListQueuedOwners\">\n" " <arg direction=\"in\" type=\"s\"/>\n" " <arg direction=\"out\" type=\"as\"/>\n" " </method>\n" " <method name=\"GetConnectionUnixUser\">\n" " <arg direction=\"in\" type=\"s\"/>\n" " <arg direction=\"out\" type=\"u\"/>\n" " </method>\n" " <method name=\"GetConnectionUnixProcessID\">\n" " <arg direction=\"in\" type=\"s\"/>\n" " <arg direction=\"out\" type=\"u\"/>\n" " </method>\n" " <method name=\"GetAdtAuditSessionData\">\n" " <arg direction=\"in\" type=\"s\"/>\n" " <arg direction=\"out\" type=\"ay\"/>\n" " </method>\n" " <method name=\"GetConnectionSELinuxSecurityContext\">\n" " <arg direction=\"in\" type=\"s\"/>\n" " <arg direction=\"out\" type=\"ay\"/>\n" " </method>\n" " <method name=\"ReloadConfig\">\n" " </method>\n" " <method name=\"GetId\">\n" " <arg direction=\"out\" type=\"s\"/>\n" " </method>\n" " <signal name=\"NameOwnerChanged\">\n" " <arg type=\"s\"/>\n" " <arg type=\"s\"/>\n" " <arg type=\"s\"/>\n" " </signal>\n" " <signal name=\"NameLost\">\n" " <arg type=\"s\"/>\n" " </signal>\n" " <signal name=\"NameAcquired\">\n" " <arg type=\"s\"/>\n" " </signal>\n" " </interface>\n" "</node>\n"; IBusMessage *reply_message; reply_message = ibus_message_new_method_return (message); ibus_message_append_args (reply_message, G_TYPE_STRING, &introspect, G_TYPE_INVALID); return reply_message; }
static gboolean ibus_engine_ibus_message (IBusEngine *engine, IBusConnection *connection, IBusMessage *message) { g_assert (IBUS_IS_ENGINE (engine)); g_assert (IBUS_IS_CONNECTION (connection)); g_assert (message != NULL); g_assert (ibus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_CALL); IBusEnginePrivate *priv; priv = IBUS_ENGINE_GET_PRIVATE (engine); g_assert (priv->connection == connection); IBusMessage *reply = NULL; IBusError *error = NULL; gboolean retval; gint i; const gchar *interface; const gchar *name; static const struct { gchar *member; guint signal_id; } no_arg_methods[] = { { "FocusIn", FOCUS_IN }, { "FocusOut", FOCUS_OUT }, { "Reset", RESET }, { "Enable", ENABLE }, { "Disable", DISABLE }, { "PageUp", PAGE_UP }, { "PageDown", PAGE_DOWN }, { "CursorUp", CURSOR_UP }, { "CursorDown", CURSOR_DOWN }, }; interface = ibus_message_get_interface (message); name = ibus_message_get_member (message); if (interface != NULL && g_strcmp0 (interface, IBUS_INTERFACE_ENGINE) != 0) return IBUS_SERVICE_CLASS (ibus_engine_parent_class)->ibus_message ( (IBusService *) engine, connection, message); do { if (g_strcmp0 (name, "ProcessKeyEvent") == 0) { guint keyval, keycode, state; retval = ibus_message_get_args (message, &error, G_TYPE_UINT, &keyval, G_TYPE_UINT, &keycode, G_TYPE_UINT, &state, G_TYPE_INVALID); if (!retval) { reply = ibus_message_new_error_printf (message, DBUS_ERROR_INVALID_ARGS, "%s.%s: Can not match signature (uuu) of method", IBUS_INTERFACE_ENGINE, "ProcessKeyEvent"); ibus_error_free (error); } else { retval = FALSE; g_signal_emit (engine, engine_signals[PROCESS_KEY_EVENT], 0, keyval, keycode, state, &retval); reply = ibus_message_new_method_return (message); ibus_message_append_args (reply, G_TYPE_BOOLEAN, &retval, G_TYPE_INVALID); } break; } for (i = 0; i < G_N_ELEMENTS (no_arg_methods) && g_strcmp0 (name, no_arg_methods[i].member) != 0; i++); if (i < G_N_ELEMENTS (no_arg_methods)) { 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_ENGINE, no_arg_methods[i].member); } else { g_signal_emit (engine, engine_signals[no_arg_methods[i].signal_id], 0); reply = ibus_message_new_method_return (message); } break; } if (g_strcmp0 (name, "CandidateClicked") == 0) { guint index, button, state; retval = ibus_message_get_args (message, &error, G_TYPE_UINT, &index, G_TYPE_UINT, &button, G_TYPE_UINT, &state, G_TYPE_INVALID); if (!retval) { reply = ibus_message_new_error_printf (message, DBUS_ERROR_INVALID_ARGS, "%s.%s: Can not match signature (uuu) of method", IBUS_INTERFACE_ENGINE, "CandidateClicked"); ibus_error_free (error); } else { g_signal_emit (engine, engine_signals[CANDIDATE_CLICKED], 0, index, button, state); reply = ibus_message_new_method_return (message); } } else if (g_strcmp0 (name, "PropertyActivate") == 0) { gchar *name; guint state; retval = ibus_message_get_args (message, &error, G_TYPE_STRING, &name, G_TYPE_UINT, &state, G_TYPE_INVALID); if (!retval) { reply = ibus_message_new_error_printf (message, DBUS_ERROR_INVALID_ARGS, "%s.%s: Can not match signature (si) of method", IBUS_INTERFACE_ENGINE, "PropertyActivate"); ibus_error_free (error); } else { g_signal_emit (engine, engine_signals[PROPERTY_ACTIVATE], 0, name, state); reply = ibus_message_new_method_return (message); } } else if (g_strcmp0 (name, "PropertyShow") == 0) { gchar *name; retval = ibus_message_get_args (message, &error, G_TYPE_STRING, &name, G_TYPE_INVALID); if (!retval) { reply = ibus_message_new_error_printf (message, DBUS_ERROR_INVALID_ARGS, "%s.%s: Can not match signature (s) of method", IBUS_INTERFACE_ENGINE, "PropertyShow"); ibus_error_free (error); } else { g_signal_emit (engine, engine_signals[PROPERTY_SHOW], 0, name); reply = ibus_message_new_method_return (message); } } else if (g_strcmp0 (name, "PropertyHide") == 0) { gchar *name; retval = ibus_message_get_args (message, &error, G_TYPE_STRING, &name, G_TYPE_INVALID); if (!retval) { reply = ibus_message_new_error_printf (message, DBUS_ERROR_INVALID_ARGS, "%s.%s: Can not match signature (s) of method", IBUS_INTERFACE_ENGINE, "PropertyHide"); ibus_error_free (error); } else { g_signal_emit (engine, engine_signals[PROPERTY_HIDE], 0, name); reply = ibus_message_new_method_return (message); } } else if (g_strcmp0 (name, "SetCursorLocation") == 0) { gint x, y, w, h; 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) { reply = ibus_message_new_error_printf (message, DBUS_ERROR_INVALID_ARGS, "%s.%s: Can not match signature (iiii) of method", IBUS_INTERFACE_ENGINE, "SetCursorLocation"); ibus_error_free (error); } else { engine->cursor_area.x = x; engine->cursor_area.y = y; engine->cursor_area.width = w; engine->cursor_area.height = h; g_signal_emit (engine, engine_signals[SET_CURSOR_LOCATION], 0, x, y, w, h); reply = ibus_message_new_method_return (message); } } else if (g_strcmp0 (name, "SetCapabilities") == 0) { guint caps; retval = ibus_message_get_args (message, &error, G_TYPE_UINT, &caps, G_TYPE_INVALID); if (!retval) { reply = ibus_message_new_error_printf (message, DBUS_ERROR_INVALID_ARGS, "%s.%s: Can not match signature (u) of method", IBUS_INTERFACE_ENGINE, "SetCapabilities"); ibus_error_free (error); } else { engine->client_capabilities = caps; g_signal_emit (engine, engine_signals[SET_CAPABILITIES], 0, caps); reply = ibus_message_new_method_return (message); } } else if (g_strcmp0 (name, "Destroy") == 0) { reply = ibus_message_new_method_return (message); ibus_connection_send (connection, reply); ibus_message_unref (reply); ibus_object_destroy ((IBusObject *) engine); return TRUE; } else { reply = ibus_message_new_error_printf (message, DBUS_ERROR_UNKNOWN_METHOD, "%s.%s", IBUS_INTERFACE_ENGINE, name); g_warn_if_reached (); } } while (0); ibus_connection_send (connection, reply); ibus_message_unref (reply); return TRUE; }
static gboolean ibus_factory_ibus_message (IBusFactory *factory, IBusConnection *connection, IBusMessage *message) { g_assert (IBUS_IS_FACTORY (factory)); g_assert (IBUS_IS_CONNECTION (connection)); g_assert (message != NULL); IBusMessage *reply_message; IBusFactoryPrivate *priv; priv = IBUS_FACTORY_GET_PRIVATE (factory); g_assert (priv->connection == connection); if (ibus_message_is_method_call (message, IBUS_INTERFACE_FACTORY, "CreateEngine")) { gchar *engine_name; gchar *path; IBusError *error; IBusEngine *engine; gboolean retval; GType engine_type; retval = ibus_message_get_args (message, &error, G_TYPE_STRING, &engine_name, G_TYPE_INVALID); if (!retval) { reply_message = ibus_message_new_error_printf (message, DBUS_ERROR_INVALID_ARGS, "The 1st arg should be engine name"); ibus_connection_send (connection, reply_message); ibus_message_unref (reply_message); return TRUE; } engine_type = (GType )g_hash_table_lookup (priv->engine_table, engine_name); if (engine_type == G_TYPE_INVALID) { reply_message = ibus_message_new_error_printf (message, DBUS_ERROR_FAILED, "Can not create engine %s", engine_name); ibus_connection_send (connection, reply_message); ibus_message_unref (reply_message); return TRUE; } path = g_strdup_printf ("/org/freedesktop/IBus/Engine/%d", ++priv->id); engine = g_object_new (engine_type, "name", engine_name, "path", path, "connection", priv->connection, NULL); priv->engine_list = g_list_append (priv->engine_list, engine); g_signal_connect (engine, "destroy", G_CALLBACK (_engine_destroy_cb), factory); reply_message = ibus_message_new_method_return (message); ibus_message_append_args (reply_message, IBUS_TYPE_OBJECT_PATH, &path, G_TYPE_INVALID); g_free (path); ibus_connection_send (connection, reply_message); ibus_message_unref (reply_message); return TRUE; } return IBUS_SERVICE_CLASS (ibus_factory_parent_class)->ibus_message ( (IBusService *)factory, connection, message); }