46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/*
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Copyright (C) 2010-2011 Robert Ancell.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Author: Robert Ancell <robert.ancell@canonical.com>
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * This library is free software; you can redistribute it and/or modify it under
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * the terms of the GNU Lesser General Public License as published by the Free
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Software Foundation; either version 2 or version 3 of the License.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * See http://www.gnu.org/copyleft/lgpl.html the full text of the license.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync */
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync#include "config.h"
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync#include <string.h>
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync#include <gio/gio.h>
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync#include "lightdm/power.h"
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic GDBusProxy *upower_proxy = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic GDBusProxy *ck_proxy = NULL;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic gboolean
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncupower_call_function (const gchar *function, gboolean default_result, GError **error)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GVariant *result;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gboolean function_result = FALSE;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!upower_proxy)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync upower_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_DBUS_PROXY_FLAGS_NONE,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.UPower",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "/org/freedesktop/UPower",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.UPower",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!upower_proxy)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return FALSE;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync result = g_dbus_proxy_call_sync (upower_proxy,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync function,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_DBUS_CALL_FLAGS_NONE,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync -1,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!result)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return default_result;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (g_variant_is_of_type (result, G_VARIANT_TYPE ("(b)")))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_get (result, "(b)", &function_result);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_unref (result);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return function_result;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_get_can_suspend:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Checks if authorized to do a system suspend.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: #TRUE if can suspend the system
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncgboolean
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_get_can_suspend (void)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return upower_call_function ("SuspendAllowed", FALSE, NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_suspend:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @error: return location for a #GError, or %NULL
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Triggers a system suspend.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: #TRUE if suspend initiated.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncgboolean
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_suspend (GError **error)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return upower_call_function ("Suspend", TRUE, error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_get_can_hibernate:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Checks if is authorized to do a system hibernate.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: #TRUE if can hibernate the system
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncgboolean
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_get_can_hibernate (void)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return upower_call_function ("HibernateAllowed", FALSE, NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_hibernate:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @error: return location for a #GError, or %NULL
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Triggers a system hibernate.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: #TRUE if hibernate initiated.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncgboolean
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_hibernate (GError **error)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return upower_call_function ("Hibernate", TRUE, error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncstatic gboolean
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncck_call_function (const gchar *function, gboolean default_result, GError **error)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync GVariant *result;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync gboolean function_result = FALSE;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!ck_proxy)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync {
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync ck_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_DBUS_PROXY_FLAGS_NONE,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.ConsoleKit",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "/org/freedesktop/ConsoleKit/Manager",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync "org.freedesktop.ConsoleKit.Manager",
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!ck_proxy)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return FALSE;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync }
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync result = g_dbus_proxy_call_sync (ck_proxy,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync function,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync G_DBUS_CALL_FLAGS_NONE,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync -1,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync NULL,
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (!result)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return default_result;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync if (g_variant_is_of_type (result, G_VARIANT_TYPE ("(b)")))
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_get (result, "(b)", &function_result);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync g_variant_unref (result);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return function_result;
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_get_can_restart:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Checks if is authorized to do a system restart.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: #TRUE if can restart the system
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncgboolean
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_get_can_restart (void)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return ck_call_function ("CanRestart", FALSE, NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_restart:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @error: return location for a #GError, or %NULL
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Triggers a system restart.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: #TRUE if restart initiated.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncgboolean
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_restart (GError **error)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return ck_call_function ("Restart", TRUE, error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_get_can_shutdown:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Checks if is authorized to do a system shutdown.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: #TRUE if can shutdown the system
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncgboolean
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_get_can_shutdown (void)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return ck_call_function ("CanStop", FALSE, NULL);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync/**
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * lightdm_shutdown:
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * @error: return location for a #GError, or %NULL
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Triggers a system shutdown.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync *
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync * Return value: #TRUE if shutdown initiated.
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync **/
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsyncgboolean
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsynclightdm_shutdown (GError **error)
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync{
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync return ck_call_function ("Stop", TRUE, error);
46633cdb66707c52c31cadcfbc4ce38c68f47d2evboxsync}