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 <[email protected]> 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. _______________________________________________ Xfce4-commits mailing list [email protected] https://mail.xfce.org/mailman/listinfo/xfce4-commits
