=== modified file 'liblightdm-gobject/power.c' --- liblightdm-gobject/power.c 2013-01-31 20:56:09 +0000 +++ liblightdm-gobject/power.c 2013-04-15 02:21:06 +0000 @@ -17,6 +17,7 @@ static GDBusProxy *upower_proxy = NULL; static GDBusProxy *ck_proxy = NULL; +static GDBusProxy *login1_proxy = NULL; static gboolean upower_call_function (const gchar *function, gboolean default_result, GError **error) @@ -109,11 +110,10 @@ return upower_call_function ("Hibernate", TRUE, error); } -static gboolean -ck_call_function (const gchar *function, gboolean default_result, GError **error) +static GVariant * +ck_call_function (const gchar *function, GError **error) { - GVariant *result; - gboolean function_result = FALSE; + GVariant *r; if (!ck_proxy) { @@ -129,22 +129,46 @@ return FALSE; } - result = g_dbus_proxy_call_sync (ck_proxy, - function, - NULL, - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - error); - - if (!result) - return default_result; - - if (g_variant_is_of_type (result, G_VARIANT_TYPE ("(b)"))) - g_variant_get (result, "(b)", &function_result); - - g_variant_unref (result); - return function_result; + r = g_dbus_proxy_call_sync (ck_proxy, + function, + NULL, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + error); + + return r; +} + +static GVariant * +login1_call_function (const gchar *function, GVariant *parameters, GError **error) +{ + GVariant *r; + gchar *str_result; + + if (!login1_proxy) + { + login1_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "org.freedesktop.login1", + "/org/freedesktop/login1", + "org.freedesktop.login1.Manager", + NULL, + error); + if (!login1_proxy) + return NULL; + } + + r = g_dbus_proxy_call_sync (login1_proxy, + function, + parameters, + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + error); + + return r; } /** @@ -157,7 +181,29 @@ gboolean lightdm_get_can_restart (void) { - return ck_call_function ("CanRestart", FALSE, NULL); + gboolean can_restart = FALSE; + GVariant *r; + + r = login1_call_function ("CanReboot", NULL, NULL); + if (r) + { + gchar *result; + if (g_variant_is_of_type (r, G_VARIANT_TYPE ("(s)"))) + { + g_variant_get (r, "(&s)", &result); + can_restart = g_strcmp0 (result, "yes") == 0; + } + } + else + { + r = ck_call_function ("CanRestart", NULL); + if (r && g_variant_is_of_type (r, G_VARIANT_TYPE ("(b)"))) + g_variant_get (r, "(b)", &can_restart); + } + if (r) + g_variant_unref (r); + + return can_restart; } /** @@ -171,7 +217,20 @@ gboolean lightdm_restart (GError **error) { - return ck_call_function ("Restart", TRUE, error); + GVariant *r; + gboolean restarted; + + r = login1_call_function ("Reboot", g_variant_new("(b)", FALSE), error); + if (!r) + { + g_clear_error (error); + r = ck_call_function ("Restart", error); + } + restarted = r != NULL; + if (r) + g_variant_unref (r); + + return restarted; } /** @@ -184,7 +243,29 @@ gboolean lightdm_get_can_shutdown (void) { - return ck_call_function ("CanStop", FALSE, NULL); + gboolean can_shutdown = FALSE; + GVariant *r; + + r = login1_call_function ("CanPowerOff", NULL, NULL); + if (r) + { + gchar *result; + if (g_variant_is_of_type (r, G_VARIANT_TYPE ("(s)"))) + { + g_variant_get (r, "(&s)", &result); + can_shutdown = g_strcmp0 (result, "yes") == 0; + } + } + else + { + r = ck_call_function ("CanStop", NULL); + if (r && g_variant_is_of_type (r, G_VARIANT_TYPE ("(b)"))) + g_variant_get (r, "(b)", &can_shutdown); + } + if (r) + g_variant_unref (r); + + return can_shutdown; } /** @@ -198,5 +279,18 @@ gboolean lightdm_shutdown (GError **error) { - return ck_call_function ("Stop", TRUE, error); + GVariant *r; + gboolean shutdown; + + r = login1_call_function ("PowerOff", g_variant_new("(b)", FALSE), error); + if (!r) + { + g_clear_error (error); + r = ck_call_function ("Stop", error); + } + shutdown = r != NULL; + if (r) + g_variant_unref (r); + + return shutdown; } === modified file 'liblightdm-qt/power.cpp' --- liblightdm-qt/power.cpp 2013-02-06 14:08:25 +0000 +++ liblightdm-qt/power.cpp 2013-04-14 23:00:34 +0000 @@ -15,6 +15,7 @@ #include #include #include +#include #include "config.h" @@ -26,11 +27,13 @@ PowerInterfacePrivate(); QScopedPointer powerManagementInterface; QScopedPointer consoleKitInterface; + QScopedPointer login1Interface; }; PowerInterface::PowerInterfacePrivate::PowerInterfacePrivate() : powerManagementInterface(new QDBusInterface("org.freedesktop.UPower","/org/freedesktop/UPower", "org.freedesktop.UPower", QDBusConnection::systemBus())), - consoleKitInterface(new QDBusInterface("org.freedesktop.ConsoleKit", "/org/freedesktop/ConsoleKit/Manager", "org.freedesktop.ConsoleKit.Manager", QDBusConnection::systemBus())) + consoleKitInterface(new QDBusInterface("org.freedesktop.ConsoleKit", "/org/freedesktop/ConsoleKit/Manager", "org.freedesktop.ConsoleKit.Manager", QDBusConnection::systemBus())), + login1Interface(new QDBusInterface("org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager", QDBusConnection::systemBus())) { } @@ -80,34 +83,54 @@ bool PowerInterface::canShutdown() { + if (d->login1Interface->isValid()) { + QDBusReply reply1 = d->login1Interface->call("CanPowerOff"); + if (reply1.isValid()) { + return reply1.value() == "yes"; + } + } + qWarning() << d->login1Interface->lastError(); + QDBusReply reply = d->consoleKitInterface->call("CanStop"); if (reply.isValid()) { return reply.value(); } - else { - return false; - } + + return false; } void PowerInterface::shutdown() { - d->consoleKitInterface->call("Stop"); + if (d->login1Interface->isValid()) + d->login1Interface->call("PowerOff", false); + else + d->consoleKitInterface->call("Stop"); } bool PowerInterface::canRestart() { + if (d->login1Interface->isValid()) { + QDBusReply reply1 = d->login1Interface->call("CanReboot"); + if (reply1.isValid()) { + return reply1.value() == "yes"; + } + } + qWarning() << d->login1Interface->lastError(); + QDBusReply reply = d->consoleKitInterface->call("CanRestart"); if (reply.isValid()) { return reply.value(); } - else { - return false; - } + + return false; } void PowerInterface::restart() { - d->consoleKitInterface->call("Restart"); + if (d->login1Interface->isValid()) + d->login1Interface->call("Reboot", false); + else + d->consoleKitInterface->call("Restart"); } #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) === modified file 'tests/Makefile.am' --- tests/Makefile.am 2013-04-12 03:46:06 +0000 +++ tests/Makefile.am 2013-04-14 22:54:54 +0000 @@ -135,6 +135,8 @@ test-no-accounts-service \ test-console-kit \ test-no-console-kit \ + test-no-login1 \ + test-no-console-kit-or-login1 \ test-open-file-descriptors \ test-xdmcp-open-file-descriptors @@ -284,8 +286,10 @@ scripts/no-accounts-service.conf \ scripts/no-config.conf \ scripts/no-console-kit.conf \ + scripts/no-console-kit-or-login1.conf \ scripts/no-keyboard-layout.conf \ scripts/no-language.conf \ + scripts/no-login1.conf \ scripts/open-file-descriptors.conf \ scripts/pam.conf \ scripts/plymouth-active-vt.conf \ === added file 'tests/scripts/no-console-kit-or-login1.conf' --- tests/scripts/no-console-kit-or-login1.conf 1970-01-01 00:00:00 +0000 +++ tests/scripts/no-console-kit-or-login1.conf 2013-04-14 22:54:54 +0000 @@ -0,0 +1,34 @@ +# +# Check still works when neither ConsoleKit or login1 is available +# + +[test-runner-config] +disable-console-kit=true +disable-login1=true + +[LightDM] +minimum-display-number=50 + +[SeatDefaults] +autologin-user=have-password1 + +#?RUNNER DAEMON-START + +# X server starts +#?XSERVER :50 START +#?XSERVER :50 INDICATE-READY + +# LightDM connects to X server +#?XSERVER :50 ACCEPT-CONNECT + +# Session starts +#?SESSION :50 START USER=have-password1 +#?XSERVER :50 ACCEPT-CONNECT +#?SESSION :50 CONNECT-XSERVER + +# Cleanup +#?*STOP-DAEMON +# Don't know what order they will terminate +#?(SESSION :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15) +#?(SESSION :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15) +#?RUNNER DAEMON-EXIT STATUS=0 === added file 'tests/scripts/no-login1.conf' --- tests/scripts/no-login1.conf 1970-01-01 00:00:00 +0000 +++ tests/scripts/no-login1.conf 2013-04-14 22:54:54 +0000 @@ -0,0 +1,33 @@ +# +# Check still works when login1 is not available +# + +[test-runner-config] +disable-login1=true + +[LightDM] +minimum-display-number=50 + +[SeatDefaults] +autologin-user=have-password1 + +#?RUNNER DAEMON-START + +# X server starts +#?XSERVER :50 START +#?XSERVER :50 INDICATE-READY + +# LightDM connects to X server +#?XSERVER :50 ACCEPT-CONNECT + +# Session starts +#?SESSION :50 START USER=have-password1 +#?XSERVER :50 ACCEPT-CONNECT +#?SESSION :50 CONNECT-XSERVER + +# Cleanup +#?*STOP-DAEMON +# Don't know what order they will terminate +#?(SESSION :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15) +#?(SESSION :50 TERMINATE SIGNAL=15|XSERVER :50 TERMINATE SIGNAL=15) +#?RUNNER DAEMON-EXIT STATUS=0 === modified file 'tests/src/test-runner.c' --- tests/src/test-runner.c 2013-03-27 00:48:48 +0000 +++ tests/src/test-runner.c 2013-04-14 22:54:54 +0000 @@ -838,6 +838,101 @@ } static void +handle_login1_call (GDBusConnection *connection, + const gchar *sender, + const gchar *object_path, + const gchar *interface_name, + const gchar *method_name, + GVariant *parameters, + GDBusMethodInvocation *invocation, + gpointer user_data) +{ + if (strcmp (method_name, "CanReboot") == 0) + g_dbus_method_invocation_return_value (invocation, g_variant_new ("(s)", "yes")); + else if (strcmp (method_name, "Reboot") == 0) + { + gboolean interactive; + g_variant_get (parameters, "(b)", &interactive); + g_dbus_method_invocation_return_value (invocation, g_variant_new ("()")); + } + if (strcmp (method_name, "CanPowerOff") == 0) + g_dbus_method_invocation_return_value (invocation, g_variant_new ("(s)", "yes")); + else if (strcmp (method_name, "PowerOff") == 0) + { + gboolean interactive; + g_variant_get (parameters, "(b)", &interactive); + g_dbus_method_invocation_return_value (invocation, g_variant_new ("()")); + } + else + g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_FAILED, "No such method: %s", method_name); +} + +static void +login1_name_acquired_cb (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + const gchar *login1_interface = + "" + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + ""; + static const GDBusInterfaceVTable login1_vtable = + { + handle_login1_call, + }; + GDBusNodeInfo *login1_info; + GError *error = NULL; + + login1_info = g_dbus_node_info_new_for_xml (login1_interface, &error); + if (error) + g_warning ("Failed to parse D-Bus interface: %s", error->message); + g_clear_error (&error); + if (!login1_info) + return; + g_dbus_connection_register_object (connection, + "/org/freedesktop/login1", + login1_info->interfaces[0], + &login1_vtable, + NULL, NULL, + &error); + if (error) + g_warning ("Failed to register login1 service: %s", error->message); + g_clear_error (&error); + g_dbus_node_info_unref (login1_info); + + service_count--; + if (service_count == 0) + run_lightdm (); +} + +static void +start_login1_daemon () +{ + service_count++; + g_bus_own_name (G_BUS_TYPE_SYSTEM, + "org.freedesktop.login1", + G_BUS_NAME_OWNER_FLAGS_NONE, + login1_name_acquired_cb, + NULL, + NULL, + NULL, + NULL); +} + +static void load_passwd_file () { gchar *path, *data, **lines; @@ -1474,6 +1569,8 @@ /* Start D-Bus services */ if (!g_key_file_get_boolean (config, "test-runner-config", "disable-console-kit", NULL)) start_console_kit_daemon (); + if (!g_key_file_get_boolean (config, "test-runner-config", "disable-login1", NULL)) + start_login1_daemon (); if (!g_key_file_get_boolean (config, "test-runner-config", "disable-accounts-service", NULL)) start_accounts_service_daemon (); === added file 'tests/test-no-console-kit-or-login1' --- tests/test-no-console-kit-or-login1 1970-01-01 00:00:00 +0000 +++ tests/test-no-console-kit-or-login1 2013-04-14 22:54:54 +0000 @@ -0,0 +1,2 @@ +#!/bin/sh +./src/dbus-env ./src/test-runner no-console-kit-or-login1 test-gobject-greeter === added file 'tests/test-no-login1' --- tests/test-no-login1 1970-01-01 00:00:00 +0000 +++ tests/test-no-login1 2013-04-14 22:54:54 +0000 @@ -0,0 +1,2 @@ +#!/bin/sh +./src/dbus-env ./src/test-runner no-login1 test-gobject-greeter