diff options
author | Wu Xiaotian <[email protected]> | 2020-04-28 17:06:07 +0800 |
---|---|---|
committer | Wu Xiaotian <[email protected]> | 2020-08-19 22:01:55 +0800 |
commit | 431efb1de32bac835bdc03387a2e5fc03891f6d2 (patch) | |
tree | f388c88129c6bfebc7a35d5e151285b1b4988209 /mate-session/gsm-client.c | |
parent | dbd99d0919e12fdef30cb79b1f6753f0b5f2f5c2 (diff) | |
download | mate-session-manager-431efb1de32bac835bdc03387a2e5fc03891f6d2.tar.bz2 mate-session-manager-431efb1de32bac835bdc03387a2e5fc03891f6d2.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 13c6169..e82d79f 100644 --- a/mate-session/gsm-client.c +++ b/mate-session/gsm-client.c @@ -21,13 +21,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; @@ -37,7 +35,8 @@ typedef struct { char *startup_id; char *app_id; guint status; - DBusGConnection *connection; + GsmExportedClient *skeleton; + GDBusConnection *connection; } GsmClientPrivate; enum { @@ -58,71 +57,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; } @@ -152,7 +235,7 @@ gsm_client_constructor (GType type, } static void -gsm_client_init (GsmClient *client) +gsm_client_init (GsmClient *client G_GNUC_UNUSED) { } @@ -174,6 +257,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); } @@ -285,7 +376,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); @@ -366,8 +457,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 * @@ -432,75 +521,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. |