summaryrefslogtreecommitdiff
path: root/mate-session/gsm-client.c
diff options
context:
space:
mode:
Diffstat (limited to 'mate-session/gsm-client.c')
-rw-r--r--mate-session/gsm-client.c242
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.