diff options
Diffstat (limited to 'src/backend-dbus/utils.c')
-rw-r--r-- | src/backend-dbus/utils.c | 384 |
1 files changed, 74 insertions, 310 deletions
diff --git a/src/backend-dbus/utils.c b/src/backend-dbus/utils.c index c8abc2b..25ac7c3 100644 --- a/src/backend-dbus/utils.c +++ b/src/backend-dbus/utils.c @@ -25,346 +25,100 @@ struct session_proxy_data { - ConsoleKitManager * ck_manager; - Accounts * account_manager; + Login1Manager * login1_manager; + Login1Seat * login1_seat; DisplayManagerSeat * dm_seat; - - ConsoleKitSeat * current_seat; - ConsoleKitSession * current_session; - AccountsUser * active_user; + Accounts * account_manager; GCancellable * cancellable; - GError * error; int pending; indicator_session_util_session_proxies_func callback; gpointer user_data; }; -static void -session_proxy_data_free (struct session_proxy_data * data) -{ - g_clear_object (&data->ck_manager); - g_clear_object (&data->account_manager); - g_clear_object (&data->dm_seat); - - g_clear_object (&data->current_seat); - g_clear_object (&data->current_session); - g_clear_object (&data->active_user); - - g_clear_object (&data->cancellable); - g_clear_error (&data->error); - - g_free (data); -} static void -finish_callback (struct session_proxy_data * data) +on_proxy_ready_impl (struct session_proxy_data * data, + gsize member_offset, + GError * err, + gpointer proxy) { - g_assert (data != NULL); - g_debug ("%s %s: pending is %d", G_STRLOC, G_STRFUNC, (data->pending-1)); - - if (!--data->pending) + if (err != NULL) { - data->callback (data->ck_manager, - data->account_manager, - data->dm_seat, - data->current_seat, - data->current_session, - data->active_user, - data->error, - data->user_data); + if (!g_error_matches (err, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + g_warning ("%s %s: %s", G_STRLOC, G_STRFUNC, err->message); - session_proxy_data_free (data); - } -} - -static void -on_user_proxy_ready (GObject * o G_GNUC_UNUSED, - GAsyncResult * res, - gpointer gdata) -{ - struct session_proxy_data * data = gdata; - g_debug ("%s %s", G_STRLOC, G_STRFUNC); - - data->active_user = accounts_user_proxy_new_for_bus_finish (res, &data->error); - - if (data->error != NULL) - { - if (!g_error_matches (data->error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - g_warning ("%s %s: %s", G_STRLOC, G_STRFUNC, data->error->message); + g_error_free (err); } else { - g_debug ("%s %s user proxy is %p", G_STRLOC, G_STRFUNC, (void*)data->active_user); - } - - finish_callback (data); -} - -static void -on_user_path_ready (GObject * o G_GNUC_UNUSED, GAsyncResult * res, gpointer gdata) -{ - char * path = NULL; - struct session_proxy_data * data = gdata; - g_debug ("%s %s", G_STRLOC, G_STRFUNC); - - accounts_call_find_user_by_id_finish (data->account_manager, &path, res, &data->error); - - if (data->error != NULL) - { - if (!g_error_matches (data->error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - g_warning ("%s %s: %s", G_STRLOC, G_STRFUNC, data->error->message); - } - else if (path != NULL) - { - g_debug ("%s %s user path is %s", G_STRLOC, G_STRFUNC, path); - ++data->pending; - accounts_user_proxy_new_for_bus (G_BUS_TYPE_SYSTEM, - G_DBUS_PROXY_FLAGS_GET_INVALIDATED_PROPERTIES, - "org.freedesktop.Accounts", - path, - data->cancellable, - on_user_proxy_ready, - data); + *((gpointer*)G_STRUCT_MEMBER_P(data, member_offset)) = proxy; } - finish_callback (data); - g_free (path); -} - -static void -on_uid_ready (GObject * o G_GNUC_UNUSED, GAsyncResult * res, gpointer gdata) -{ - guint uid = 0; - struct session_proxy_data * data = gdata; - g_debug ("%s %s", G_STRLOC, G_STRFUNC); - - console_kit_session_call_get_unix_user_finish (data->current_session, &uid, res, &data->error); - if (data->error != NULL) - { - if (!g_error_matches (data->error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - g_warning ("%s %s: %s", G_STRLOC, G_STRFUNC, data->error->message); - } - else if (uid) - { - g_debug ("%s %s uid is %u", G_STRLOC, G_STRFUNC, uid); - ++data->pending; - accounts_call_find_user_by_id (data->account_manager, - uid, - data->cancellable, - on_user_path_ready, - data); - } - - finish_callback (data); -} - -static void -on_seat_proxy_ready (GObject * o G_GNUC_UNUSED, GAsyncResult * res, gpointer gdata) -{ - struct session_proxy_data * data = gdata; - g_debug ("%s %s", G_STRLOC, G_STRFUNC); - - data->current_seat = console_kit_seat_proxy_new_for_bus_finish (res, &data->error); - - if (data->error && !g_error_matches (data->error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - g_warning ("%s %s: %s", G_STRLOC, G_STRFUNC, data->error->message); - - finish_callback (data); -} - -static void -on_sid_ready (GObject * o G_GNUC_UNUSED, GAsyncResult * res, gpointer gdata) -{ - char * sid = NULL; - struct session_proxy_data * data = gdata; - g_debug ("%s %s", G_STRLOC, G_STRFUNC); - - console_kit_session_call_get_seat_id_finish (data->current_session, &sid, res, &data->error); - - if (data->error != NULL) - { - if (!g_error_matches (data->error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - g_warning ("%s %s: %s", G_STRLOC, G_STRFUNC, data->error->message); - } - else if (sid != NULL) - { - g_debug ("%s %s sid is %s", G_STRLOC, G_STRFUNC, sid); - ++data->pending; - console_kit_seat_proxy_new_for_bus (G_BUS_TYPE_SYSTEM, - G_DBUS_PROXY_FLAGS_GET_INVALIDATED_PROPERTIES, - "org.freedesktop.ConsoleKit", - sid, - data->cancellable, - on_seat_proxy_ready, - data); - } - - finish_callback (data); - g_free (sid); -} - -static void -on_session_proxy_ready (GObject * o G_GNUC_UNUSED, GAsyncResult * res, gpointer gdata) -{ - struct session_proxy_data * data = gdata; - g_debug ("%s %s", G_STRLOC, G_STRFUNC); - - data->current_session = console_kit_session_proxy_new_finish (res, &data->error); - if (data->error != NULL) - { - if (!g_error_matches (data->error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - g_warning ("%s %s: %s", G_STRLOC, G_STRFUNC, data->error->message); - } - else + if (!--data->pending) { - ++data->pending; - console_kit_session_call_get_seat_id (data->current_session, - data->cancellable, - on_sid_ready, - data); + data->callback (data->login1_manager, + data->login1_seat, + data->dm_seat, + data->account_manager, + data->cancellable, + data->user_data); - ++data->pending; - console_kit_session_call_get_unix_user (data->current_session, - data->cancellable, - on_uid_ready, - data); + g_clear_object (&data->login1_manager); + g_clear_object (&data->login1_seat); + g_clear_object (&data->dm_seat); + g_clear_object (&data->account_manager); + g_clear_object (&data->cancellable); + g_free (data); } - - finish_callback (data); } - + static void -on_current_session_ready (GObject * o G_GNUC_UNUSED, GAsyncResult * res, gpointer gdata) +on_display_manager_seat_proxy_ready (GObject * o G_GNUC_UNUSED, + GAsyncResult * res, + gpointer gdata) { - char * ssid = NULL; - struct session_proxy_data * data = gdata; - g_debug ("%s %s", G_STRLOC, G_STRFUNC); - - ssid = NULL; - console_kit_manager_call_get_current_session_finish (data->ck_manager, - &ssid, res, - &data->error); - if (data->error != NULL) - { - if (!g_error_matches (data->error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - g_warning ("%s %s: %s", G_STRLOC, G_STRFUNC, data->error->message); - } - else if (ssid) - { - g_debug ("%s %s ssid is %s", G_STRLOC, G_STRFUNC, ssid); - data->pending++; - console_kit_session_proxy_new_for_bus (G_BUS_TYPE_SYSTEM, - G_DBUS_PROXY_FLAGS_GET_INVALIDATED_PROPERTIES, - "org.freedesktop.ConsoleKit", - ssid, - data->cancellable, - on_session_proxy_ready, - data); - - } - - finish_callback (data); - g_free (ssid); + gsize offset = G_STRUCT_OFFSET (struct session_proxy_data, dm_seat); + GError * err = NULL; + gpointer proxy = display_manager_seat_proxy_new_for_bus_finish (res, &err); + on_proxy_ready_impl (gdata, offset, err, proxy); } static void -on_display_manager_seat_proxy_ready (GObject * o G_GNUC_UNUSED, - GAsyncResult * res, - gpointer gdata) +on_login1_seat_ready (GObject * o G_GNUC_UNUSED, + GAsyncResult * res, + gpointer gdata) { - DisplayManagerSeat * seat; - struct session_proxy_data * data = gdata; - - seat = display_manager_seat_proxy_new_for_bus_finish (res, &data->error); - - if (data->error != NULL) - { - if (!g_error_matches (data->error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - g_warning ("%s %s: %s", G_STRLOC, G_STRFUNC, data->error->message); - } - else if (seat != NULL) - { - data->dm_seat = g_object_ref (seat); - } - - finish_callback (data); - g_clear_object (&seat); + gsize offset = G_STRUCT_OFFSET (struct session_proxy_data, login1_seat); + GError * err = NULL; + gpointer proxy = login1_seat_proxy_new_for_bus_finish (res, &err); + on_proxy_ready_impl (gdata, offset, err, proxy); } static void -on_console_kit_manager_proxy_ready (GObject * o G_GNUC_UNUSED, - GAsyncResult * res, - gpointer gdata) +on_login1_manager_ready (GObject * o G_GNUC_UNUSED, + GAsyncResult * res, + gpointer gdata) { - ConsoleKitManager * mgr; - struct session_proxy_data * data = gdata; - g_debug ("%s %s", G_STRLOC, G_STRFUNC); - - if (data->error == NULL) - { - mgr = console_kit_manager_proxy_new_for_bus_finish (res, &data->error); - g_debug ("%s %s mgr is %p, err is %p", G_STRLOC, G_STRFUNC, (void*)mgr, (void*)data->error); - - if (data->error != NULL) - { - if (!g_error_matches (data->error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - g_warning ("%s %s: %s", G_STRLOC, G_STRFUNC, data->error->message); - } - else - { - data->ck_manager = mgr; - - data->pending++; - console_kit_manager_call_get_current_session (mgr, - data->cancellable, - on_current_session_ready, - data); - - } - } - - finish_callback (data); + gsize offset = G_STRUCT_OFFSET (struct session_proxy_data, login1_manager); + GError * err = NULL; + gpointer proxy = login1_manager_proxy_new_for_bus_finish (res, &err); + on_proxy_ready_impl (gdata, offset, err, proxy); } static void -on_accounts_proxy_ready (GObject * o G_GNUC_UNUSED, GAsyncResult * res, gpointer gdata) +on_accounts_proxy_ready (GObject * o G_GNUC_UNUSED, + GAsyncResult * res, + gpointer gdata) { - struct session_proxy_data * data = gdata; - g_debug ("%s %s", G_STRLOC, G_STRFUNC); - - if (data->error == NULL) - { - data->account_manager = accounts_proxy_new_for_bus_finish (res, &data->error); - - if (data->error && !g_error_matches (data->error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - g_warning ("%s %s: %s", G_STRLOC, G_STRFUNC, data->error->message); - } - - finish_callback (data); + gsize offset = G_STRUCT_OFFSET (struct session_proxy_data, account_manager); + GError * err = NULL; + gpointer proxy = accounts_proxy_new_for_bus_finish (res, &err); + on_proxy_ready_impl (gdata, offset, err, proxy); } -/** - * Getting all the proxies we want is kind of a pain -- - * especially without blocking (ie, using _sync() funcs) -- - * so it's farmed out to this wrapper utility. - * - * 1. in this func, start getting the ConsoleKit and Accounts proxies - * 2. when the accounts proxy is ready, stash it in data.account_manager - * 3. when the ck manager proxy is ready, stash it in data.ck_manager and - * ask it for the current session's ssid - * 4. when the ssid is ready, start getting a proxy for it - * 5. when the session's proxy is ready, stash it in data.current_session - * and ask it for both the current seat's sid and the active user's uid - * 6. When the current seat's sid is ready, start getting a proxy for it - * 7. When the current seat's proxy is ready, stash it in data.current_seat - * 8. when the active user's uid is ready, ask data.account_manager for the path - * 9. when the user path is ready, start getting an Accounts.User proxy for it - * 10. when the Accounts.User proxy is read, stash it in data.active_user - * - * When everything is done, or if there's an error, invoke the data.callback - */ +/* helper utility to get the dbus proxies used by the backend-dbus classes */ void indicator_session_util_get_session_proxies ( indicator_session_util_session_proxies_func func, @@ -372,6 +126,7 @@ indicator_session_util_get_session_proxies ( gpointer user_data) { struct session_proxy_data * data; + char * seat_path; data = g_new0 (struct session_proxy_data, 1); data->callback = func; @@ -379,6 +134,23 @@ indicator_session_util_get_session_proxies ( data->cancellable = g_object_ref (cancellable); data->pending++; + login1_manager_proxy_new_for_bus (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_GET_INVALIDATED_PROPERTIES, + "org.freedesktop.login1", + "/org/freedesktop/login1", + data->cancellable, + on_login1_manager_ready, data); + + data->pending++; + seat_path = g_strconcat ("/org/freedesktop/login1/seat/", g_getenv("XDG_SEAT"), NULL); + login1_seat_proxy_new_for_bus (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_GET_INVALIDATED_PROPERTIES, + "org.freedesktop.login1", + seat_path, + data->cancellable, + on_login1_seat_ready, + data); + data->pending++; accounts_proxy_new_for_bus (G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_GET_INVALIDATED_PROPERTIES, "org.freedesktop.Accounts", @@ -387,15 +159,6 @@ indicator_session_util_get_session_proxies ( on_accounts_proxy_ready, data); data->pending++; - console_kit_manager_proxy_new_for_bus ( - G_BUS_TYPE_SYSTEM, - G_DBUS_PROXY_FLAGS_GET_INVALIDATED_PROPERTIES, - "org.freedesktop.ConsoleKit", - "/org/freedesktop/ConsoleKit/Manager", - data->cancellable, - on_console_kit_manager_proxy_ready, data); - - data->pending++; display_manager_seat_proxy_new_for_bus ( G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_GET_INVALIDATED_PROPERTIES, @@ -404,4 +167,5 @@ indicator_session_util_get_session_proxies ( data->cancellable, on_display_manager_seat_proxy_ready, data); + g_free (seat_path); } |