[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