gboolean file_chooser_init (GDBusConnection *bus, GError **error) { GDBusInterfaceSkeleton *helper; helper = G_DBUS_INTERFACE_SKELETON (xdp_file_chooser_skeleton_new ()); g_signal_connect (helper, "handle-open-file", G_CALLBACK (handle_file_chooser_open), NULL); g_signal_connect (helper, "handle-open-files", G_CALLBACK (handle_file_chooser_open), NULL); g_signal_connect (helper, "handle-save-file", G_CALLBACK (handle_file_chooser_open), NULL); g_signal_connect (helper, "handle-close", G_CALLBACK (handle_file_chooser_close), NULL); if (!g_dbus_interface_skeleton_export (helper, bus, "/org/freedesktop/portal/desktop", error)) return FALSE; g_debug ("providing %s", g_dbus_interface_skeleton_get_info (helper)->name); return TRUE; }
gboolean app_chooser_init (GDBusConnection *bus, GError **error) { GDBusInterfaceSkeleton *helper; helper = G_DBUS_INTERFACE_SKELETON (xdp_impl_app_chooser_skeleton_new ()); g_signal_connect (helper, "handle-choose-application", G_CALLBACK (handle_choose_application), NULL); g_signal_connect (helper, "handle-update-choices", G_CALLBACK (handle_update_choices), NULL); if (!g_dbus_interface_skeleton_export (helper, bus, DESKTOP_PORTAL_OBJECT_PATH, error)) return FALSE; handles = g_hash_table_new (g_str_hash, g_str_equal); g_debug ("providing %s", g_dbus_interface_skeleton_get_info (helper)->name); return TRUE; }
gboolean account_init (GDBusConnection *bus, GError **error) { GDBusInterfaceSkeleton *helper; g_autofree char *object_path = NULL; system_bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, error); if (system_bus == NULL) return FALSE; helper = G_DBUS_INTERFACE_SKELETON (xdp_impl_account_skeleton_new ()); g_signal_connect (helper, "handle-get-user-information", G_CALLBACK (handle_get_user_information), NULL); if (!g_dbus_interface_skeleton_export (helper, bus, DESKTOP_PORTAL_OBJECT_PATH, error)) return FALSE; object_path = g_strdup_printf ("/org/freedesktop/Accounts/User%d", getuid ()); user = org_freedesktop_accounts_user_proxy_new_sync (system_bus, G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START, "org.freedesktop.Accounts", object_path, NULL, error); if (user == NULL) return FALSE; g_debug ("providing %s", g_dbus_interface_skeleton_get_info (helper)->name); return TRUE; }
/** * g_dbus_object_manager_server_export: * @manager: A #GDBusObjectManagerServer. * @object: A #GDBusObjectSkeleton. * * Exports @object on @manager. * * If there is already a #GDBusObject exported at the object path, * then the old object is removed. * * The object path for @object must be in the hierarchy rooted by the * object path for @manager. * * Note that @manager will take a reference on @object for as long as * it is exported. * * Since: 2.30 */ void g_dbus_object_manager_server_export (GDBusObjectManagerServer *manager, GDBusObjectSkeleton *object) { RegistrationData *data; GList *existing_interfaces; GList *l; GPtrArray *interface_names; const gchar *object_path; object_path = g_dbus_object_get_object_path (G_DBUS_OBJECT (object)); g_return_if_fail (G_IS_DBUS_OBJECT_MANAGER_SERVER (manager)); g_return_if_fail (G_IS_DBUS_OBJECT (object)); g_return_if_fail (g_str_has_prefix (object_path, manager->priv->object_path_ending_in_slash)); interface_names = g_ptr_array_new (); data = g_hash_table_lookup (manager->priv->map_object_path_to_data, object_path); if (data != NULL) g_dbus_object_manager_server_unexport (manager, object_path); data = g_new0 (RegistrationData, 1); data->object = g_object_ref (object); data->manager = manager; data->map_iface_name_to_iface = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify) g_object_unref); g_signal_connect (object, "interface-added", G_CALLBACK (on_interface_added), data); g_signal_connect (object, "interface-removed", G_CALLBACK (on_interface_removed), data); /* Register all known interfaces - note that data->exported is FALSE so * we don't emit any InterfacesAdded signals. */ existing_interfaces = g_dbus_object_get_interfaces (G_DBUS_OBJECT (object)); for (l = existing_interfaces; l != NULL; l = l->next) { GDBusInterfaceSkeleton *interface_skeleton = G_DBUS_INTERFACE_SKELETON (l->data); registration_data_export_interface (data, interface_skeleton); g_ptr_array_add (interface_names, g_dbus_interface_skeleton_get_info (interface_skeleton)->name); } g_list_foreach (existing_interfaces, (GFunc) g_object_unref, NULL); g_list_free (existing_interfaces); g_ptr_array_add (interface_names, NULL); data->exported = TRUE; /* now emit InterfacesAdded() for all the interfaces */ g_dbus_object_manager_server_emit_interfaces_added (manager, data, (const gchar *const *) interface_names->pdata); g_ptr_array_unref (interface_names); g_hash_table_insert (manager->priv->map_object_path_to_data, g_strdup (object_path), data); }