[Xfce4-commits] <xfce4-session:master> Using dbus_g_proxy_new_for_name_owner when the session tries to figure out which backend to use for sleep/hibernate is a bad idea, since the name might not have an owner, using dbus_g_proxy_new_for_name always returns a valid proxy for that name, so when calling a method on the proxy the bus will activate the service if it is not already running and was provided by a .service file.
Jérôme Guelfucci
noreply at xfce.org
Sat Feb 27 00:38:04 CET 2010
Updating branch refs/heads/master
to f9ad6a5ac0a3f3e08e5a696ac10f7a6905f365c0 (commit)
from c95e2095f891aaf5ac531fbb3189e9eadd68d7aa (commit)
commit f9ad6a5ac0a3f3e08e5a696ac10f7a6905f365c0
Author: Ali Abdallah <aliov at xfce.org>
Date: Wed Feb 10 16:50:03 2010 +0100
Using dbus_g_proxy_new_for_name_owner when the session tries to figure out which
backend to use for sleep/hibernate is a bad idea, since the name might not have
an owner, using dbus_g_proxy_new_for_name always returns a valid proxy for that
name, so when calling a method on the proxy the bus will activate the service if
it is not already running and was provided by a .service file.
xfce4-session/xfsm-shutdown-helper.c | 204 ++++++++++++++++++++--------------
1 files changed, 119 insertions(+), 85 deletions(-)
diff --git a/xfce4-session/xfsm-shutdown-helper.c b/xfce4-session/xfsm-shutdown-helper.c
index 79e223d..1f5b0c3 100644
--- a/xfce4-session/xfsm-shutdown-helper.c
+++ b/xfce4-session/xfsm-shutdown-helper.c
@@ -336,12 +336,11 @@ xfsm_shutdown_helper_init_polkit_data (XfsmShutdownHelper *helper)
gboolean subject_created = FALSE;
helper->polkit_proxy =
- dbus_g_proxy_new_for_name_owner (helper->system_bus,
- "org.freedesktop.PolicyKit1",
- "/org/freedesktop/PolicyKit1/Authority",
- "org.freedesktop.PolicyKit1.Authority",
- NULL);
-
+ dbus_g_proxy_new_for_name (helper->system_bus,
+ "org.freedesktop.PolicyKit1",
+ "/org/freedesktop/PolicyKit1/Authority",
+ "org.freedesktop.PolicyKit1.Authority");
+
if ( !helper->polkit_proxy )
return FALSE;
@@ -360,11 +359,11 @@ xfsm_shutdown_helper_init_polkit_data (XfsmShutdownHelper *helper)
gboolean ret;
gchar *consolekit_session;
- proxy = dbus_g_proxy_new_for_name_owner (helper->system_bus,
- "org.freedesktop.ConsoleKit",
- "/org/freedesktop/ConsoleKit/Manager",
- "org.freedesktop.ConsoleKit.Manager",
- NULL);
+ proxy = dbus_g_proxy_new_for_name (helper->system_bus,
+ "org.freedesktop.ConsoleKit",
+ "/org/freedesktop/ConsoleKit/Manager",
+ "org.freedesktop.ConsoleKit.Manager");
+
if ( proxy )
{
ret = dbus_g_proxy_call (proxy, "GetSessionForCookie", &error,
@@ -395,13 +394,13 @@ xfsm_shutdown_helper_init_polkit_data (XfsmShutdownHelper *helper)
g_free (consolekit_session);
subject_created = TRUE;
}
+ else if (error)
+ {
+ g_warning ("'GetSessionForCookie' failed : %s", error->message);
+ g_error_free (error);
+ }
g_object_unref (proxy);
}
- else if (error)
- {
- g_warning ("'GetSessionForCookie' failed : %s", error->message);
- g_error_free (error);
- }
}
/**
@@ -612,17 +611,65 @@ error0:
return FALSE;
}
+#ifdef ENABLE_UPOWER
/**
- * xfsm_shutdown_helper_check_upower:
+ * xfsm_shutdown_helper_get_power_props:
+ *
+ **/
+static GHashTable *
+xfsm_shutdown_helper_get_power_props (XfsmShutdownHelper *helper,
+ const gchar *name,
+ const gchar *path,
+ const gchar *iface)
+{
+ DBusGProxy *proxy_prop;
+ GHashTable *props;
+ GType g_type_hash_map;
+ GError *error = NULL;
+
+ proxy_prop = dbus_g_proxy_new_for_name (helper->system_bus,
+ name,
+ path,
+ DBUS_INTERFACE_PROPERTIES);
+
+ if ( !proxy_prop )
+ {
+ g_warning ("Unable to create proxy for %s", name);
+ return NULL;
+ }
+
+ /* The Hash table is a pair of (strings, GValues) */
+ g_type_hash_map = dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE);
+
+ dbus_g_proxy_call (proxy_prop, "GetAll", &error,
+ G_TYPE_STRING, iface,
+ G_TYPE_INVALID,
+ g_type_hash_map, &props,
+ G_TYPE_INVALID);
+
+ g_object_unref (proxy_prop);
+
+ if ( error )
+ {
+ g_warning ("Method 'GetAll' failed : %s", error->message);
+ g_error_free (error);
+ return NULL;
+ }
+
+ return props;
+}
+
+
+/**
+ * xfsm_shutdown_helper_check_devkit_upower:
*
* Check upower (formely devicekit-power)
* for hibernate and suspend availability.
*
* Returns: FALSE if failed to contact upower, TRUE otherwise.
**/
-#ifdef ENABLE_UPOWER
static gboolean
-xfsm_shutdown_helper_check_upower (XfsmShutdownHelper *helper)
+xfsm_shutdown_helper_check_devkit_upower (XfsmShutdownHelper *helper)
{
/**
* Get the properties on 'org.freedesktop.UPower'
@@ -637,10 +684,7 @@ xfsm_shutdown_helper_check_upower (XfsmShutdownHelper *helper)
* LidIsPresent' 'b'
**/
- DBusGProxy *proxy_prop;
GHashTable *props;
- GError *error = NULL;
- GType g_type_hash_map;
GValue *value;
const gchar *name, *path, *iface;
@@ -650,56 +694,35 @@ xfsm_shutdown_helper_check_upower (XfsmShutdownHelper *helper)
iface = "org.freedesktop.Power";
helper->devkit_is_upower = TRUE;
-
- proxy_prop = dbus_g_proxy_new_for_name_owner (helper->system_bus,
+
+ props = xfsm_shutdown_helper_get_power_props (helper,
name,
path,
- DBUS_INTERFACE_PROPERTIES,
- NULL);
+ iface);
+ if ( !props )
+ {
+ g_message ("UPower not found, trying DevKitPower");
- if ( !proxy_prop )
- {
- g_message ("UPower not found, trying DevKitPower");
-
- name = "org.freedesktop.DeviceKit.Power";
- path = "/org/freedesktop/DeviceKit/Power";
- iface = "org.freedesktop.DeviceKit.Power";
-
- helper->devkit_is_upower = FALSE;
- proxy_prop = dbus_g_proxy_new_for_name_owner (helper->system_bus,
- name,
- path,
- DBUS_INTERFACE_PROPERTIES,
- NULL);
-
- if ( !proxy_prop )
- {
- g_message ("Devkit Power is not running or not installed");
- return FALSE;
- }
- }
-
- /* The Hash table is a pair of (strings, GValues) */
- g_type_hash_map = dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE);
+ name = "org.freedesktop.DeviceKit.Power";
+ path = "/org/freedesktop/DeviceKit/Power";
+ iface = "org.freedesktop.DeviceKit.Power";
- dbus_g_proxy_call (proxy_prop, "GetAll", &error,
- G_TYPE_STRING, iface,
- G_TYPE_INVALID,
- g_type_hash_map, &props,
- G_TYPE_INVALID);
+ helper->devkit_is_upower = FALSE;
- g_object_unref (proxy_prop);
-
- if ( error )
- {
- g_warning ("Method 'GetAll' on %s failed with %s", iface, error->message);
- g_error_free (error);
- return FALSE;
+ props = xfsm_shutdown_helper_get_power_props (helper,
+ name,
+ path,
+ iface);
+ if (!props)
+ {
+ g_message ("Devkit Power is not running or not installed");
+ return FALSE;
+ }
}
-
+
/*Get The CanSuspend bit*/
value = g_hash_table_lookup (props, "CanSuspend");
-
+
if ( G_LIKELY (value) )
{
helper->can_suspend = g_value_get_boolean (value);
@@ -740,12 +763,13 @@ xfsm_shutdown_helper_check_console_kit (XfsmShutdownHelper *helper)
{
DBusGProxy *proxy;
GError *error = NULL;
+ gboolean ret;
- proxy = dbus_g_proxy_new_for_name_owner (helper->system_bus,
- "org.freedesktop.ConsoleKit",
- "/org/freedesktop/ConsoleKit/Manager",
- "org.freedesktop.ConsoleKit.Manager",
- NULL);
+ proxy = dbus_g_proxy_new_for_name (helper->system_bus,
+ "org.freedesktop.ConsoleKit",
+ "/org/freedesktop/ConsoleKit/Manager",
+ "org.freedesktop.ConsoleKit.Manager");
+
if (!proxy)
{
@@ -753,16 +777,16 @@ xfsm_shutdown_helper_check_console_kit (XfsmShutdownHelper *helper)
return FALSE;
}
- dbus_g_proxy_call (proxy, "CanStop", &error,
- G_TYPE_INVALID,
- G_TYPE_BOOLEAN, &helper->can_shutdown,
- G_TYPE_INVALID);
-
+ ret = dbus_g_proxy_call (proxy, "CanStop", &error,
+ G_TYPE_INVALID,
+ G_TYPE_BOOLEAN, &helper->can_shutdown,
+ G_TYPE_INVALID);
+
if ( error )
{
g_warning ("'CanStop' method failed : %s", error->message);
g_error_free (error);
- error = NULL;
+ goto out;
}
dbus_g_proxy_call (proxy, "CanRestart", &error,
@@ -774,11 +798,16 @@ xfsm_shutdown_helper_check_console_kit (XfsmShutdownHelper *helper)
{
g_warning ("'CanRestart' method failed : %s", error->message);
g_error_free (error);
+ goto out;
}
+ ret = TRUE;
+
+ out:
+
g_object_unref (proxy);
- return TRUE;
+ return ret;
}
#endif /*ENABLE_CONSOLE_KIT*/
@@ -796,13 +825,13 @@ xfsm_shutdown_helper_check_hal (XfsmShutdownHelper *helper)
DBusGProxy *proxy_power;
DBusGProxy *proxy_device;
GError *error = NULL;
+ gboolean ret = FALSE;
proxy_power =
- dbus_g_proxy_new_for_name_owner (helper->system_bus,
- "org.freedesktop.Hal",
- "/org/freedesktop/Hal/devices/computer",
- "org.freedesktop.Hal.Device.SystemPowerManagement",
- NULL);
+ dbus_g_proxy_new_for_name (helper->system_bus,
+ "org.freedesktop.Hal",
+ "/org/freedesktop/Hal/devices/computer",
+ "org.freedesktop.Hal.Device.SystemPowerManagement");
if (!proxy_power)
{
@@ -866,7 +895,7 @@ xfsm_shutdown_helper_check_hal (XfsmShutdownHelper *helper)
{
g_warning ("Method 'GetPropertyBoolean' failed : %s", error->message);
g_error_free (error);
- error = NULL;
+ goto out;
}
dbus_g_proxy_call (proxy_device, "GetPropertyBoolean", &error,
@@ -879,11 +908,16 @@ xfsm_shutdown_helper_check_hal (XfsmShutdownHelper *helper)
{
g_warning ("Method 'GetPropertyBoolean' failed : %s", error->message);
g_error_free (error);
+ goto out;
}
+ ret = TRUE;
+
+ out:
+
g_object_unref (proxy_device);
- return TRUE;
+ return ret;
}
#endif /*ENABLE_HAL*/
@@ -946,7 +980,7 @@ xfsm_shutdown_helper_check_authorization (XfsmShutdownHelper *helper,
}
else if ( error )
{
- g_warning ("'CheckAuthorization' failed with %s", error->message);
+ g_warning ("'CheckAuthorization' failed : %s", error->message);
g_error_free (error);
}
@@ -973,7 +1007,7 @@ xfsm_shutdown_helper_check_backends (XfsmShutdownHelper *helper)
#ifdef ENABLE_UPOWER
/*Check upower (formely devicekit-power)*/
- if ( xfsm_shutdown_helper_check_upower (helper) )
+ if ( xfsm_shutdown_helper_check_devkit_upower (helper) )
helper->sleep_backend = XFSM_SLEEP_BACKEND_UPOWER;
#endif /* ENABLE_UPOWER */
More information about the Xfce4-commits
mailing list