diff --git a/plugins/sharing/gsd-sharing-manager.c b/plugins/sharing/gsd-sharing-manager.c index 8b818c4..73da2c7 100644 --- a/plugins/sharing/gsd-sharing-manager.c +++ b/plugins/sharing/gsd-sharing-manager.c @@ -134,6 +134,7 @@ static const char * const configurable_services[] = { /* Services that are delegated to the user session by a system service */ +#if HAVE_SYSTEMD_LIB static AssignedService assigned_services[] = { { .system_bus_name = "org.gnome.RemoteDesktop", @@ -143,6 +144,7 @@ static AssignedService assigned_services[] = { .remote_session_classes = { "user", "greeter", NULL } } }; +#endif static void handle_unit_cb (GObject *source_object, @@ -265,8 +267,6 @@ gsd_sharing_manager_sync_configurable_services (GsdSharingManager *manager) g_list_free (services); } - -#if HAVE_SYSTEMD_LIB static void on_assigned_service_finished (GPid pid, int exit_status, @@ -301,9 +301,6 @@ start_assigned_service (GsdSharingManager *manager, { AssignedService *service; - if (manager->sharing_status == GSD_SHARING_STATUS_OFFLINE) - return; - if (!info->system_service_running) return; @@ -407,34 +404,6 @@ stop_assigned_service_after_timeout (GsdSharingManager *manager, timeout_source, G_SOURCE_FUNC (on_timeout_reached)); } -#endif - -static void -gsd_sharing_manager_sync_assigned_services (GsdSharingManager *manager) -{ -#if HAVE_SYSTEMD_LIB - GList *services, *l; - - services = g_hash_table_get_values (manager->assigned_services); - - for (l = services; l != NULL; l = l->next) { - AssignedServiceInfo *info = l->data; - - if (manager->sharing_status == GSD_SHARING_STATUS_OFFLINE) - stop_assigned_service (manager, info); - else - start_assigned_service (manager, info); - } - g_list_free (services); -#endif -} - -static void -gsd_sharing_manager_sync_services (GsdSharingManager *manager) -{ - gsd_sharing_manager_sync_configurable_services (manager); - gsd_sharing_manager_sync_assigned_services (manager); -} #if HAVE_NETWORK_MANAGER static void @@ -761,6 +730,98 @@ static const GDBusInterfaceVTable interface_vtable = NULL }; +static void +on_system_bus_name_appeared (GDBusConnection *connection, + const char *system_bus_name, + const char *system_bus_name_owner, + gpointer user_data) +{ + GsdSharingManager *manager = user_data; + AssignedServiceInfo *info; + + info = g_hash_table_lookup (manager->assigned_services, system_bus_name); + + if (info == NULL) + return; + + if (info->system_service_running) + return; + + info->system_service_running = TRUE; + + start_assigned_service (manager, info); +} + +static void +on_system_bus_name_vanished (GDBusConnection *connection, + const char *system_bus_name, + gpointer user_data) +{ + GsdSharingManager *manager = user_data; + AssignedServiceInfo *info; + + info = g_hash_table_lookup (manager->assigned_services, system_bus_name); + + if (info == NULL) + return; + + if (!info->system_service_running) + return; + + info->system_service_running = FALSE; + + stop_assigned_service_after_timeout (manager, info); +} + +static void +gsd_sharing_manager_start_assigned_services (GsdSharingManager *manager) +{ + GHashTableIter iter; + gpointer key, value; + + g_hash_table_iter_init (&iter, manager->assigned_services); + while (g_hash_table_iter_next (&iter, &key, &value)) { + AssignedServiceInfo *info = value; + AssignedService *service = info->service; + + info->system_bus_name_watch = g_bus_watch_name (G_BUS_TYPE_SYSTEM, + service->system_bus_name, + G_BUS_NAME_WATCHER_FLAGS_NONE, + on_system_bus_name_appeared, + on_system_bus_name_vanished, + manager, + NULL); + } +} + +static void +cancel_pending_wait_tasks (GsdSharingManager *manager) +{ + GHashTableIter iter; + gpointer key, value; + + g_hash_table_iter_init (&iter, manager->assigned_services); + while (g_hash_table_iter_next (&iter, &key, &value)) { + AssignedServiceInfo *info = value; + g_cancellable_cancel (info->cancellable); + } +} + +static void +gsd_sharing_manager_stop_assigned_services (GsdSharingManager *manager) +{ + GList *services, *l; + + cancel_pending_wait_tasks (manager); + + services = g_hash_table_get_values (manager->assigned_services); + for (l = services; l != NULL; l = l->next) { + AssignedServiceInfo *info = l->data; + stop_assigned_service (manager, info); + } + g_list_free (services); +} + static void on_bus_gotten (GObject *source_object, GAsyncResult *res, @@ -793,6 +854,8 @@ on_bus_gotten (GObject *source_object, NULL, NULL, NULL); + + gsd_sharing_manager_start_assigned_services (manager); } #if HAVE_NETWORK_MANAGER @@ -846,7 +909,7 @@ primary_connection_changed (GObject *gobject, g_debug ("status: %d", manager->sharing_status); properties_changed (manager); - gsd_sharing_manager_sync_services (manager); + gsd_sharing_manager_sync_configurable_services (manager); } static void @@ -931,19 +994,6 @@ gsd_sharing_manager_start (GsdSharingManager *manager, return TRUE; } -static void -cancel_pending_wait_tasks (GsdSharingManager *manager) -{ - GHashTableIter iter; - gpointer key, value; - - g_hash_table_iter_init (&iter, manager->assigned_services); - while (g_hash_table_iter_next (&iter, &key, &value)) { - AssignedServiceInfo *info = value; - g_cancellable_cancel (info->cancellable); - } -} - void gsd_sharing_manager_stop (GsdSharingManager *manager) { @@ -954,7 +1004,7 @@ gsd_sharing_manager_stop (GsdSharingManager *manager) if (manager->sharing_status == GSD_SHARING_STATUS_AVAILABLE && manager->connection != NULL) { manager->sharing_status = GSD_SHARING_STATUS_OFFLINE; - gsd_sharing_manager_sync_services (manager); + gsd_sharing_manager_sync_configurable_services (manager); } if (manager->cancellable) { @@ -1008,51 +1058,6 @@ assigned_service_free (gpointer pointer) g_free (info); } -#if HAVE_SYSTEMD_LIB -static void -on_system_bus_name_appeared (GDBusConnection *connection, - const char *system_bus_name, - const char *system_bus_name_owner, - gpointer user_data) -{ - GsdSharingManager *manager = user_data; - AssignedServiceInfo *info; - - info = g_hash_table_lookup (manager->assigned_services, system_bus_name); - - if (info == NULL) - return; - - if (info->system_service_running) - return; - - info->system_service_running = TRUE; - - start_assigned_service (manager, info); -} - -static void -on_system_bus_name_vanished (GDBusConnection *connection, - const char *system_bus_name, - gpointer user_data) -{ - GsdSharingManager *manager = user_data; - AssignedServiceInfo *info; - - info = g_hash_table_lookup (manager->assigned_services, system_bus_name); - - if (info == NULL) - return; - - if (!info->system_service_running) - return; - - info->system_service_running = FALSE; - - stop_assigned_service_after_timeout (manager, info); -} -#endif - static void manage_configurable_services (GsdSharingManager *manager) { @@ -1126,14 +1131,6 @@ manage_assigned_services (GsdSharingManager *manager) info = g_new0 (AssignedServiceInfo, 1); info->service = service; - info->system_bus_name_watch = g_bus_watch_name(G_BUS_TYPE_SYSTEM, - service->system_bus_name, - G_BUS_NAME_WATCHER_FLAGS_NONE, - on_system_bus_name_appeared, - on_system_bus_name_vanished, - manager, - NULL); - g_hash_table_insert (manager->assigned_services, (gpointer) service->system_bus_name, info); } #endif