summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCosimo Cecchi <cosimoc@gnome.org>2014-10-25 19:31:42 -0700
committerRay Strode <rstrode@redhat.com>2014-12-12 10:10:18 -0500
commit45299eba6686f621b6796ab1df510a7364839d9d (patch)
treef4c924fff62bece92ed2510b24b50b283baca254
parentf91274d2274344cdf4a18a59ec2647fa5755e66f (diff)
downloadgnome-session-45299eba6686f621b6796ab1df510a7364839d9d.tar.gz
gsm-presence: port to GDBus
https://bugzilla.gnome.org/show_bug.cgi?id=622924
-rw-r--r--gnome-session/Makefile.am29
-rw-r--r--gnome-session/gsm-presence.c339
-rw-r--r--gnome-session/gsm-presence.h14
3 files changed, 160 insertions, 222 deletions
diff --git a/gnome-session/Makefile.am b/gnome-session/Makefile.am
index 425d8c4d..4f6e40d4 100644
--- a/gnome-session/Makefile.am
+++ b/gnome-session/Makefile.am
@@ -171,21 +171,28 @@ org.gnome.SessionManager.Inhibitor.h: org.gnome.SessionManager.Inhibitor.xml Mak
org.gnome.SessionManager.Inhibitor.c: org.gnome.SessionManager.Inhibitor.h
@: # generated as a side-effect
-gsm-presence-glue.h: org.gnome.SessionManager.Presence.xml Makefile.am
- $(AM_V_GEN)dbus-binding-tool --prefix=gsm_presence --mode=glib-server --output=gsm-presence-glue.h $(srcdir)/org.gnome.SessionManager.Presence.xml
-
-BUILT_SOURCES = \
- org.gnome.SessionManager.App.h \
- org.gnome.SessionManager.App.c \
- org.gnome.SessionManager.Client.h \
- org.gnome.SessionManager.Client.c \
+org.gnome.SessionManager.Presence.h: org.gnome.SessionManager.Presence.xml Makefile.am
+ $(AM_V_GEN) gdbus-codegen --interface-prefix org.gnome.SessionManager.Presence. \
+ --generate-c-code org.gnome.SessionManager.Presence \
+ --c-namespace Gsm \
+ --annotate "org.gnome.SessionManager.Presence" "org.gtk.GDBus.C.Name" ExportedPresence \
+ $(srcdir)/org.gnome.SessionManager.Presence.xml
+org.gnome.SessionManager.Presence.c: org.gnome.SessionManager.Presence.h
+ @: # generated as a side-effect
+
+BUILT_SOURCES = \
+ org.gnome.SessionManager.App.h \
+ org.gnome.SessionManager.App.c \
+ org.gnome.SessionManager.Client.h \
+ org.gnome.SessionManager.Client.c \
org.gnome.SessionManager.ClientPrivate.h \
org.gnome.SessionManager.ClientPrivate.c \
org.gnome.SessionManager.Inhibitor.h \
org.gnome.SessionManager.Inhibitor.c \
- org.gnome.SessionManager.h \
- org.gnome.SessionManager.c \
- gsm-presence-glue.h
+ org.gnome.SessionManager.h \
+ org.gnome.SessionManager.c \
+ org.gnome.SessionManager.Presence.h \
+ org.gnome.SessionManager.Presence.c
EXTRA_DIST = \
README \
diff --git a/gnome-session/gsm-presence.c b/gnome-session/gsm-presence.c
index 9ca07451..d796e0a4 100644
--- a/gnome-session/gsm-presence.c
+++ b/gnome-session/gsm-presence.c
@@ -24,14 +24,13 @@
#include <time.h>
#include <unistd.h>
-#include <dbus/dbus-glib.h>
-
#define GNOME_DESKTOP_USE_UNSTABLE_API
#include <libgnome-desktop/gnome-idle-monitor.h>
#include "gsm-presence.h"
-#include "gsm-presence-glue.h"
+#include "org.gnome.SessionManager.Presence.h"
+#define GSM_PRESENCE_DBUS_IFACE "org.gnome.SessionManager.Presence"
#define GSM_PRESENCE_DBUS_PATH "/org/gnome/SessionManager/Presence"
#define GS_NAME "org.gnome.ScreenSaver"
@@ -52,66 +51,89 @@ struct GsmPresencePrivate
guint idle_watch_id;
guint idle_timeout;
gboolean screensaver_active;
- DBusGConnection *bus_connection;
- DBusGProxy *bus_proxy;
- DBusGProxy *screensaver_proxy;
+ GDBusConnection *connection;
+ GDBusProxy *screensaver_proxy;
+
+ GsmExportedPresence *skeleton;
};
enum {
PROP_0,
- PROP_STATUS,
- PROP_STATUS_TEXT,
PROP_IDLE_ENABLED,
PROP_IDLE_TIMEOUT,
};
-
enum {
STATUS_CHANGED,
- STATUS_TEXT_CHANGED,
LAST_SIGNAL
};
-static guint signals [LAST_SIGNAL] = { 0 };
+static guint signals[LAST_SIGNAL] = { 0, };
G_DEFINE_TYPE (GsmPresence, gsm_presence, G_TYPE_OBJECT)
+static const GDBusErrorEntry gsm_presence_error_entries[] = {
+ { GSM_PRESENCE_ERROR_GENERAL, GSM_PRESENCE_DBUS_IFACE ".GeneralError" }
+};
+
GQuark
gsm_presence_error_quark (void)
{
- static GQuark ret = 0;
- if (ret == 0) {
- ret = g_quark_from_static_string ("gsm_presence_error");
- }
+ static volatile gsize quark_volatile = 0;
- return ret;
+ g_dbus_error_register_error_domain ("gsm_presence_error",
+ &quark_volatile,
+ gsm_presence_error_entries,
+ G_N_ELEMENTS (gsm_presence_error_entries));
+ return quark_volatile;
}
-#define ENUM_ENTRY(NAME, DESC) { NAME, "" #NAME "", DESC }
+static void idle_became_active_cb (GnomeIdleMonitor *idle_monitor,
+ guint id,
+ gpointer user_data);
+
+static void
+gsm_presence_set_status (GsmPresence *presence,
+ guint status)
+{
+ if (status != presence->priv->status) {
+ presence->priv->status = status;
+ gsm_exported_presence_set_status (presence->priv->skeleton, status);
+ gsm_exported_presence_emit_status_changed (presence->priv->skeleton, presence->priv->status);
+ g_signal_emit (presence, signals[STATUS_CHANGED], 0, presence->priv->status);
+ }
+}
-GType
-gsm_presence_error_get_type (void)
+static gboolean
+gsm_presence_set_status_text (GsmPresence *presence,
+ const char *status_text,
+ GError **error)
{
- static GType etype = 0;
+ g_return_val_if_fail (GSM_IS_PRESENCE (presence), FALSE);
- if (etype == 0) {
- static const GEnumValue values[] = {
- ENUM_ENTRY (GSM_PRESENCE_ERROR_GENERAL, "GeneralError"),
- { 0, 0, 0 }
- };
+ g_free (presence->priv->status_text);
+ presence->priv->status_text = NULL;
- g_assert (GSM_PRESENCE_NUM_ERRORS == G_N_ELEMENTS (values) - 1);
+ /* check length */
+ if (status_text != NULL && strlen (status_text) > MAX_STATUS_TEXT) {
+ g_set_error (error,
+ GSM_PRESENCE_ERROR,
+ GSM_PRESENCE_ERROR_GENERAL,
+ "Status text too long");
+ return FALSE;
+ }
- etype = g_enum_register_static ("GsmPresenceError", values);
+ if (status_text != NULL) {
+ presence->priv->status_text = g_strdup (status_text);
+ } else {
+ presence->priv->status_text = g_strdup ("");
}
- return etype;
+ gsm_exported_presence_set_status_text (presence->priv->skeleton, presence->priv->status_text);
+ gsm_exported_presence_emit_status_text_changed (presence->priv->skeleton, presence->priv->status_text);
+ return TRUE;
}
-static void idle_became_active_cb (GnomeIdleMonitor *idle_monitor,
- guint id,
- gpointer user_data);
-
static void
set_session_idle (GsmPresence *presence,
gboolean is_idle)
@@ -126,7 +148,7 @@ set_session_idle (GsmPresence *presence,
/* save current status */
presence->priv->saved_status = presence->priv->status;
- gsm_presence_set_status (presence, GSM_PRESENCE_STATUS_IDLE, NULL);
+ gsm_presence_set_status (presence, GSM_PRESENCE_STATUS_IDLE);
gnome_idle_monitor_add_user_active_watch (presence->priv->idle_monitor,
idle_became_active_cb,
@@ -139,7 +161,7 @@ set_session_idle (GsmPresence *presence,
}
/* restore saved status */
- gsm_presence_set_status (presence, presence->priv->saved_status, NULL);
+ gsm_presence_set_status (presence, presence->priv->saved_status);
g_debug ("GsmPresence: setting non-idle status %d", presence->priv->saved_status);
presence->priv->saved_status = GSM_PRESENCE_STATUS_AVAILABLE;
}
@@ -192,11 +214,20 @@ reset_idle_watch (GsmPresence *presence)
}
static void
-on_screensaver_active_changed (DBusGProxy *proxy,
- gboolean is_active,
- GsmPresence *presence)
+on_screensaver_dbus_signal (GDBusProxy *proxy,
+ gchar *sender_name,
+ gchar *signal_name,
+ GVariant *parameters,
+ GsmPresence *presence)
{
- g_debug ("screensaver status changed: %d", is_active);
+ gboolean is_active;
+
+ if (g_strcmp0 (signal_name, "ActiveChanged") != 0) {
+ return;
+ }
+
+ g_variant_get (parameters, "(b)", &is_active);
+
if (presence->priv->screensaver_active != is_active) {
presence->priv->screensaver_active = is_active;
set_session_idle (presence, is_active);
@@ -204,84 +235,81 @@ on_screensaver_active_changed (DBusGProxy *proxy,
}
static void
-on_screensaver_proxy_destroy (GObject *proxy,
- GsmPresence *presence)
+on_screensaver_name_owner_changed (GDBusProxy *screensaver_proxy,
+ GParamSpec *pspec,
+ GsmPresence *presence)
{
- g_debug ("Detected that screensaver has left the bus");
+ gchar *name_owner;
+
+ name_owner = g_dbus_proxy_get_name_owner (screensaver_proxy);
+ if (name_owner == NULL) {
+ g_debug ("Detected that screensaver has left the bus");
+
+ presence->priv->screensaver_proxy = NULL;
+ presence->priv->screensaver_active = FALSE;
+ set_session_idle (presence, FALSE);
+ }
- presence->priv->screensaver_proxy = NULL;
- presence->priv->screensaver_active = FALSE;
- set_session_idle (presence, FALSE);
+ g_free (name_owner);
}
-static void
-on_bus_name_owner_changed (DBusGProxy *bus_proxy,
- const char *service_name,
- const char *old_service_name,
- const char *new_service_name,
- GsmPresence *presence)
+static gboolean
+gsm_presence_set_status_text_dbus (GsmExportedPresence *skeleton,
+ GDBusMethodInvocation *invocation,
+ gchar *status_text,
+ GsmPresence *presence)
{
- GError *error;
+ GError *error = NULL;
- if (service_name == NULL
- || strcmp (service_name, GS_NAME) != 0) {
- /* ignore */
- return;
+ if (gsm_presence_set_status_text (presence, status_text, &error)) {
+ gsm_exported_presence_complete_set_status_text (skeleton, invocation);
+ } else {
+ g_dbus_method_invocation_take_error (invocation, error);
}
- if (strlen (new_service_name) == 0
- && strlen (old_service_name) > 0) {
- /* service removed */
- /* let destroy signal handle this? */
- } else if (strlen (old_service_name) == 0
- && strlen (new_service_name) > 0) {
- /* service added */
-
- g_debug ("Detected that screensaver has appeared on the bus");
-
- error = NULL;
- presence->priv->screensaver_proxy = dbus_g_proxy_new_for_name_owner (presence->priv->bus_connection,
- GS_NAME,
- GS_PATH,
- GS_INTERFACE,
- &error);
- if (presence->priv->screensaver_proxy != NULL) {
- g_signal_connect (presence->priv->screensaver_proxy,
- "destroy",
- G_CALLBACK (on_screensaver_proxy_destroy),
- presence);
- dbus_g_proxy_add_signal (presence->priv->screensaver_proxy,
- "ActiveChanged",
- G_TYPE_BOOLEAN,
- G_TYPE_INVALID);
- dbus_g_proxy_connect_signal (presence->priv->screensaver_proxy,
- "ActiveChanged",
- G_CALLBACK (on_screensaver_active_changed),
- presence,
- NULL);
- } else {
- g_warning ("Unable to get screensaver proxy: %s", error->message);
- g_error_free (error);
- }
- }
+ return TRUE;
+}
+
+static gboolean
+gsm_presence_set_status_dbus (GsmExportedPresence *skeleton,
+ GDBusMethodInvocation *invocation,
+ guint status,
+ GsmPresence *presence)
+{
+ gsm_presence_set_status (presence, status);
+ gsm_exported_presence_complete_set_status (skeleton, invocation);
+ return TRUE;
}
static gboolean
register_presence (GsmPresence *presence)
{
GError *error;
+ GsmExportedPresence *skeleton;
error = NULL;
- presence->priv->bus_connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
- if (presence->priv->bus_connection == NULL) {
- if (error != NULL) {
- g_critical ("error getting session bus: %s", error->message);
- g_error_free (error);
- }
+ presence->priv->connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
+ if (error != NULL) {
+ g_critical ("error getting session bus: %s", error->message);
+ g_error_free (error);
return FALSE;
}
- dbus_g_connection_register_g_object (presence->priv->bus_connection, GSM_PRESENCE_DBUS_PATH, G_OBJECT (presence));
+ skeleton = gsm_exported_presence_skeleton_new ();
+ presence->priv->skeleton = skeleton;
+ g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (skeleton),
+ presence->priv->connection,
+ GSM_PRESENCE_DBUS_PATH, &error);
+ if (error != NULL) {
+ g_critical ("error registering presence object on session bus: %s", error->message);
+ g_error_free (error);
+ return FALSE;
+ }
+
+ g_signal_connect (skeleton, "handle-set-status",
+ G_CALLBACK (gsm_presence_set_status_dbus), presence);
+ g_signal_connect (skeleton, "handle-set-status-text",
+ G_CALLBACK (gsm_presence_set_status_text_dbus), presence);
return TRUE;
}
@@ -293,6 +321,7 @@ gsm_presence_constructor (GType type,
{
GsmPresence *presence;
gboolean res;
+ GError *error = NULL;
presence = GSM_PRESENCE (G_OBJECT_CLASS (gsm_presence_parent_class)->constructor (type,
n_construct_properties,
@@ -303,22 +332,22 @@ gsm_presence_constructor (GType type,
g_warning ("Unable to register presence with session bus");
}
- presence->priv->bus_proxy = dbus_g_proxy_new_for_name (presence->priv->bus_connection,
- DBUS_SERVICE_DBUS,
- DBUS_PATH_DBUS,
- DBUS_INTERFACE_DBUS);
- if (presence->priv->bus_proxy != NULL) {
- dbus_g_proxy_add_signal (presence->priv->bus_proxy,
- "NameOwnerChanged",
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_INVALID);
- dbus_g_proxy_connect_signal (presence->priv->bus_proxy,
- "NameOwnerChanged",
- G_CALLBACK (on_bus_name_owner_changed),
- presence,
- NULL);
+ presence->priv->screensaver_proxy = g_dbus_proxy_new_sync (presence->priv->connection,
+ G_DBUS_PROXY_FLAGS_NONE,
+ NULL,
+ GS_NAME,
+ GS_PATH,
+ GS_INTERFACE,
+ NULL, &error);
+ if (error != NULL) {
+ g_critical ("Unable to create a DBus proxy for GnomeScreensaver: %s",
+ error->message);
+ g_error_free (error);
+ } else {
+ g_signal_connect (presence->priv->screensaver_proxy, "notify::g-name-owner",
+ G_CALLBACK (on_screensaver_name_owner_changed), presence);
+ g_signal_connect (presence->priv->screensaver_proxy, "g-signal",
+ G_CALLBACK (on_screensaver_dbus_signal), presence);
}
return G_OBJECT (presence);
@@ -346,50 +375,6 @@ gsm_presence_set_idle_enabled (GsmPresence *presence,
}
}
-gboolean
-gsm_presence_set_status_text (GsmPresence *presence,
- const char *status_text,
- GError **error)
-{
- g_return_val_if_fail (GSM_IS_PRESENCE (presence), FALSE);
-
- g_free (presence->priv->status_text);
- presence->priv->status_text = NULL;
-
- /* check length */
- if (status_text != NULL && strlen (status_text) > MAX_STATUS_TEXT) {
- g_set_error (error,
- GSM_PRESENCE_ERROR,
- GSM_PRESENCE_ERROR_GENERAL,
- "Status text too long");
- return FALSE;
- }
-
- if (status_text != NULL) {
- presence->priv->status_text = g_strdup (status_text);
- }
-
- g_object_notify (G_OBJECT (presence), "status-text");
- g_signal_emit (presence, signals[STATUS_TEXT_CHANGED], 0,
- presence->priv->status_text ? presence->priv->status_text : "");
- return TRUE;
-}
-
-gboolean
-gsm_presence_set_status (GsmPresence *presence,
- guint status,
- GError **error)
-{
- g_return_val_if_fail (GSM_IS_PRESENCE (presence), FALSE);
-
- if (status != presence->priv->status) {
- presence->priv->status = status;
- g_object_notify (G_OBJECT (presence), "status");
- g_signal_emit (presence, signals[STATUS_CHANGED], 0, presence->priv->status);
- }
- return TRUE;
-}
-
void
gsm_presence_set_idle_timeout (GsmPresence *presence,
guint timeout)
@@ -414,12 +399,6 @@ gsm_presence_set_property (GObject *object,
self = GSM_PRESENCE (object);
switch (prop_id) {
- case PROP_STATUS:
- gsm_presence_set_status (self, g_value_get_uint (value), NULL);
- break;
- case PROP_STATUS_TEXT:
- gsm_presence_set_status_text (self, g_value_get_string (value), NULL);
- break;
case PROP_IDLE_ENABLED:
gsm_presence_set_idle_enabled (self, g_value_get_boolean (value));
break;
@@ -443,12 +422,6 @@ gsm_presence_get_property (GObject *object,
self = GSM_PRESENCE (object);
switch (prop_id) {
- case PROP_STATUS:
- g_value_set_uint (value, self->priv->status);
- break;
- case PROP_STATUS_TEXT:
- g_value_set_string (value, self->priv->status_text ? self->priv->status_text : "");
- break;
case PROP_IDLE_ENABLED:
g_value_set_boolean (value, self->priv->idle_enabled);
break;
@@ -498,34 +471,8 @@ gsm_presence_class_init (GsmPresenceClass *klass)
g_cclosure_marshal_VOID__UINT,
G_TYPE_NONE,
1, G_TYPE_UINT);
- signals [STATUS_TEXT_CHANGED] =
- g_signal_new ("status-text-changed",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GsmPresenceClass, status_text_changed),
- NULL,
- NULL,
- g_cclosure_marshal_VOID__STRING,
- G_TYPE_NONE,
- 1, G_TYPE_STRING);
g_object_class_install_property (object_class,
- PROP_STATUS,
- g_param_spec_uint ("status",
- "status",
- "status",
- 0,
- G_MAXINT,
- 0,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
- g_object_class_install_property (object_class,
- PROP_STATUS_TEXT,
- g_param_spec_string ("status-text",
- "status text",
- "status text",
- "",
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
- g_object_class_install_property (object_class,
PROP_IDLE_ENABLED,
g_param_spec_boolean ("idle-enabled",
NULL,
@@ -542,8 +489,6 @@ gsm_presence_class_init (GsmPresenceClass *klass)
120000,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
- dbus_g_object_type_install_info (GSM_TYPE_PRESENCE, &dbus_glib_gsm_presence_object_info);
- dbus_g_error_domain_register (GSM_PRESENCE_ERROR, NULL, GSM_PRESENCE_TYPE_ERROR);
g_type_class_add_private (klass, sizeof (GsmPresencePrivate));
}
diff --git a/gnome-session/gsm-presence.h b/gnome-session/gsm-presence.h
index 4ed0c311..8646936e 100644
--- a/gnome-session/gsm-presence.h
+++ b/gnome-session/gsm-presence.h
@@ -50,9 +50,6 @@ struct _GsmPresenceClass
void (* status_changed) (GsmPresence *presence,
guint status);
- void (* status_text_changed) (GsmPresence *presence,
- const char *status_text);
-
};
typedef enum
@@ -62,9 +59,6 @@ typedef enum
} GsmPresenceError;
#define GSM_PRESENCE_ERROR gsm_presence_error_quark ()
-GType gsm_presence_error_get_type (void);
-#define GSM_PRESENCE_TYPE_ERROR (gsm_presence_error_get_type ())
-
GQuark gsm_presence_error_quark (void);
GType gsm_presence_get_type (void) G_GNUC_CONST;
@@ -76,14 +70,6 @@ void gsm_presence_set_idle_enabled (GsmPresence *presence,
void gsm_presence_set_idle_timeout (GsmPresence *presence,
guint n_seconds);
-/* exported to bus */
-gboolean gsm_presence_set_status (GsmPresence *presence,
- guint status,
- GError **error);
-gboolean gsm_presence_set_status_text (GsmPresence *presence,
- const char *status_text,
- GError **error);
-
G_END_DECLS
#endif /* __GSM_PRESENCE_H__ */