void
panel_session_manager_request_shutdown (PanelSessionManager *manager)
{
	GVariant *ret;
	GError   *error;

	g_return_if_fail (PANEL_IS_SESSION_MANAGER (manager));

	if (!manager->priv->session_proxy) {
		g_warning ("Session manager service not available.");
		return;
	}

	error = NULL;
	ret = g_dbus_proxy_call_sync (manager->priv->session_proxy,
				      "Shutdown",
				      NULL,
				      G_DBUS_CALL_FLAGS_NONE,
				      -1,
				      NULL,
				      &error);

	if (ret)
		g_variant_unref (ret);

	if (error) {
		g_warning ("Could not ask session manager to shut down: %s",
			   error->message);
		g_error_free (error);
	}
}
PanelSessionManagerPresenceType
panel_session_manager_get_presence (PanelSessionManager *manager)
{
        GVariant *variant;
        PanelSessionManagerPresenceType ret;

	g_return_val_if_fail (PANEL_IS_SESSION_MANAGER (manager),
                              PANEL_SESSION_MANAGER_PRESENCE_AVAILABLE);

	if (!manager->priv->presence_proxy) {
		g_warning ("Session manager service not available.");
		return PANEL_SESSION_MANAGER_PRESENCE_AVAILABLE;
	}

        variant = g_dbus_proxy_get_cached_property (manager->priv->presence_proxy,
                                                    "status");

        if (!variant) {
                g_warning ("Could not get presence from session manager.");
                return PANEL_SESSION_MANAGER_PRESENCE_AVAILABLE;
        }

        g_variant_get (variant, "u", &ret);
        g_variant_unref (variant);

        return ret;
}
void
panel_session_manager_set_presence (PanelSessionManager             *manager,
                                    PanelSessionManagerPresenceType  presence)
{
	GVariant *ret;
	GError   *error;

	g_return_if_fail (PANEL_IS_SESSION_MANAGER (manager));

	if (!manager->priv->presence_proxy) {
		g_warning ("Session manager service not available.");
		return;
	}

	error = NULL;
	ret = g_dbus_proxy_call_sync (manager->priv->presence_proxy,
				      "SetStatus",
				      g_variant_new ("(u)", presence),
				      G_DBUS_CALL_FLAGS_NONE,
				      -1,
				      NULL,
				      &error);

	if (ret)
		g_variant_unref (ret);

	if (error) {
		g_warning ("Could not ask session manager to change presence: %s",
			   error->message);
		g_error_free (error);
	}
}
void
panel_session_manager_request_logout (PanelSessionManager           *manager,
				      PanelSessionManagerLogoutType  mode)
{
	GError *error;
	DBusGProxy *proxy;

	g_return_if_fail (PANEL_IS_SESSION_MANAGER (manager));

	error = NULL;

	if (!panel_dbus_service_ensure_connection (PANEL_DBUS_SERVICE (manager),
						   &error)) {
		g_warning ("Could not connect to session manager: %s",
			   error->message);
		g_error_free (error);
		return;
	}

	proxy = panel_dbus_service_get_proxy (PANEL_DBUS_SERVICE (manager));

	if (!dbus_g_proxy_call (proxy, "Logout", &error,
				G_TYPE_UINT, mode, G_TYPE_INVALID,
				G_TYPE_INVALID) &&
	    error != NULL) {
		g_warning ("Could not ask session manager to log out: %s",
			   error->message);
		g_error_free (error);
	}
}
gboolean
panel_session_manager_is_shutdown_available (PanelSessionManager *manager)
{
	GError *error;
	DBusGProxy *proxy;
	gboolean is_shutdown_available;

	g_return_val_if_fail (PANEL_IS_SESSION_MANAGER (manager), FALSE);

	error = NULL;

	if (!panel_dbus_service_ensure_connection (PANEL_DBUS_SERVICE (manager),
						   &error)) {
		g_warning ("Could not connect to session manager: %s",
			   error->message);
		g_error_free (error);

		return FALSE;
	}

	proxy = panel_dbus_service_get_proxy (PANEL_DBUS_SERVICE (manager));

	if (!dbus_g_proxy_call (proxy, "CanShutdown", &error,
				G_TYPE_INVALID, G_TYPE_BOOLEAN,
				&is_shutdown_available, G_TYPE_INVALID) &&
	    error != NULL) {
		g_warning ("Could not ask session manager if shut down is available: %s",
			   error->message);
		g_error_free (error);

		return FALSE;
	}

	return is_shutdown_available;
}
gboolean
panel_session_manager_is_shutdown_available (PanelSessionManager *manager)
{
	GVariant *ret;
	GError   *error;
	gboolean  is_shutdown_available = FALSE;

	g_return_val_if_fail (PANEL_IS_SESSION_MANAGER (manager), FALSE);

	if (!manager->priv->session_proxy) {
		g_warning ("Session manager service not available.");
		return FALSE;
	}

	error = NULL;
	ret = g_dbus_proxy_call_sync (manager->priv->session_proxy,
				      "CanShutdown",
				      NULL,
				      G_DBUS_CALL_FLAGS_NONE,
				      -1,
				      NULL,
				      &error);

	if (error) {
		g_warning ("Could not ask session manager if shut down is available: %s",
			   error->message);
		g_error_free (error);

		return FALSE;
	} else {
		g_variant_get (ret, "(b)", &is_shutdown_available);
		g_variant_unref (ret);
	}

	return is_shutdown_available;
}