[Xfce4-commits] [xfce/xfce4-session] 29/30: Port xfce4-session/ to GDBus
noreply at xfce.org
noreply at xfce.org
Sun May 15 18:03:48 CEST 2016
This is an automated email from the git hooks/post-receive script.
eric pushed a commit to branch master
in repository xfce/xfce4-session.
commit 91860af3a38080d45fef68ea623624ef25d7d9ec
Author: Eric Koegel <eric.koegel at gmail.com>
Date: Sun May 15 18:51:03 2016 +0300
Port xfce4-session/ to GDBus
And remove the dbus-glib deps.
---
.gitignore | 4 +
configure.ac.in | 2 -
xfce4-session/Makefile.am | 24 ++-
xfce4-session/main.c | 175 ++++++++-------
xfce4-session/xfsm-client.c | 356 +++++++++++++++++--------------
xfce4-session/xfsm-client.h | 4 +-
xfce4-session/xfsm-error.c | 36 +++-
xfce4-session/xfsm-error.h | 6 +-
xfce4-session/xfsm-manager.c | 496 ++++++++++++++++++++++---------------------
xfce4-session/xfsm-manager.h | 2 +-
10 files changed, 601 insertions(+), 504 deletions(-)
diff --git a/.gitignore b/.gitignore
index 2e19c81..365f4fa 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,6 +21,7 @@ config.status
config.sub
configure
configure.in
+configure.ac
depcomp
engines/mice/generate
engines/mice/preview.h
@@ -45,6 +46,7 @@ po/stamp-it
scripts/startxfce4
scripts/xinitrc
scripts/xinitrc.in
+scripts/xscreensaver.desktop
settings/stamp-xfce4-session-marshal.h
settings/xfce-session-settings.desktop
settings/xfce4-session-marshal.c
@@ -63,6 +65,7 @@ xfce4-session/chooser-icon.h
xfce4-session/stamp-xfsm-marshal.h
xfce4-session/xfce4-session
xfce4-session/xfsm-manager-dbus.h
+xfce4-session/xfsm-manager-dbus.c
xfce4-session/xfsm-marshal.c
xfce4-session/xfsm-marshal.h
xfsm-shutdown-helper/xfsm-shutdown-helper
@@ -71,3 +74,4 @@ xfce4-session.spec
xfce4-session/org.xfce.session.policy
xfce4-session/xfsm-chooser-icon.h
xfce4-session/xfsm-client-dbus.h
+xfce4-session/xfsm-client-dbus.c
diff --git a/configure.ac.in b/configure.ac.in
index e147736..738fd71 100644
--- a/configure.ac.in
+++ b/configure.ac.in
@@ -106,8 +106,6 @@ XDT_CHECK_PACKAGE([GTK], [gtk+-3.0], [3.10.0])
XDT_CHECK_PACKAGE([GIO], [gio-2.0], [2.42.0])
XDT_CHECK_PACKAGE([GMODULE], [gmodule-2.0], [2.24.0])
XDT_CHECK_PACKAGE([LIBWNCK], [libwnck-3.0], [3.10])
-XDT_CHECK_PACKAGE([DBUS], [dbus-1], [1.1.0])
-XDT_CHECK_PACKAGE([DBUS_GLIB], [dbus-glib-1], [0.84])
XDT_CHECK_PACKAGE([XFCONF], [libxfconf-0], [4.12.0])
dnl Check for Polkit/PolicyKit
diff --git a/xfce4-session/Makefile.am b/xfce4-session/Makefile.am
index 00a09d6..e51590e 100644
--- a/xfce4-session/Makefile.am
+++ b/xfce4-session/Makefile.am
@@ -18,7 +18,9 @@ bin_PROGRAMS = xfce4-session
xfce4_session_built_sources = \
xfsm-chooser-icon.h \
+ xfsm-client-dbus.c \
xfsm-client-dbus.h \
+ xfsm-manager-dbus.c \
xfsm-manager-dbus.h \
xfsm-marshal.c \
xfsm-marshal.h
@@ -74,8 +76,6 @@ xfce4_session_CFLAGS = \
$(LIBX11_CFLAGS) \
$(LIBXFCE4UI_CFLAGS) \
$(GIO_CFLAGS) \
- $(DBUS_CFLAGS) \
- $(DBUS_GLIB_CFLAGS) \
$(LIBWNCK_CFLAGS) \
$(POLKIT_CFLAGS) \
$(XFCONF_CFLAGS) \
@@ -95,8 +95,6 @@ xfce4_session_LDADD = \
$(LIBXFCE4UI_LIBS) \
$(GMODULE_LIBS) \
$(GIO_LIBS) \
- $(DBUS_LIBS) \
- $(DBUS_GLIB_LIBS) \
$(LIBWNCK_LIBS) \
$(POLKIT_LIBS) \
$(XFCONF_LIBS) \
@@ -129,11 +127,19 @@ xfsm-marshal.c: $(srcdir)/xfsm-marshal.list Makefile
$(AM_V_GEN) echo "#include <xfce4-session/xfsm-marshal.h>" > $@ \
&& glib-genmarshal --prefix=xfsm_marshal --body $< >> $@
-xfsm-manager-dbus.h: $(srcdir)/xfsm-manager-dbus.xml
- $(AM_V_GEN) dbus-binding-tool --mode=glib-server --prefix=xfsm_manager $< > $@
-
-xfsm-client-dbus.h: $(srcdir)/xfsm-client-dbus.xml
- $(AM_V_GEN) dbus-binding-tool --mode=glib-server --prefix=xfsm_client $< > $@
+xfsm-client-dbus.c xfsm-client-dbus.h : $(srcdir)/xfsm-client-dbus.xml Makefile.am
+ gdbus-codegen \
+ --c-namespace=XfsmDbus \
+ --interface-prefix=org.xfce.Session. \
+ --generate-c-code=xfsm-client-dbus \
+ $(srcdir)/xfsm-client-dbus.xml
+
+xfsm-manager-dbus.c xfsm-manager-dbus.h : $(srcdir)/xfsm-manager-dbus.xml Makefile.am
+ gdbus-codegen \
+ --c-namespace=XfsmDbus \
+ --interface-prefix=org.xfce.Session. \
+ --generate-c-code=xfsm-manager-dbus \
+ $(srcdir)/xfsm-manager-dbus.xml
BUILT_SOURCES = \
$(xfce4_session_built_sources)
diff --git a/xfce4-session/main.c b/xfce4-session/main.c
index fba6dc5..73aba71 100644
--- a/xfce4-session/main.c
+++ b/xfce4-session/main.c
@@ -46,8 +46,7 @@
#include <unistd.h>
#endif
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus-glib-lowlevel.h>
+#include <gio/gio.h>
#include <xfconf/xfconf.h>
@@ -70,6 +69,8 @@
static gboolean opt_disable_tcp = FALSE;
static gboolean opt_version = FALSE;
+static XfsmManager *manager = NULL;
+static XfconfChannel *channel = NULL;
static GOptionEntry option_entries[] =
{
@@ -145,50 +146,115 @@ init_display (XfsmManager *manager,
}
+
static void
-xfsm_dbus_init (void)
+bus_acquired (GDBusConnection *connection,
+ const gchar *name,
+ gpointer user_data)
{
- DBusGConnection *dbus_conn;
- int ret;
- GError *error = NULL;
+ GdkDisplay *dpy;
- xfsm_error_dbus_init ();
+ g_debug ("bus_acquired %s\n", name);
+
+ manager = xfsm_manager_new (connection);
+
+ if (manager == NULL) {
+ g_critical ("Could not create XfsmManager");
+ }
+
+ setup_environment ();
- dbus_conn = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
- if (G_UNLIKELY (!dbus_conn))
+ channel = xfsm_open_config ();
+
+ dpy = gdk_display_get_default ();
+ init_display (manager, dpy, channel, opt_disable_tcp);
+
+ if (!opt_disable_tcp && xfconf_channel_get_bool (channel, "/security/EnableTcp", FALSE))
{
- g_critical ("Unable to contact D-Bus session bus: %s", error ? error->message : "Unknown error");
- if (error)
- g_error_free (error);
- return;
+ /* verify that the DNS settings are ok */
+ xfsm_splash_screen_next (splash_screen, _("Verifying DNS settings"));
+ xfsm_dns_check ();
}
- ret = dbus_bus_request_name (dbus_g_connection_get_connection (dbus_conn),
- "org.xfce.SessionManager",
- DBUS_NAME_FLAG_DO_NOT_QUEUE,
- NULL);
- if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret)
+ xfsm_splash_screen_next (splash_screen, _("Loading session data"));
+
+ xfsm_startup_init (channel);
+ xfsm_manager_load (manager, channel);
+ xfsm_manager_restart (manager);
+}
+
+
+
+static void
+name_acquired (GDBusConnection *connection,
+ const gchar *name,
+ gpointer user_data)
+{
+ g_debug ("name_acquired\n");
+}
+
+
+
+static void
+name_lost (GDBusConnection *connection,
+ const gchar *name,
+ gpointer user_data)
+{
+ GError *error = NULL;
+ XfsmShutdownType shutdown_type;
+ XfsmShutdown *shutdown_helper;
+ gboolean succeed = TRUE;
+
+ g_debug ("name_lost\n");
+
+ /* Release the object */
+ g_debug ("Disconnected from D-Bus");
+
+ shutdown_type = xfsm_manager_get_shutdown_type (manager);
+
+ /* take over the ref before we release the manager */
+ shutdown_helper = xfsm_shutdown_get ();
+
+ g_object_unref (manager);
+ g_object_unref (channel);
+
+ ice_cleanup ();
+
+ if (shutdown_type == XFSM_SHUTDOWN_SHUTDOWN
+ || shutdown_type == XFSM_SHUTDOWN_RESTART)
{
- g_printerr ("%s: Another session manager is already running\n", PACKAGE_NAME);
- exit (EXIT_FAILURE);
+ succeed = xfsm_shutdown_try_type (shutdown_helper, shutdown_type, &error);
+ if (!succeed)
+ g_warning ("Failed to shutdown/restart: %s", ERROR_MSG (error));
}
+
+ g_object_unref (shutdown_helper);
+
+ gtk_main_quit ();
}
+
+
static void
-xfsm_dbus_cleanup (void)
+xfsm_dbus_init (void)
{
- DBusGConnection *dbus_conn;
-
- /* this is all not really necessary, but... */
+ int ret;
- dbus_conn = dbus_g_bus_get (DBUS_BUS_SESSION, NULL);
- if (G_UNLIKELY (!dbus_conn))
- return;
+ ret = g_bus_own_name (G_BUS_TYPE_SESSION,
+ "org.xfce.SessionManager",
+ G_BUS_NAME_OWNER_FLAGS_NONE,
+ bus_acquired, name_acquired, name_lost,
+ NULL, NULL);
- dbus_bus_release_name (dbus_g_connection_get_connection (dbus_conn),
- "org.xfce.SessionManager", NULL);
+ if (ret == 0)
+ {
+ g_printerr ("%s: Another session manager is already running\n", PACKAGE_NAME);
+ exit (EXIT_FAILURE);
+ }
}
+
+
static gboolean
xfsm_dbus_require_session (gint argc, gchar **argv)
{
@@ -232,12 +298,7 @@ xfsm_dbus_require_session (gint argc, gchar **argv)
int
main (int argc, char **argv)
{
- XfsmManager *manager;
GError *error = NULL;
- GdkDisplay *dpy;
- XfconfChannel *channel;
- XfsmShutdownType shutdown_type;
- XfsmShutdown *shutdown_helper;
gboolean succeed = TRUE;
if (!xfsm_dbus_require_session (argc, argv))
@@ -260,7 +321,7 @@ main (int argc, char **argv)
if (opt_version)
{
g_print ("%s %s (Xfce %s)\n\n", G_LOG_DOMAIN, PACKAGE_VERSION, xfce_version_string ());
- g_print ("%s\n", "Copyright (c) 2003-2014");
+ g_print ("%s\n", "Copyright (c) 2003-2016");
g_print ("\t%s\n\n", _("The Xfce development team. All rights reserved."));
g_print (_("Please report bugs to <%s>."), PACKAGE_BUGREPORT);
g_print ("\n");
@@ -281,51 +342,7 @@ main (int argc, char **argv)
xfsm_dbus_init ();
- manager = xfsm_manager_new ();
- setup_environment ();
-
- channel = xfsm_open_config ();
-
- dpy = gdk_display_get_default ();
- init_display (manager, dpy, channel, opt_disable_tcp);
-
- if (!opt_disable_tcp && xfconf_channel_get_bool (channel, "/security/EnableTcp", FALSE))
- {
- /* verify that the DNS settings are ok */
- xfsm_splash_screen_next (splash_screen, _("Verifying DNS settings"));
- xfsm_dns_check ();
- }
-
- xfsm_splash_screen_next (splash_screen, _("Loading session data"));
-
- xfsm_startup_init (channel);
- xfsm_manager_load (manager, channel);
- xfsm_manager_restart (manager);
-
gtk_main ();
- xfsm_startup_shutdown ();
-
- shutdown_type = xfsm_manager_get_shutdown_type (manager);
-
- /* take over the ref before we release the manager */
- shutdown_helper = xfsm_shutdown_get ();
-
- g_object_unref (manager);
- g_object_unref (channel);
-
- xfsm_dbus_cleanup ();
- ice_cleanup ();
-
- if (shutdown_type == XFSM_SHUTDOWN_SHUTDOWN
- || shutdown_type == XFSM_SHUTDOWN_RESTART)
- {
- succeed = xfsm_shutdown_try_type (shutdown_helper, shutdown_type, &error);
- if (!succeed)
- g_warning ("Failed to shutdown/restart: %s", ERROR_MSG (error));
- }
-
- g_object_unref (shutdown_helper);
-
return succeed ? EXIT_SUCCESS : EXIT_FAILURE;
}
diff --git a/xfce4-session/xfsm-client.c b/xfce4-session/xfsm-client.c
index 0455c6c..e823b8a 100644
--- a/xfce4-session/xfsm-client.c
+++ b/xfce4-session/xfsm-client.c
@@ -28,7 +28,7 @@
#include <string.h>
#endif
-#include <dbus/dbus-glib.h>
+#include <gio/gio.h>
#include <libxfsm/xfsm-util.h>
@@ -37,12 +37,13 @@
#include <xfce4-session/xfsm-global.h>
#include <xfce4-session/xfsm-marshal.h>
#include <xfce4-session/xfsm-error.h>
+#include <xfce4-session/xfsm-client-dbus.h>
#define XFSM_CLIENT_OBJECT_PATH_PREFIX "/org/xfce/SessionClients/"
struct _XfsmClient
{
- GObject parent;
+ XfsmDbusClientSkeleton parent;
XfsmManager *manager;
@@ -53,24 +54,12 @@ struct _XfsmClient
XfsmProperties *properties;
SmsConn sms_conn;
- DBusGConnection *dbus_conn;
+ GDBusConnection *connection;
};
typedef struct _XfsmClientClass
{
- GObjectClass parent;
-
- /*< signals >*/
- void (*state_changed) (XfsmClient *client,
- XfsmClientState old_state,
- XfsmClientState new_state);
-
- void (*sm_property_changed) (XfsmClient *client,
- const gchar *name,
- const GValue *value);
-
- void (*sm_property_deleted) (XfsmClient *client,
- const gchar *name);
+ XfsmDbusClientSkeletonClass parent;
} XfsmClientClass;
typedef struct
@@ -79,13 +68,6 @@ typedef struct
gint count;
} HtToPropsData;
-enum
-{
- SIG_STATE_CHANGED = 0,
- SIG_SM_PROPERTY_CHANGED,
- SIG_SM_PROPERTY_DELETED,
- N_SIGS
-};
static void xfsm_client_finalize (GObject *obj);
@@ -94,13 +76,11 @@ static void xfsm_properties_discard_command_changed (XfsmProperties *properti
gchar **old_discard);
static void xfsm_client_dbus_class_init (XfsmClientClass *klass);
static void xfsm_client_dbus_init (XfsmClient *client);
+static void xfsm_client_iface_init (XfsmDbusClientIface *iface);
static void xfsm_client_dbus_cleanup (XfsmClient *client);
-static guint signals[N_SIGS] = { 0, };
-
-
-G_DEFINE_TYPE(XfsmClient, xfsm_client, G_TYPE_OBJECT)
+G_DEFINE_TYPE_WITH_CODE (XfsmClient, xfsm_client, XFSM_DBUS_TYPE_CLIENT_SKELETON, G_IMPLEMENT_INTERFACE (XFSM_DBUS_TYPE_CLIENT, xfsm_client_iface_init));
static void
@@ -110,36 +90,6 @@ xfsm_client_class_init (XfsmClientClass *klass)
gobject_class->finalize = xfsm_client_finalize;
- signals[SIG_STATE_CHANGED] = g_signal_new ("state-changed",
- XFSM_TYPE_CLIENT,
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (XfsmClientClass,
- state_changed),
- NULL, NULL,
- xfsm_marshal_VOID__UINT_UINT,
- G_TYPE_NONE, 2,
- G_TYPE_UINT, G_TYPE_UINT);
-
- signals[SIG_SM_PROPERTY_CHANGED] = g_signal_new ("sm-property-changed",
- XFSM_TYPE_CLIENT,
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (XfsmClientClass,
- sm_property_changed),
- NULL, NULL,
- xfsm_marshal_VOID__STRING_BOXED,
- G_TYPE_NONE, 2,
- G_TYPE_STRING, G_TYPE_VALUE);
-
- signals[SIG_SM_PROPERTY_DELETED] = g_signal_new ("sm-property-deleted",
- XFSM_TYPE_CLIENT,
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (XfsmClientClass,
- sm_property_deleted),
- NULL, NULL,
- g_cclosure_marshal_VOID__STRING,
- G_TYPE_NONE, 1,
- G_TYPE_STRING);
-
xfsm_client_dbus_class_init (klass);
}
@@ -201,13 +151,33 @@ xfsm_client_signal_prop_change (XfsmClient *client,
const gchar *name)
{
const GValue *value;
+ GVariant *variant = NULL;
XfsmProperties *properties = client->properties;
value = xfsm_properties_get (properties, name);
if (value)
{
- g_signal_emit (client, signals[SIG_SM_PROPERTY_CHANGED], 0,
- name, value);
+ /* convert the gvalue to gvariant because gdbus requires it */
+ if (G_VALUE_HOLDS_STRING (value))
+ {
+ variant = g_dbus_gvalue_to_gvariant(value, G_VARIANT_TYPE_STRING);
+ }
+ else if (G_VALUE_HOLDS_UCHAR (value))
+ {
+ variant = g_dbus_gvalue_to_gvariant(value, G_VARIANT_TYPE ("y"));
+ }
+ else if (G_VALUE_HOLDS (value, G_TYPE_STRV))
+ {
+ variant = g_dbus_gvalue_to_gvariant(value, G_VARIANT_TYPE_STRING_ARRAY);
+ }
+ else
+ {
+ g_warning ("xfsm_client.c:xfsm_client_signal_prop_change: Value type not supported");
+ return;
+ }
+
+// xfsm_dbus_client_emit_sm_property_changed (XFSM_DBUS_CLIENT (client), name, variant);
+ g_variant_unref (variant);
}
}
@@ -215,7 +185,8 @@ xfsm_client_signal_prop_change (XfsmClient *client,
XfsmClient*
xfsm_client_new (XfsmManager *manager,
- SmsConn sms_conn)
+ SmsConn sms_conn,
+ GDBusConnection *connection)
{
XfsmClient *client;
@@ -225,6 +196,7 @@ xfsm_client_new (XfsmManager *manager,
client->manager = manager;
client->sms_conn = sms_conn;
+ client->connection = g_object_ref (connection);
client->state = XFSM_CLIENT_IDLE;
return client;
@@ -273,7 +245,7 @@ xfsm_client_set_state (XfsmClient *client,
{
XfsmClientState old_state = client->state;
client->state = state;
- g_signal_emit (client, signals[SIG_STATE_CHANGED], 0, old_state, state);
+ xfsm_dbus_client_emit_state_changed (XFSM_DBUS_CLIENT (client), old_state, state);
}
}
@@ -373,8 +345,7 @@ xfsm_client_delete_properties (XfsmClient *client,
{
if (xfsm_properties_remove (properties, prop_names[n]))
{
- g_signal_emit (client, signals[SIG_SM_PROPERTY_DELETED], 0,
- prop_names[n]);
+ xfsm_dbus_client_emit_sm_property_deleted (XFSM_DBUS_CLIENT (client), prop_names[n]);
}
}
}
@@ -393,27 +364,23 @@ xfsm_client_get_object_path (XfsmClient *client)
* dbus server impl
*/
-static gboolean xfsm_client_dbus_get_id (XfsmClient *client,
- gchar **OUT_id,
- GError **error);
-static gboolean xfsm_client_dbus_get_state (XfsmClient *client,
- guint *OUT_state,
- GError **error);
-static gboolean xfsm_client_dbus_get_all_sm_properties (XfsmClient *client,
- GHashTable **OUT_properties,
- GError **error);
-static gboolean xfsm_client_dbus_get_sm_properties (XfsmClient *client,
- gchar **names,
- GHashTable **OUT_values,
- GError **error);
-static gboolean xfsm_client_dbus_set_sm_properties (XfsmClient *client,
- GHashTable *properties,
- GError **error);
-static gboolean xfsm_client_dbus_delete_sm_properties (XfsmClient *client,
- gchar **names,
- GError **error);
-static gboolean xfsm_client_dbus_terminate (XfsmClient *client,
- GError **error);
+static gboolean xfsm_client_dbus_get_id (XfsmDbusClient *object,
+ GDBusMethodInvocation *invocation);
+static gboolean xfsm_client_dbus_get_state (XfsmDbusClient *object,
+ GDBusMethodInvocation *invocation);
+static gboolean xfsm_client_dbus_get_all_sm_properties (XfsmDbusClient *object,
+ GDBusMethodInvocation *invocation);
+static gboolean xfsm_client_dbus_get_sm_properties (XfsmDbusClient *object,
+ GDBusMethodInvocation *invocation,
+ const gchar *const *arg_names);
+static gboolean xfsm_client_dbus_set_sm_properties (XfsmDbusClient *object,
+ GDBusMethodInvocation *invocation,
+ GVariant *arg_properties);
+static gboolean xfsm_client_dbus_delete_sm_properties (XfsmDbusClient *object,
+ GDBusMethodInvocation *invocation,
+ const gchar *const *arg_names);
+static gboolean xfsm_client_dbus_terminate (XfsmDbusClient *object,
+ GDBusMethodInvocation *invocation);
/* header needs the above fwd decls */
@@ -423,8 +390,6 @@ static gboolean xfsm_client_dbus_terminate (XfsmClient *client,
static void
xfsm_client_dbus_class_init (XfsmClientClass *klass)
{
- dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (klass),
- &dbus_glib_xfsm_client_object_info);
}
@@ -433,169 +398,236 @@ xfsm_client_dbus_init (XfsmClient *client)
{
GError *error = NULL;
- client->dbus_conn = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
-
- if (G_UNLIKELY(!client->dbus_conn))
+ if (G_UNLIKELY(!client->connection))
{
g_critical ("Unable to contact D-Bus session bus: %s", error ? error->message : "Unknown error");
if (error)
- g_error_free (error);
+ g_clear_error (&error);
return;
}
- dbus_g_connection_register_g_object (client->dbus_conn, client->object_path,
- G_OBJECT (client));
+ g_debug ("exporting path %s", client->object_path);
+
+ if (!g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (XFSM_DBUS_CLIENT (client)),
+ client->connection,
+ client->object_path,
+ &error)) {
+ if (error != NULL) {
+ g_critical ("error exporting interface: %s", error->message);
+ g_clear_error (&error);
+ return;
+ }
+ }
+
+ g_debug ("exported on %s", g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (XFSM_DBUS_CLIENT (client))));
}
+static void
+xfsm_client_iface_init (XfsmDbusClientIface *iface)
+{
+ iface->handle_delete_sm_properties = xfsm_client_dbus_delete_sm_properties;
+ iface->handle_get_all_sm_properties = xfsm_client_dbus_get_all_sm_properties;
+ iface->handle_get_id = xfsm_client_dbus_get_id;
+ iface->handle_get_sm_properties = xfsm_client_dbus_get_sm_properties;
+ iface->handle_get_state = xfsm_client_dbus_get_state;
+ iface->handle_set_sm_properties = xfsm_client_dbus_set_sm_properties;
+ iface->handle_terminate = xfsm_client_dbus_terminate;
+}
static void
xfsm_client_dbus_cleanup (XfsmClient *client)
{
- if (G_LIKELY (client->dbus_conn))
+ if (G_LIKELY (client->connection))
{
- dbus_g_connection_unref (client->dbus_conn);
- client->dbus_conn = NULL;
+ g_object_unref (client->connection);
+ client->connection = NULL;
}
}
static gboolean
-xfsm_client_dbus_get_id (XfsmClient *client,
- gchar **OUT_id,
- GError **error)
+xfsm_client_dbus_get_id (XfsmDbusClient *object,
+ GDBusMethodInvocation *invocation)
{
- *OUT_id = g_strdup (client->id);
+ xfsm_dbus_client_complete_get_id (object, invocation, XFSM_CLIENT(object)->id);
return TRUE;
}
static gboolean
-xfsm_client_dbus_get_state (XfsmClient *client,
- guint *OUT_state,
- GError **error)
+xfsm_client_dbus_get_state (XfsmDbusClient *object,
+ GDBusMethodInvocation *invocation)
{
- *OUT_state = client->state;
+ xfsm_dbus_client_complete_get_state (object, invocation, XFSM_CLIENT(object)->state);
return TRUE;
}
+static void
+builder_add_value (GVariantBuilder *builder,
+ const gchar *name,
+ const GValue *value)
+{
+ if (name == NULL)
+ {
+ g_warning ("xfsm_client.c:builder_add_value: name must not be NULL");
+ return;
+ }
+
+ if (G_VALUE_HOLDS_STRING (value))
+ {
+ g_variant_builder_add (builder, "{sv}", name, g_dbus_gvalue_to_gvariant(value, G_VARIANT_TYPE_STRING));
+ }
+ else if (G_VALUE_HOLDS_UCHAR (value))
+ {
+ g_variant_builder_add (builder, "{sv}", name, g_dbus_gvalue_to_gvariant(value, G_VARIANT_TYPE ("y")));
+ }
+ else if (G_VALUE_HOLDS (value, G_TYPE_STRV))
+ {
+ g_variant_builder_add (builder, "{sv}", name, g_dbus_gvalue_to_gvariant(value, G_VARIANT_TYPE_STRING_ARRAY));
+ }
+ else
+ {
+ g_warning ("xfsm_client.c:builder_add_value: Value type not supported");
+ }
+}
+
+
static gboolean
xfsm_client_properties_tree_foreach (gpointer key,
gpointer value,
gpointer data)
{
- gchar *prop_name = key;
- GValue *prop_value = value;
- GHashTable *hash_table = data;
-
- g_hash_table_insert (hash_table, prop_name, prop_value);
+ gchar *prop_name = key;
+ GValue *prop_value = value;
+ GVariantBuilder *out_properties = data;
+ builder_add_value (out_properties, prop_name, prop_value);
return FALSE;
}
static gboolean
-xfsm_client_dbus_get_all_sm_properties (XfsmClient *client,
- GHashTable **OUT_properties,
- GError **error)
+xfsm_client_dbus_get_all_sm_properties (XfsmDbusClient *object,
+ GDBusMethodInvocation *invocation)
{
- XfsmProperties *properties = client->properties;
+ XfsmProperties *properties = XFSM_CLIENT(object)->properties;
+ GVariantBuilder out_properties;
if (G_UNLIKELY (properties == NULL))
{
- g_set_error (error, XFSM_ERROR, XFSM_ERROR_BAD_VALUE,
- _("The client doesn't have any properties set yet"));
- return FALSE;
+ throw_error (invocation, XFSM_ERROR_BAD_VALUE, "The client doesn't have any properties set yet");
+ return TRUE;
}
- *OUT_properties = g_hash_table_new_full (g_str_hash, g_str_equal,
- NULL, NULL);
+ g_variant_builder_init (&out_properties, G_VARIANT_TYPE ("a{sv}"));
+
g_tree_foreach (properties->sm_properties,
xfsm_client_properties_tree_foreach,
- *OUT_properties);
+ &out_properties);
+ xfsm_dbus_client_complete_get_all_sm_properties (object, invocation, g_variant_builder_end (&out_properties));
return TRUE;
}
static gboolean
-xfsm_client_dbus_get_sm_properties (XfsmClient *client,
- gchar **names,
- GHashTable **OUT_properties,
- GError **error)
+xfsm_client_dbus_get_sm_properties (XfsmDbusClient *object,
+ GDBusMethodInvocation *invocation,
+ const gchar *const *arg_names)
{
- XfsmProperties *properties = client->properties;
+ XfsmProperties *properties = XFSM_CLIENT(object)->properties;
+ GVariantBuilder out_properties;
gint i;
if (G_UNLIKELY (properties == NULL))
{
- g_set_error (error, XFSM_ERROR, XFSM_ERROR_BAD_VALUE,
- _("The client doesn't have any properties set yet"));
- return FALSE;
+ throw_error (invocation, XFSM_ERROR_BAD_VALUE, "The client doesn't have any properties set yet");
+ return TRUE;
}
- *OUT_properties = g_hash_table_new_full (g_str_hash, g_str_equal,
- NULL, NULL);
+ g_variant_builder_init (&out_properties, G_VARIANT_TYPE ("a{sv}"));
- for (i = 0; names[i]; ++i)
+ for (i = 0; arg_names[i]; ++i)
{
- GValue *value = g_tree_lookup (properties->sm_properties, names[i]);
- if (G_LIKELY (value))
- g_hash_table_insert (*OUT_properties, names[i], value);
+ GValue *value = g_tree_lookup (properties->sm_properties, arg_names[i]);
+
+ builder_add_value (&out_properties, arg_names[i], value);
}
+ xfsm_dbus_client_complete_get_all_sm_properties (object, invocation, g_variant_builder_end (&out_properties));
return TRUE;
}
-static void
-xfsm_client_dbus_merge_properties_ht (gpointer key,
- gpointer value,
- gpointer user_data)
+static gboolean
+xfsm_client_dbus_set_sm_properties (XfsmDbusClient *object,
+ GDBusMethodInvocation *invocation,
+ GVariant *arg_properties)
{
- gchar *prop_name = key;
- GValue *prop_value = value;
- XfsmProperties *properties = user_data;
+ XfsmProperties *properties = XFSM_CLIENT(object)->properties;
+ GVariantIter *iter;
+ gchar *prop_name;
+ GVariant *variant;
- xfsm_properties_set (properties, prop_name, prop_value);
-}
+ if (G_UNLIKELY (properties == NULL))
+ {
+ throw_error (invocation, XFSM_ERROR_BAD_VALUE, "The client doesn't have any properties set yet");
+ return TRUE;
+ }
+ g_variant_get (arg_properties, "a(sv)", &iter);
-static gboolean
-xfsm_client_dbus_set_sm_properties (XfsmClient *client,
- GHashTable *properties,
- GError **error)
-{
- if (G_UNLIKELY (client->properties == NULL))
+ while (g_variant_iter_next (iter, "(sv)", &prop_name, &variant))
{
- g_set_error (error, XFSM_ERROR, XFSM_ERROR_BAD_VALUE,
- _("The client doesn't have any properties set yet"));
- return FALSE;
- }
+ GValue value;
- g_hash_table_foreach (properties, xfsm_client_dbus_merge_properties_ht,
- client->properties);
+ g_dbus_gvariant_to_gvalue (variant, &value);
+ xfsm_properties_set (properties, prop_name, &value);
+ g_variant_unref (variant);
+ }
+
+ g_variant_iter_free (iter);
+ xfsm_dbus_client_complete_set_sm_properties (object, invocation);
return TRUE;
}
static gboolean
-xfsm_client_dbus_delete_sm_properties (XfsmClient *client,
- gchar **names,
- GError **error)
+xfsm_client_dbus_delete_sm_properties (XfsmDbusClient *object,
+ GDBusMethodInvocation *invocation,
+ const gchar *const *arg_names)
{
- if (G_UNLIKELY (client->properties == NULL))
- return TRUE;
+ XfsmProperties *properties = XFSM_CLIENT(object)->properties;
+ gchar **names = g_strdupv((gchar**)arg_names);
+
+ if (G_UNLIKELY (properties == NULL))
+ {
+ throw_error (invocation, XFSM_ERROR_BAD_VALUE, "The client doesn't have any properties set yet");
+ return TRUE;
+ }
- xfsm_client_delete_properties (client, names, g_strv_length (names));
+ xfsm_client_delete_properties (XFSM_CLIENT(object), names, g_strv_length (names));
+ g_strfreev (names);
+ xfsm_dbus_client_complete_delete_sm_properties (object, invocation);
return TRUE;
}
static gboolean
-xfsm_client_dbus_terminate (XfsmClient *client,
- GError **error)
+xfsm_client_dbus_terminate (XfsmDbusClient *object,
+ GDBusMethodInvocation *invocation)
{
- return xfsm_manager_terminate_client (client->manager, client, error);
+ GError *error = NULL;
+
+ xfsm_manager_terminate_client (XFSM_CLIENT(object)->manager, XFSM_CLIENT(object), &error);
+ if (error != NULL)
+ {
+ throw_error (invocation, XFSM_ERROR_BAD_STATE, "Unable to terminate client, error was: %s", error->message);
+ g_clear_error (&error);
+ return TRUE;
+ }
+
+ return TRUE;
}
diff --git a/xfce4-session/xfsm-client.h b/xfce4-session/xfsm-client.h
index 50aa541..61923e4 100644
--- a/xfce4-session/xfsm-client.h
+++ b/xfce4-session/xfsm-client.h
@@ -23,6 +23,7 @@
#define __XFSM_CLIENT_H__
#include <glib-object.h>
+#include <gio/gio.h>
#include <xfce4-session/xfsm-properties.h>
@@ -52,7 +53,8 @@ typedef enum
GType xfsm_client_get_type (void) G_GNUC_CONST;
XfsmClient *xfsm_client_new (struct _XfsmManager *manager,
- SmsConn sms_conn);
+ SmsConn sms_conn,
+ GDBusConnection *connection);
void xfsm_client_set_initial_properties (XfsmClient *client,
XfsmProperties *properties);
diff --git a/xfce4-session/xfsm-error.c b/xfce4-session/xfsm-error.c
index f4d9c69..2b7f6c0 100644
--- a/xfce4-session/xfsm-error.c
+++ b/xfce4-session/xfsm-error.c
@@ -24,19 +24,28 @@
#include <xfce4-session/xfsm-error.h>
+#define XFSM_DBUS_NAME "org.xfce.SessionManager"
+
+static const GDBusErrorEntry xfsm_error_entries[] =
+{
+ { XFSM_ERROR_BAD_STATE, XFSM_DBUS_NAME ".Error.Failed" },
+ { XFSM_ERROR_BAD_VALUE, XFSM_DBUS_NAME ".Error.General" },
+ { XFSM_ERROR_UNSUPPORTED, XFSM_DBUS_NAME ".Error.Unsupported" },
+};
GQuark
xfsm_error_get_quark (void)
{
- static GQuark xfsm_error_quark = 0;
+ static volatile gsize quark_volatile = 0;
- if (G_UNLIKELY (xfsm_error_quark == 0))
- xfsm_error_quark = g_quark_from_static_string ("xfsm-error-quark");
+ g_dbus_error_register_error_domain ("xfsm_error",
+ &quark_volatile,
+ xfsm_error_entries,
+ G_N_ELEMENTS (xfsm_error_entries));
- return xfsm_error_quark;
+ return (GQuark) quark_volatile;
}
-
GType
xfsm_error_get_type (void)
{
@@ -58,8 +67,19 @@ xfsm_error_get_type (void)
}
void
-xfsm_error_dbus_init (void)
+throw_error (GDBusMethodInvocation *context,
+ gint error_code,
+ const gchar *format,
+ ...)
{
- dbus_g_error_domain_register (XFSM_ERROR, "org.xfce.Session.Manager",
- XFSM_TYPE_ERROR);
+ va_list args;
+ gchar *message;
+
+ va_start (args, format);
+ message = g_strdup_vprintf (format, args);
+ va_end (args);
+
+ g_dbus_method_invocation_return_error (context, XFSM_ERROR, error_code, "%s", message);
+
+ g_free (message);
}
diff --git a/xfce4-session/xfsm-error.h b/xfce4-session/xfsm-error.h
index 22ff710..9b15b81 100644
--- a/xfce4-session/xfsm-error.h
+++ b/xfce4-session/xfsm-error.h
@@ -19,6 +19,7 @@
#define __XFSM_ERRORS_H__
#include <glib-object.h>
+#include <gio/gio.h>
#define XFSM_TYPE_ERROR (xfsm_error_get_type ())
#define XFSM_ERROR (xfsm_error_get_quark ())
@@ -37,7 +38,10 @@ typedef enum
GType xfsm_error_get_type (void) G_GNUC_CONST;
GQuark xfsm_error_get_quark (void) G_GNUC_CONST;
-void xfsm_error_dbus_init (void);
+void throw_error (GDBusMethodInvocation *context,
+ gint error_code,
+ const gchar *format,
+ ...);
G_END_DECLS
diff --git a/xfce4-session/xfsm-manager.c b/xfce4-session/xfsm-manager.c
index 14f6635..e559b97 100644
--- a/xfce4-session/xfsm-manager.c
+++ b/xfce4-session/xfsm-manager.c
@@ -61,7 +61,7 @@
# endif /* __NR_ioprio_set */
#endif /* HAVE_ASM_UNISTD_H */
-#include <dbus/dbus-glib-lowlevel.h>
+#include <gio/gio.h>
#include <X11/ICE/ICElib.h>
#include <X11/SM/SMlib.h>
@@ -76,6 +76,7 @@
#include <libxfsm/xfsm-splash-engine.h>
#include <libxfsm/xfsm-util.h>
+#include <xfce4-session/xfsm-manager-dbus.h>
#include <xfce4-session/xfsm-manager.h>
#include <xfce4-session/xfsm-chooser-icon.h>
#include <xfce4-session/xfsm-chooser.h>
@@ -92,7 +93,7 @@
struct _XfsmManager
{
- GObject parent;
+ XfsmDbusManagerSkeleton parent;
XfsmManagerState state;
@@ -120,22 +121,12 @@ struct _XfsmManager
guint die_timeout_id;
- DBusGConnection *session_bus;
+ GDBusConnection *connection;
};
typedef struct _XfsmManagerClass
{
- GObjectClass parent;
-
- /*< signals >*/
- void (*state_changed) (XfsmManager *manager,
- XfsmManagerState old_state,
- XfsmManagerState new_state);
-
- void (*client_registered) (XfsmManager *manager,
- const gchar *client_object_path);
-
- void (*shutdown_cancelled) (XfsmManager *manager);
+ XfsmDbusManagerSkeletonClass parent;
} XfsmManagerClass;
typedef struct
@@ -152,14 +143,6 @@ typedef struct
gboolean allow_save;
} ShutdownIdleData;
-enum
-{
- SIG_STATE_CHANGED = 0,
- SIG_CLIENT_REGISTERED,
- SIG_SHUTDOWN_CANCELLED,
- N_SIGS,
-};
-
static void xfsm_manager_finalize (GObject *obj);
@@ -173,14 +156,14 @@ static void xfsm_manager_load_settings (XfsmManager *manager,
XfconfChannel *channel);
static gboolean xfsm_manager_load_session (XfsmManager *manager);
static void xfsm_manager_dbus_class_init (XfsmManagerClass *klass);
-static void xfsm_manager_dbus_init (XfsmManager *manager);
+static void xfsm_manager_dbus_init (XfsmManager *manager,
+ GDBusConnection *connection);
+static void xfsm_manager_iface_init (XfsmDbusManagerIface *iface);
static void xfsm_manager_dbus_cleanup (XfsmManager *manager);
-static guint signals[N_SIGS] = { 0, };
-
-G_DEFINE_TYPE(XfsmManager, xfsm_manager, G_TYPE_OBJECT)
+G_DEFINE_TYPE_WITH_CODE (XfsmManager, xfsm_manager, XFSM_DBUS_TYPE_MANAGER_SKELETON, G_IMPLEMENT_INTERFACE (XFSM_DBUS_TYPE_MANAGER, xfsm_manager_iface_init));
static void
@@ -190,35 +173,6 @@ xfsm_manager_class_init (XfsmManagerClass *klass)
gobject_class->finalize = xfsm_manager_finalize;
- signals[SIG_STATE_CHANGED] = g_signal_new ("state-changed",
- XFSM_TYPE_MANAGER,
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (XfsmManagerClass,
- state_changed),
- NULL, NULL,
- xfsm_marshal_VOID__UINT_UINT,
- G_TYPE_NONE, 2,
- G_TYPE_UINT, G_TYPE_UINT);
-
- signals[SIG_CLIENT_REGISTERED] = g_signal_new ("client-registered",
- XFSM_TYPE_MANAGER,
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (XfsmManagerClass,
- client_registered),
- NULL, NULL,
- g_cclosure_marshal_VOID__STRING,
- G_TYPE_NONE, 1,
- G_TYPE_STRING);
-
- signals[SIG_SHUTDOWN_CANCELLED] = g_signal_new ("shutdown-cancelled",
- XFSM_TYPE_MANAGER,
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (XfsmManagerClass,
- shutdown_cancelled),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-
xfsm_manager_dbus_class_init (klass);
}
@@ -302,16 +256,16 @@ xfsm_manager_set_state (XfsmManager *manager,
state == XFSM_MANAGER_SHUTDOWNPHASE2 ? "XFSM_MANAGER_SHUTDOWNPHASE2" :
"unknown");
- g_signal_emit (manager, signals[SIG_STATE_CHANGED], 0, old_state, state);
+ xfsm_dbus_manager_emit_state_changed (XFSM_DBUS_MANAGER (manager), old_state, state);
}
XfsmManager *
-xfsm_manager_new (void)
+xfsm_manager_new (GDBusConnection *connection)
{
- XfsmManager *manager = g_object_new (XFSM_TYPE_MANAGER, NULL);
+ XfsmManager *manager = XFSM_MANAGER (g_object_new (XFSM_TYPE_MANAGER, NULL));
- xfsm_manager_dbus_init (manager);
+ xfsm_manager_dbus_init (manager, connection);
return manager;
}
@@ -863,7 +817,7 @@ xfsm_manager_new_client (XfsmManager *manager,
return NULL;
}
- client = xfsm_client_new (manager, sms_conn);
+ client = xfsm_client_new (manager, sms_conn, manager->connection);
return client;
}
@@ -959,8 +913,7 @@ xfsm_manager_register_client (XfsmManager *manager,
SmsRegisterClientReply (sms_conn, (char *) xfsm_client_get_id (client));
- g_signal_emit (manager, signals[SIG_CLIENT_REGISTERED], 0,
- xfsm_client_get_object_path (client));
+ xfsm_dbus_manager_emit_client_registered (XFSM_DBUS_MANAGER (manager), xfsm_client_get_object_path (client));
if (previous_id == NULL)
{
@@ -1099,7 +1052,7 @@ xfsm_manager_interact_done (XfsmManager *manager,
SmsShutdownCancelled (xfsm_client_get_sms_connection (cl));
}
- g_signal_emit (manager, signals[SIG_SHUTDOWN_CANCELLED], 0);
+ xfsm_dbus_manager_emit_shutdown_cancelled (XFSM_DBUS_MANAGER (manager));
}
else
{
@@ -1829,50 +1782,37 @@ xfsm_manager_get_start_at (XfsmManager *manager)
* dbus server impl
*/
-static DBusHandlerResult xfsm_manager_watch_dbus_disconnect (DBusConnection *connection,
- DBusMessage *message,
- void *user_data);
-
-static gboolean xfsm_manager_dbus_get_info (XfsmManager *manager,
- gchar **OUT_name,
- gchar **OUT_version,
- gchar **OUT_vendor,
- GError **error);
-static gboolean xfsm_manager_dbus_list_clients (XfsmManager *manager,
- GPtrArray **OUT_clients,
- GError **error);
-static gboolean xfsm_manager_dbus_get_state (XfsmManager *manager,
- guint *OUT_state,
- GError **error);
-static gboolean xfsm_manager_dbus_checkpoint (XfsmManager *manager,
- const gchar *session_name,
- GError **error);
-static gboolean xfsm_manager_dbus_logout (XfsmManager *manager,
- gboolean show_dialog,
- gboolean allow_save,
- GError **error);
-static gboolean xfsm_manager_dbus_shutdown (XfsmManager *manager,
- gboolean allow_save,
- GError **error);
-static gboolean xfsm_manager_dbus_can_shutdown (XfsmManager *manager,
- gboolean *can_shutdown,
- GError **error);
-static gboolean xfsm_manager_dbus_restart (XfsmManager *manager,
- gboolean allow_save,
- GError **error);
-static gboolean xfsm_manager_dbus_can_restart (XfsmManager *manager,
- gboolean *can_restart,
- GError **error);
-static gboolean xfsm_manager_dbus_suspend (XfsmManager *manager,
- GError **error);
-static gboolean xfsm_manager_dbus_can_suspend (XfsmManager *manager,
- gboolean *can_suspend,
- GError **error);
-static gboolean xfsm_manager_dbus_hibernate (XfsmManager *manager,
- GError **error);
-static gboolean xfsm_manager_dbus_can_hibernate (XfsmManager *manager,
- gboolean *can_hibernate,
- GError **error);
+static gboolean xfsm_manager_dbus_get_info (XfsmDbusManager *object,
+ GDBusMethodInvocation *invocation);
+static gboolean xfsm_manager_dbus_list_clients (XfsmDbusManager *object,
+ GDBusMethodInvocation *invocation);
+static gboolean xfsm_manager_dbus_get_state (XfsmDbusManager *object,
+ GDBusMethodInvocation *invocation);
+static gboolean xfsm_manager_dbus_checkpoint (XfsmDbusManager *object,
+ GDBusMethodInvocation *invocation,
+ const gchar *arg_session_name);
+static gboolean xfsm_manager_dbus_logout (XfsmDbusManager *object,
+ GDBusMethodInvocation *invocation,
+ gboolean arg_show_dialog,
+ gboolean arg_allow_save);
+static gboolean xfsm_manager_dbus_shutdown (XfsmDbusManager *object,
+ GDBusMethodInvocation *invocation,
+ gboolean arg_allow_save);
+static gboolean xfsm_manager_dbus_can_shutdown (XfsmDbusManager *object,
+ GDBusMethodInvocation *invocation);
+static gboolean xfsm_manager_dbus_restart (XfsmDbusManager *object,
+ GDBusMethodInvocation *invocation,
+ gboolean arg_allow_save);
+static gboolean xfsm_manager_dbus_can_restart (XfsmDbusManager *object,
+ GDBusMethodInvocation *invocation);
+static gboolean xfsm_manager_dbus_suspend (XfsmDbusManager *object,
+ GDBusMethodInvocation *invocation);
+static gboolean xfsm_manager_dbus_can_suspend (XfsmDbusManager *object,
+ GDBusMethodInvocation *invocation);
+static gboolean xfsm_manager_dbus_hibernate (XfsmDbusManager *object,
+ GDBusMethodInvocation *invocation);
+static gboolean xfsm_manager_dbus_can_hibernate (XfsmDbusManager *object,
+ GDBusMethodInvocation *invocation);
/* eader needs the above fwd decls */
@@ -1882,94 +1822,86 @@ static gboolean xfsm_manager_dbus_can_hibernate (XfsmManager *manager,
static void
xfsm_manager_dbus_class_init (XfsmManagerClass *klass)
{
- dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (klass),
- &dbus_glib_xfsm_manager_object_info);
}
static void
-xfsm_manager_dbus_init (XfsmManager *manager)
+xfsm_manager_dbus_init (XfsmManager *manager, GDBusConnection *connection)
{
GError *error = NULL;
- DBusConnection *connection;
- manager->session_bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+ g_return_if_fail (XFSM_IS_MANAGER (manager));
- if (G_UNLIKELY (!manager->session_bus))
- {
- g_critical ("Unable to contact D-Bus session bus: %s", error ? error->message : "Unknown error");
- if (error)
- g_error_free (error);
- return;
- }
+ manager->connection = g_object_ref (connection);
- connection = dbus_g_connection_get_connection (manager->session_bus);
- dbus_connection_set_exit_on_disconnect (connection, FALSE);
+ g_debug ("exporting path /org/xfce/SessionManager");
- dbus_g_connection_register_g_object (manager->session_bus,
- "/org/xfce/SessionManager",
- G_OBJECT (manager));
+ if (!g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (XFSM_DBUS_MANAGER (manager)),
+ manager->connection,
+ "/org/xfce/SessionManager",
+ &error)) {
+ if (error != NULL) {
+ g_critical ("error exporting interface: %s", error->message);
+ g_clear_error (&error);
+ return;
+ }
+ }
- dbus_connection_add_filter (dbus_g_connection_get_connection (manager->session_bus),
- xfsm_manager_watch_dbus_disconnect,
- manager, NULL);
+ g_debug ("exported on %s", g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (XFSM_DBUS_MANAGER (manager))));
}
static void
-xfsm_manager_dbus_cleanup (XfsmManager *manager)
-{
- if (G_LIKELY (manager->session_bus))
- {
- dbus_connection_remove_filter (dbus_g_connection_get_connection (manager->session_bus),
- xfsm_manager_watch_dbus_disconnect,
- manager);
- dbus_g_connection_unref (manager->session_bus);
- manager->session_bus = NULL;
- }
+xfsm_manager_iface_init (XfsmDbusManagerIface *iface)
+{
+ iface->handle_can_hibernate = xfsm_manager_dbus_can_hibernate;
+ iface->handle_can_restart = xfsm_manager_dbus_can_restart;
+ iface->handle_can_shutdown = xfsm_manager_dbus_can_shutdown;
+ iface->handle_can_suspend = xfsm_manager_dbus_can_suspend;
+ iface->handle_checkpoint = xfsm_manager_dbus_checkpoint;
+ iface->handle_get_info = xfsm_manager_dbus_get_info;
+ iface->handle_get_state = xfsm_manager_dbus_get_state;
+ iface->handle_hibernate = xfsm_manager_dbus_hibernate;
+ iface->handle_list_clients = xfsm_manager_dbus_list_clients;
+ iface->handle_logout = xfsm_manager_dbus_logout;
+ iface->handle_restart = xfsm_manager_dbus_restart;
+ iface->handle_shutdown = xfsm_manager_dbus_shutdown;
+ iface->handle_suspend = xfsm_manager_dbus_suspend;
}
-
-static DBusHandlerResult
-xfsm_manager_watch_dbus_disconnect (DBusConnection *connection,
- DBusMessage *message,
- void *user_data)
+static void
+xfsm_manager_dbus_cleanup (XfsmManager *manager)
{
- if (dbus_message_is_signal (message, DBUS_INTERFACE_LOCAL, "Disconnected"))
+ if (G_LIKELY (manager->connection))
{
- g_message ("Got disconnected from D-Bus. Unless this happened during "
- "session shutdown, this is probably a bad thing.");
-
- return DBUS_HANDLER_RESULT_HANDLED;
+ g_object_unref (manager->connection);
+ manager->connection = NULL;
}
-
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
static gboolean
-xfsm_manager_dbus_get_info (XfsmManager *manager,
- gchar **OUT_name,
- gchar **OUT_version,
- gchar **OUT_vendor,
- GError **error)
+xfsm_manager_dbus_get_info (XfsmDbusManager *object,
+ GDBusMethodInvocation *invocation)
{
- *OUT_name = g_strdup (PACKAGE);
- *OUT_version = g_strdup (VERSION);
- *OUT_vendor = g_strdup ("Xfce");
-
+ xfsm_dbus_manager_complete_get_info (object, invocation, PACKAGE, VERSION, "Xfce");
return TRUE;
}
static gboolean
-xfsm_manager_dbus_list_clients (XfsmManager *manager,
- GPtrArray **OUT_clients,
- GError **error)
+xfsm_manager_dbus_list_clients (XfsmDbusManager *object,
+ GDBusMethodInvocation *invocation)
{
- GList *lp;
+ XfsmManager *manager = XFSM_MANAGER(object);
+ GList *lp;
+ gint i = 0;
+ gint num_clients;
+ gchar **clients;
- *OUT_clients = g_ptr_array_sized_new (g_queue_get_length (manager->running_clients));
+ num_clients = g_queue_get_length (manager->running_clients);
+ clients = g_new0 (gchar*, num_clients + 1);
+ clients[num_clients] = NULL;
for (lp = g_queue_peek_nth_link (manager->running_clients, 0);
lp;
@@ -1977,19 +1909,21 @@ xfsm_manager_dbus_list_clients (XfsmManager *manager,
{
XfsmClient *client = XFSM_CLIENT (lp->data);
gchar *object_path = g_strdup (xfsm_client_get_object_path (client));
- g_ptr_array_add (*OUT_clients, object_path);
+ clients[i] = object_path;
+ i++;
}
- return TRUE;
+ xfsm_dbus_manager_complete_list_clients (object, invocation, (const gchar * const*)clients);
+ g_strfreev (clients);
+ return TRUE;
}
static gboolean
-xfsm_manager_dbus_get_state (XfsmManager *manager,
- guint *OUT_state,
- GError **error)
+xfsm_manager_dbus_get_state (XfsmDbusManager *object,
+ GDBusMethodInvocation *invocation)
{
- *OUT_state = manager->state;
+ xfsm_dbus_manager_complete_get_state (object, invocation, XFSM_MANAGER(object)->state);
return TRUE;
}
@@ -2008,26 +1942,28 @@ xfsm_manager_dbus_checkpoint_idled (gpointer data)
static gboolean
-xfsm_manager_dbus_checkpoint (XfsmManager *manager,
- const gchar *session_name,
- GError **error)
+xfsm_manager_dbus_checkpoint (XfsmDbusManager *object,
+ GDBusMethodInvocation *invocation,
+ const gchar *arg_session_name)
{
+ XfsmManager *manager = XFSM_MANAGER(object);
+
if (manager->state != XFSM_MANAGER_IDLE)
{
- g_set_error (error, XFSM_ERROR, XFSM_ERROR_BAD_STATE,
- _("Session manager must be in idle state when requesting a checkpoint"));
- return FALSE;
+ throw_error (invocation, XFSM_ERROR_BAD_STATE, _("Session manager must be in idle state when requesting a checkpoint"));
+ return TRUE;
}
g_free (manager->checkpoint_session_name);
- if (session_name[0] != '\0')
- manager->checkpoint_session_name = g_strdup (session_name);
+ if (arg_session_name[0] != '\0')
+ manager->checkpoint_session_name = g_strdup (arg_session_name);
else
manager->checkpoint_session_name = NULL;
/* idle so the dbus call returns in the client */
g_idle_add (xfsm_manager_dbus_checkpoint_idled, manager);
+ xfsm_dbus_manager_complete_checkpoint (object, invocation);
return TRUE;
}
@@ -2048,15 +1984,12 @@ xfsm_manager_dbus_shutdown_idled (gpointer data)
static gboolean
xfsm_manager_save_yourself_dbus (XfsmManager *manager,
XfsmShutdownType type,
- gboolean allow_save,
- GError **error)
+ gboolean allow_save)
{
ShutdownIdleData *idata;
if (manager->state != XFSM_MANAGER_IDLE)
{
- g_set_error (error, XFSM_ERROR, XFSM_ERROR_BAD_STATE,
- _("Session manager must be in idle state when requesting a shutdown"));
return FALSE;
}
@@ -2072,115 +2005,196 @@ xfsm_manager_save_yourself_dbus (XfsmManager *manager,
static gboolean
-xfsm_manager_dbus_logout (XfsmManager *manager,
- gboolean show_dialog,
- gboolean allow_save,
- GError **error)
+xfsm_manager_dbus_logout (XfsmDbusManager *object,
+ GDBusMethodInvocation *invocation,
+ gboolean arg_show_dialog,
+ gboolean arg_allow_save)
{
XfsmShutdownType type;
- g_return_val_if_fail (XFSM_IS_MANAGER (manager), FALSE);
+ g_return_val_if_fail (XFSM_IS_MANAGER (object), FALSE);
- type = show_dialog ? XFSM_SHUTDOWN_ASK : XFSM_SHUTDOWN_LOGOUT;
- return xfsm_manager_save_yourself_dbus (manager, type,
- allow_save, error);
+ type = arg_show_dialog ? XFSM_SHUTDOWN_ASK : XFSM_SHUTDOWN_LOGOUT;
+ if (xfsm_manager_save_yourself_dbus (XFSM_MANAGER (object), type, arg_allow_save) == FALSE)
+ {
+ throw_error (invocation, XFSM_ERROR_BAD_STATE,
+ _("Session manager must be in idle state when requesting a shutdown"));
+ return TRUE;
+ }
+
+ xfsm_dbus_manager_complete_logout (object, invocation);
+ return TRUE;
}
static gboolean
-xfsm_manager_dbus_shutdown (XfsmManager *manager,
- gboolean allow_save,
- GError **error)
+xfsm_manager_dbus_shutdown (XfsmDbusManager *object,
+ GDBusMethodInvocation *invocation,
+ gboolean arg_allow_save)
{
- g_return_val_if_fail (XFSM_IS_MANAGER (manager), FALSE);
- return xfsm_manager_save_yourself_dbus (manager, XFSM_SHUTDOWN_SHUTDOWN,
- allow_save, error);
+ g_return_val_if_fail (XFSM_IS_MANAGER (object), FALSE);
+ if (xfsm_manager_save_yourself_dbus (XFSM_MANAGER (object), XFSM_SHUTDOWN_SHUTDOWN, arg_allow_save) == FALSE)
+ {
+ throw_error (invocation, XFSM_ERROR_BAD_STATE,
+ _("Session manager must be in idle state when requesting a shutdown"));
+ return TRUE;
+ }
+
+ xfsm_dbus_manager_complete_shutdown (object, invocation);
+ return TRUE;
}
static gboolean
-xfsm_manager_dbus_can_shutdown (XfsmManager *manager,
- gboolean *can_shutdown,
- GError **error)
+xfsm_manager_dbus_can_shutdown (XfsmDbusManager *object,
+ GDBusMethodInvocation *invocation)
{
- g_return_val_if_fail (XFSM_IS_MANAGER (manager), FALSE);
- return xfsm_shutdown_can_shutdown (manager->shutdown_helper,
- can_shutdown, error);
+ gboolean can_shutdown = FALSE;
+ GError *error = NULL;
+
+ g_return_val_if_fail (XFSM_IS_MANAGER (object), FALSE);
+
+ xfsm_shutdown_can_shutdown (XFSM_MANAGER (object)->shutdown_helper, &can_shutdown, &error);
+
+ if (error)
+ {
+ throw_error (invocation, XFSM_ERROR_BAD_STATE, error->message);
+ g_clear_error(&error);
+ return TRUE;
+ }
+
+ xfsm_dbus_manager_complete_can_shutdown (object, invocation, can_shutdown);
+ return TRUE;
}
static gboolean
-xfsm_manager_dbus_restart (XfsmManager *manager,
- gboolean allow_save,
- GError **error)
+xfsm_manager_dbus_restart (XfsmDbusManager *object,
+ GDBusMethodInvocation *invocation,
+ gboolean arg_allow_save)
{
- g_return_val_if_fail (XFSM_IS_MANAGER (manager), FALSE);
- return xfsm_manager_save_yourself_dbus (manager, XFSM_SHUTDOWN_RESTART,
- allow_save, error);
+ g_return_val_if_fail (XFSM_IS_MANAGER (object), FALSE);
+ if (xfsm_manager_save_yourself_dbus (XFSM_MANAGER (object), XFSM_SHUTDOWN_RESTART, arg_allow_save) == FALSE)
+ {
+ throw_error (invocation, XFSM_ERROR_BAD_STATE,
+ _("Session manager must be in idle state when requesting a restart"));
+ return TRUE;
+ }
+
+ xfsm_dbus_manager_complete_restart (object, invocation);
+ return TRUE;
}
static gboolean
-xfsm_manager_dbus_can_restart (XfsmManager *manager,
- gboolean *can_restart,
- GError **error)
+xfsm_manager_dbus_can_restart (XfsmDbusManager *object,
+ GDBusMethodInvocation *invocation)
{
- g_return_val_if_fail (XFSM_IS_MANAGER (manager), FALSE);
- return xfsm_shutdown_can_restart (manager->shutdown_helper,
- can_restart, error);
+ gboolean can_restart = FALSE;
+ GError *error = NULL;
+
+ g_return_val_if_fail (XFSM_IS_MANAGER (object), FALSE);
+
+ xfsm_shutdown_can_restart (XFSM_MANAGER (object)->shutdown_helper, &can_restart, &error);
+
+ if (error)
+ {
+ throw_error (invocation, XFSM_ERROR_BAD_STATE, error->message);
+ g_clear_error(&error);
+ return TRUE;
+ }
+
+ xfsm_dbus_manager_complete_can_restart (object, invocation, can_restart);
+ return TRUE;
}
static gboolean
-xfsm_manager_dbus_suspend (XfsmManager *manager,
- GError **error)
+xfsm_manager_dbus_suspend (XfsmDbusManager *object,
+ GDBusMethodInvocation *invocation)
{
- g_return_val_if_fail (XFSM_IS_MANAGER (manager), FALSE);
- return xfsm_shutdown_try_suspend (manager->shutdown_helper, error);
+ GError *error = NULL;
+
+ g_return_val_if_fail (XFSM_IS_MANAGER (object), FALSE);
+ if (xfsm_shutdown_try_suspend (XFSM_MANAGER (object)->shutdown_helper, &error) == FALSE)
+ {
+ throw_error (invocation, XFSM_ERROR_BAD_STATE, error->message);
+ g_clear_error (&error);
+ return TRUE;
+ }
+
+ xfsm_dbus_manager_complete_suspend (object, invocation);
+ return TRUE;
}
static gboolean
-xfsm_manager_dbus_can_suspend (XfsmManager *manager,
- gboolean *can_suspend,
- GError **error)
+xfsm_manager_dbus_can_suspend (XfsmDbusManager *object,
+ GDBusMethodInvocation *invocation)
{
- gboolean retval;
- gboolean auth_suspend;
+ gboolean auth_suspend = FALSE;
+ gboolean can_suspend = FALSE;
+ GError *error = NULL;
+
+ g_return_val_if_fail (XFSM_IS_MANAGER (object), FALSE);
- g_return_val_if_fail (XFSM_IS_MANAGER (manager), FALSE);
- retval = xfsm_shutdown_can_suspend (manager->shutdown_helper,
- can_suspend, &auth_suspend, error);
+ xfsm_shutdown_can_suspend (XFSM_MANAGER (object)->shutdown_helper, &can_suspend, &auth_suspend, &error);
+
+ if (error)
+ {
+ throw_error (invocation, XFSM_ERROR_BAD_STATE, error->message);
+ g_clear_error(&error);
+ return TRUE;
+ }
if (!auth_suspend)
- *can_suspend = FALSE;
+ can_suspend = FALSE;
- return retval;
+ xfsm_dbus_manager_complete_can_suspend (object, invocation, can_suspend);
+ return TRUE;
}
static gboolean
-xfsm_manager_dbus_hibernate (XfsmManager *manager,
- GError **error)
+xfsm_manager_dbus_hibernate (XfsmDbusManager *object,
+ GDBusMethodInvocation *invocation)
{
- g_return_val_if_fail (XFSM_IS_MANAGER (manager), FALSE);
- return xfsm_shutdown_try_hibernate (manager->shutdown_helper, error);
+ GError *error = NULL;
+
+ g_return_val_if_fail (XFSM_IS_MANAGER (object), FALSE);
+ if (xfsm_shutdown_try_hibernate (XFSM_MANAGER (object)->shutdown_helper, &error) == FALSE)
+ {
+ throw_error (invocation, XFSM_ERROR_BAD_STATE, error->message);
+ g_clear_error (&error);
+ return TRUE;
+ }
+
+ xfsm_dbus_manager_complete_hibernate (object, invocation);
+ return TRUE;
}
static gboolean
-xfsm_manager_dbus_can_hibernate (XfsmManager *manager,
- gboolean *can_hibernate,
- GError **error)
+xfsm_manager_dbus_can_hibernate (XfsmDbusManager *object,
+ GDBusMethodInvocation *invocation)
{
- gboolean retval;
- gboolean auth_hibernate;
+ gboolean auth_hibernate = FALSE;
+ gboolean can_hibernate = FALSE;
+ GError *error = NULL;
- g_return_val_if_fail (XFSM_IS_MANAGER (manager), FALSE);
- retval = xfsm_shutdown_can_hibernate (manager->shutdown_helper,
- can_hibernate, &auth_hibernate, error);
+ g_return_val_if_fail (XFSM_IS_MANAGER (object), FALSE);
+
+ xfsm_shutdown_can_hibernate (XFSM_MANAGER (object)->shutdown_helper, &can_hibernate, &auth_hibernate, &error);
+
+ if (error)
+ {
+ throw_error (invocation, XFSM_ERROR_BAD_STATE, error->message);
+ g_clear_error(&error);
+ return TRUE;
+ }
if (!auth_hibernate)
- *can_hibernate = FALSE;
+ can_hibernate = FALSE;
- return retval;
+ xfsm_dbus_manager_complete_can_hibernate (object, invocation, can_hibernate);
+ return TRUE;
}
diff --git a/xfce4-session/xfsm-manager.h b/xfce4-session/xfsm-manager.h
index 521bacc..f4285da 100644
--- a/xfce4-session/xfsm-manager.h
+++ b/xfce4-session/xfsm-manager.h
@@ -71,7 +71,7 @@ typedef struct _XfsmManager XfsmManager;
GType xfsm_manager_get_type (void) G_GNUC_CONST;
-XfsmManager *xfsm_manager_new (void);
+XfsmManager *xfsm_manager_new (GDBusConnection *connection);
void xfsm_manager_load (XfsmManager *manager,
XfconfChannel *channel);
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list