diff options
author | Wu Xiaotian <[email protected]> | 2020-04-28 17:06:07 +0800 |
---|---|---|
committer | Xiaotian Wu <[email protected]> | 2023-10-03 18:44:26 +0800 |
commit | 7cba004dfcd621cfa193c389a01de11526c701d9 (patch) | |
tree | e9ee8a14e11f4dafde74c6cfc267da9d89b19870 /mate-session/gsm-client.c | |
parent | aa8baa90d497a54410676190e784986e185a8745 (diff) | |
download | mate-session-manager-7cba004dfcd621cfa193c389a01de11526c701d9.tar.bz2 mate-session-manager-7cba004dfcd621cfa193c389a01de11526c701d9.tar.xz |
update
Diffstat (limited to 'mate-session/gsm-client.c')
-rw-r--r-- | mate-session/gsm-client.c | 242 |
1 files changed, 131 insertions, 111 deletions
diff --git a/mate-session/gsm-client.c b/mate-session/gsm-client.c index 8dc4005..ffe7db6 100644 --- a/mate-session/gsm-client.c +++ b/mate-session/gsm-client.c @@ -22,13 +22,11 @@ #include "config.h" -#include <dbus/dbus-glib.h> - #include "eggdesktopfile.h" #include "gsm-marshal.h" #include "gsm-client.h" -#include "gsm-client-glue.h" +#include "org.gnome.SessionManager.Client.h" static guint32 client_serial = 1; @@ -38,7 +36,8 @@ typedef struct { char *startup_id; char *app_id; guint status; - DBusGConnection *connection; + GsmExportedClient *skeleton; + GDBusConnection *connection; } GsmClientPrivate; enum { @@ -59,71 +58,155 @@ static guint signals[LAST_SIGNAL] = { 0 }; G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GsmClient, gsm_client, G_TYPE_OBJECT) +#define GSM_CLIENT_DBUS_IFACE "org.gnome.SessionManager.Client" + +static const GDBusErrorEntry gsm_client_error_entries[] = { + { GSM_CLIENT_ERROR_GENERAL, GSM_CLIENT_DBUS_IFACE ".GeneralError" }, + { GSM_CLIENT_ERROR_NOT_REGISTERED, GSM_CLIENT_DBUS_IFACE ".NotRegistered" } +}; + GQuark gsm_client_error_quark (void) { - static GQuark ret = 0; - if (ret == 0) { - ret = g_quark_from_static_string ("gsm_client_error"); + static volatile gsize quark_volatile = 0; + + g_dbus_error_register_error_domain ("gsm_client_error", + &quark_volatile, + gsm_client_error_entries, + G_N_ELEMENTS (gsm_client_error_entries)); + return quark_volatile; +} + +static guint32 +get_next_client_serial (void) +{ + guint32 serial; + + serial = client_serial++; + + if ((gint32)client_serial < 0) { + client_serial = 1; } - return ret; + return serial; } -#define ENUM_ENTRY(NAME, DESC) { NAME, "" #NAME "", DESC } +static gboolean +gsm_client_get_startup_id (GsmExportedClient *skeleton, + GDBusMethodInvocation *invocation, + GsmClient *client) +{ + GsmClientPrivate *priv; + + priv = gsm_client_get_instance_private (client); + gsm_exported_client_complete_get_startup_id (skeleton, invocation, priv->startup_id); + return TRUE; +} -GType -gsm_client_error_get_type (void) +static gboolean +gsm_client_get_app_id (GsmExportedClient *skeleton, + GDBusMethodInvocation *invocation, + GsmClient *client) { - static GType etype = 0; + GsmClientPrivate *priv; - if (etype == 0) { - static const GEnumValue values[] = { - ENUM_ENTRY (GSM_CLIENT_ERROR_GENERAL, "GeneralError"), - ENUM_ENTRY (GSM_CLIENT_ERROR_NOT_REGISTERED, "NotRegistered"), - { 0, 0, 0 } - }; + priv = gsm_client_get_instance_private (client); + gsm_exported_client_complete_get_app_id (skeleton, invocation, priv->app_id); + return TRUE; +} - g_assert (GSM_CLIENT_NUM_ERRORS == G_N_ELEMENTS (values) - 1); +static gboolean +gsm_client_get_restart_style_hint (GsmExportedClient *skeleton, + GDBusMethodInvocation *invocation, + GsmClient *client) +{ + guint hint; - etype = g_enum_register_static ("GsmClientError", values); - } + hint = GSM_CLIENT_GET_CLASS (client)->impl_get_restart_style_hint (client); + gsm_exported_client_complete_get_restart_style_hint (skeleton, invocation, hint); + return TRUE; +} + +static gboolean +gsm_client_get_status (GsmExportedClient *skeleton, + GDBusMethodInvocation *invocation, + GsmClient *client) +{ + GsmClientPrivate *priv; - return etype; + priv = gsm_client_get_instance_private (client); + gsm_exported_client_complete_get_status (skeleton, invocation, priv->status); + return TRUE; } -static guint32 -get_next_client_serial (void) +static gboolean +gsm_client_get_unix_process_id (GsmExportedClient *skeleton, + GDBusMethodInvocation *invocation, + GsmClient *client) { - guint32 serial; + guint pid; - serial = client_serial++; + pid = GSM_CLIENT_GET_CLASS (client)->impl_get_unix_process_id (client); + gsm_exported_client_complete_get_unix_process_id (skeleton, invocation, pid); + return TRUE; +} - if ((gint32)client_serial < 0) { - client_serial = 1; - } +static gboolean +gsm_client_stop_dbus (GsmExportedClient *skeleton, + GDBusMethodInvocation *invocation, + GsmClient *client) +{ + GError *error = NULL; + gsm_client_stop (client, &error); - return serial; + if (error != NULL) { + g_dbus_method_invocation_take_error (invocation, error); + } else { + gsm_exported_client_complete_stop (skeleton, invocation); + } + return TRUE; } static gboolean register_client (GsmClient *client) { - GError *error; + GError *error = NULL; + GsmExportedClient *skeleton; GsmClientPrivate *priv; - error = NULL; priv = gsm_client_get_instance_private (client); - priv->connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error); + priv->connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); if (priv->connection == NULL) { - if (error != NULL) { - g_critical ("error getting session bus: %s", error->message); - g_error_free (error); - } + g_critical ("error getting session bus: %s", error->message); + g_error_free (error); + return FALSE; + } + + skeleton = gsm_exported_client_skeleton_new (); + priv->skeleton = skeleton; + g_debug ("exporting client to object path: %s", priv->id); + g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (skeleton), + priv->connection, + priv->id, &error); + + if (error != NULL) { + g_critical ("error exporting client on session bus: %s", error->message); + g_error_free (error); return FALSE; } - dbus_g_connection_register_g_object (priv->connection, priv->id, G_OBJECT (client)); + g_signal_connect (skeleton, "handle-get-app-id", + G_CALLBACK (gsm_client_get_app_id), client); + g_signal_connect (skeleton, "handle-get-restart-style-hint", + G_CALLBACK (gsm_client_get_restart_style_hint), client); + g_signal_connect (skeleton, "handle-get-startup-id", + G_CALLBACK (gsm_client_get_startup_id), client); + g_signal_connect (skeleton, "handle-get-status", + G_CALLBACK (gsm_client_get_status), client); + g_signal_connect (skeleton, "handle-get-unix-process-id", + G_CALLBACK (gsm_client_get_unix_process_id), client); + g_signal_connect (skeleton, "handle-stop", + G_CALLBACK (gsm_client_stop_dbus), client); return TRUE; } @@ -153,7 +236,7 @@ gsm_client_constructor (GType type, } static void -gsm_client_init (GsmClient *client) +gsm_client_init (GsmClient *client G_GNUC_UNUSED) { } @@ -175,6 +258,14 @@ gsm_client_finalize (GObject *object) g_free (priv->startup_id); g_free (priv->app_id); + if (priv->skeleton != NULL) { + g_dbus_interface_skeleton_unexport_from_connection (G_DBUS_INTERFACE_SKELETON (priv->skeleton), + priv->connection); + g_clear_object (&priv->skeleton); + } + + g_clear_object (&priv->connection); + G_OBJECT_CLASS (gsm_client_parent_class)->finalize (object); } @@ -286,7 +377,7 @@ gsm_client_get_property (GObject *object, static gboolean default_stop (GsmClient *client, - GError **error) + GError **error G_GNUC_UNUSED) { g_return_val_if_fail (GSM_IS_CLIENT (client), FALSE); @@ -367,8 +458,6 @@ gsm_client_class_init (GsmClientClass *klass) G_MAXINT, GSM_CLIENT_UNREGISTERED, G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); - - dbus_g_object_type_install_info (GSM_TYPE_CLIENT, &dbus_glib_gsm_client_object_info); } const char * @@ -433,75 +522,6 @@ gsm_client_peek_restart_style_hint (GsmClient *client) return GSM_CLIENT_GET_CLASS (client)->impl_get_restart_style_hint (client); } -gboolean -gsm_client_get_startup_id (GsmClient *client, - char **id, - GError **error) -{ - GsmClientPrivate *priv; - g_return_val_if_fail (GSM_IS_CLIENT (client), FALSE); - - priv = gsm_client_get_instance_private (client); - - *id = g_strdup (priv->startup_id); - - return TRUE; -} - -gboolean -gsm_client_get_app_id (GsmClient *client, - char **id, - GError **error) -{ - GsmClientPrivate *priv; - g_return_val_if_fail (GSM_IS_CLIENT (client), FALSE); - - priv = gsm_client_get_instance_private (client); - - *id = g_strdup (priv->app_id); - - return TRUE; -} - -gboolean -gsm_client_get_restart_style_hint (GsmClient *client, - guint *hint, - GError **error) -{ - g_return_val_if_fail (GSM_IS_CLIENT (client), FALSE); - - *hint = GSM_CLIENT_GET_CLASS (client)->impl_get_restart_style_hint (client); - - return TRUE; -} - -gboolean -gsm_client_get_status (GsmClient *client, - guint *status, - GError **error) -{ - GsmClientPrivate *priv; - g_return_val_if_fail (GSM_IS_CLIENT (client), FALSE); - - priv = gsm_client_get_instance_private (client); - - *status = priv->status; - - return TRUE; -} - -gboolean -gsm_client_get_unix_process_id (GsmClient *client, - guint *pid, - GError **error) -{ - g_return_val_if_fail (GSM_IS_CLIENT (client), FALSE); - - *pid = GSM_CLIENT_GET_CLASS (client)->impl_get_unix_process_id (client); - - return TRUE; -} - /** * gsm_client_get_app_name: * @client: a #GsmClient. |