[gnome-session] gsm-presence: port to GDBus



commit 45299eba6686f621b6796ab1df510a7364839d9d
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Sat Oct 25 19:31:42 2014 -0700

    gsm-presence: port to GDBus
    
    https://bugzilla.gnome.org/show_bug.cgi?id=622924

 gnome-session/Makefile.am    |   29 +++--
 gnome-session/gsm-presence.c |  339 ++++++++++++++++++------------------------
 gnome-session/gsm-presence.h |   14 --
 3 files changed, 160 insertions(+), 222 deletions(-)
---
diff --git a/gnome-session/Makefile.am b/gnome-session/Makefile.am
index 425d8c4..4f6e40d 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 9ca0745..d796e0a 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 4ed0c31..8646936 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__ */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]