gdm r5938 - in trunk: . daemon data



Author: mccann
Date: Thu Mar  6 02:48:30 2008
New Revision: 5938
URL: http://svn.gnome.org/viewvc/gdm?rev=5938&view=rev

Log:
2008-03-05  William Jon McCann  <jmccann redhat com>

	* daemon/Makefile.am:
	* daemon/gdm-product-slave.c: (create_new_session):
	* daemon/gdm-session-direct.c: (gdm_session_direct_init),
	(_gdm_session_direct_set_display_id),
	(gdm_session_direct_set_property),
	(gdm_session_direct_get_property), (gdm_session_direct_dispose),
	(gdm_session_direct_finalize), (register_session),
	(gdm_session_direct_constructor), (gdm_session_direct_class_init),
	(gdm_session_direct_new), (gdm_session_direct_restart),
	(gdm_session_direct_stop), (gdm_session_direct_detach):
	* daemon/gdm-session-direct.h:
	* daemon/gdm-session-direct.xml:
	* daemon/gdm-simple-slave.c: (create_new_session):
	* daemon/gdm-slave.c: (gdm_slave_constructor):
	* daemon/test-session.c: (main):
	* data/gdm.conf:
	Put the SessionDirect on the bus.  Doesn't do anything yet.



Added:
   trunk/daemon/gdm-session-direct.xml
Modified:
   trunk/ChangeLog
   trunk/daemon/Makefile.am
   trunk/daemon/gdm-product-slave.c
   trunk/daemon/gdm-session-direct.c
   trunk/daemon/gdm-session-direct.h
   trunk/daemon/gdm-simple-slave.c
   trunk/daemon/gdm-slave.c
   trunk/daemon/test-session.c
   trunk/data/gdm.conf

Modified: trunk/daemon/Makefile.am
==============================================================================
--- trunk/daemon/Makefile.am	(original)
+++ trunk/daemon/Makefile.am	Thu Mar  6 02:48:30 2008
@@ -33,6 +33,7 @@
 	gdm-factory-slave-glue.h		\
 	gdm-product-slave-glue.h		\
 	gdm-xdmcp-chooser-slave-glue.h		\
+	gdm-session-direct-glue.h		\
 	gdm-manager-glue.h			\
 	gdm-display-glue.h			\
 	gdm-xdmcp-greeter-display-glue.h	\
@@ -56,6 +57,8 @@
 	dbus-binding-tool --prefix=gdm_product_slave --mode=glib-server --output=gdm-product-slave-glue.h $(srcdir)/gdm-product-slave.xml
 gdm-xdmcp-chooser-slave-glue.h: gdm-xdmcp-chooser-slave.xml Makefile.am
 	dbus-binding-tool --prefix=gdm_xdmcp_chooser_slave --mode=glib-server --output=gdm-xdmcp-chooser-slave-glue.h $(srcdir)/gdm-xdmcp-chooser-slave.xml
+gdm-session-direct-glue.h: gdm-session-direct.xml Makefile.am
+	dbus-binding-tool --prefix=gdm_session_direct --mode=glib-server --output=gdm-session-direct-glue.h $(srcdir)/gdm-session-direct.xml
 gdm-display-glue.h: gdm-display.xml Makefile.am
 	dbus-binding-tool --prefix=gdm_display --mode=glib-server --output=gdm-display-glue.h $(srcdir)/gdm-display.xml
 gdm-xdmcp-greeter-display-glue.h: gdm-xdmcp-greeter-display.xml Makefile.am

Modified: trunk/daemon/gdm-product-slave.c
==============================================================================
--- trunk/daemon/gdm-product-slave.c	(original)
+++ trunk/daemon/gdm-product-slave.c	Thu Mar  6 02:48:30 2008
@@ -724,6 +724,7 @@
 create_new_session (GdmProductSlave *slave)
 {
         gboolean       display_is_local;
+        char          *display_id;
         char          *display_name;
         char          *display_hostname;
         char          *display_device;
@@ -732,6 +733,7 @@
         g_debug ("GdmProductSlave: Creating new session");
 
         g_object_get (slave,
+                      "display-id", &display_id,
                       "display-name", &display_name,
                       "display-hostname", &display_hostname,
                       "display-is-local", &display_is_local,
@@ -741,11 +743,13 @@
         /* FIXME: we don't yet have a display device! */
         display_device = g_strdup ("");
 
-        slave->priv->session = gdm_session_direct_new (display_name,
+        slave->priv->session = gdm_session_direct_new (display_id,
+                                                       display_name,
                                                        display_hostname,
                                                        display_device,
                                                        display_x11_authority_file,
                                                        display_is_local);
+        g_free (display_id);
         g_free (display_name);
         g_free (display_hostname);
         g_free (display_device);

Modified: trunk/daemon/gdm-session-direct.c
==============================================================================
--- trunk/daemon/gdm-session-direct.c	(original)
+++ trunk/daemon/gdm-session-direct.c	Thu Mar  6 02:48:30 2008
@@ -48,6 +48,7 @@
 #include "gdm-session-direct.h"
 #include "gdm-session.h"
 #include "gdm-session-private.h"
+#include "gdm-session-direct-glue.h"
 
 #include "gdm-session-record.h"
 #include "gdm-session-worker-job.h"
@@ -78,6 +79,8 @@
         guint32              is_running : 1;
 
         /* object lifetime scope */
+        char                *id;
+        char                *display_id;
         char                *display_name;
         char                *display_hostname;
         char                *display_device;
@@ -87,10 +90,12 @@
         DBusServer          *server;
         char                *server_address;
         GHashTable          *environment;
+        DBusGConnection     *connection;
 };
 
 enum {
         PROP_0,
+        PROP_DISPLAY_ID,
         PROP_DISPLAY_NAME,
         PROP_DISPLAY_HOSTNAME,
         PROP_DISPLAY_IS_LOCAL,
@@ -1411,6 +1416,7 @@
                                                             (GDestroyNotify) g_free);
 
         setup_server (session);
+
 }
 
 static void
@@ -2048,6 +2054,14 @@
                                  get_language_name (impl));
 }
 
+static void
+_gdm_session_direct_set_display_id (GdmSessionDirect *session,
+                                    const char       *id)
+{
+        g_free (session->priv->display_id);
+        session->priv->display_id = g_strdup (id);
+}
+
 /* At some point we may want to read these right from
  * the slave but for now I don't want the dependency */
 static void
@@ -2109,6 +2123,9 @@
         self = GDM_SESSION_DIRECT (object);
 
         switch (prop_id) {
+        case PROP_DISPLAY_ID:
+                _gdm_session_direct_set_display_id (self, g_value_get_string (value));
+                break;
         case PROP_DISPLAY_NAME:
                 _gdm_session_direct_set_display_name (self, g_value_get_string (value));
                 break;
@@ -2144,6 +2161,9 @@
         self = GDM_SESSION_DIRECT (object);
 
         switch (prop_id) {
+        case PROP_DISPLAY_ID:
+                g_value_set_string (value, self->priv->display_id);
+                break;
         case PROP_DISPLAY_NAME:
                 g_value_set_string (value, self->priv->display_name);
                 break;
@@ -2179,6 +2199,9 @@
 
         gdm_session_direct_close (GDM_SESSION (session));
 
+        g_free (session->priv->display_id);
+        session->priv->display_id = NULL;
+
         g_free (session->priv->display_name);
         session->priv->display_name = NULL;
 
@@ -2216,6 +2239,8 @@
 
         session = GDM_SESSION_DIRECT (object);
 
+        g_free (session->priv->id);
+
         g_free (session->priv->selected_user);
         g_free (session->priv->selected_session);
         g_free (session->priv->saved_session);
@@ -2228,6 +2253,58 @@
                 parent_class->finalize (object);
 }
 
+static gboolean
+register_session (GdmSessionDirect *session)
+{
+        GError *error;
+
+        error = NULL;
+        session->priv->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
+        if (session->priv->connection == NULL) {
+                if (error != NULL) {
+                        g_critical ("error getting system bus: %s", error->message);
+                        g_error_free (error);
+                }
+                exit (1);
+        }
+
+        dbus_g_connection_register_g_object (session->priv->connection, session->priv->id, G_OBJECT (session));
+
+        return TRUE;
+}
+
+static GObject *
+gdm_session_direct_constructor (GType                  type,
+                                guint                  n_construct_properties,
+                                GObjectConstructParam *construct_properties)
+{
+        GdmSessionDirect *session;
+        gboolean          res;
+        const char       *id;
+
+        session = GDM_SESSION_DIRECT (G_OBJECT_CLASS (gdm_session_direct_parent_class)->constructor (type,
+                                                                                          n_construct_properties,
+                                                                                          construct_properties));
+
+        /* Always match the session id with the master */
+        id = NULL;
+        if (g_str_has_prefix (session->priv->display_id, "/org/gnome/DisplayManager/Display")) {
+                id = session->priv->display_id + strlen ("/org/gnome/DisplayManager/Display");
+        }
+
+        g_assert (id != NULL);
+
+        session->priv->id = g_strdup_printf ("/org/gnome/DisplayManager/Session%s", id);
+        g_debug ("GdmSessionDirect: Registering %s", session->priv->id);
+
+        res = register_session (session);
+        if (! res) {
+                g_warning ("Unable to register session with system bus");
+        }
+
+        return G_OBJECT (session);
+}
+
 static void
 gdm_session_iface_init (GdmSessionIface *iface)
 {
@@ -2256,12 +2333,20 @@
 
         object_class->get_property = gdm_session_direct_get_property;
         object_class->set_property = gdm_session_direct_set_property;
+        object_class->constructor = gdm_session_direct_constructor;
         object_class->dispose = gdm_session_direct_dispose;
         object_class->finalize = gdm_session_direct_finalize;
 
         g_type_class_add_private (session_class, sizeof (GdmSessionDirectPrivate));
 
         g_object_class_install_property (object_class,
+                                         PROP_DISPLAY_ID,
+                                         g_param_spec_string ("display-id",
+                                                              "display id",
+                                                              "display id",
+                                                              NULL,
+                                                              G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+        g_object_class_install_property (object_class,
                                          PROP_DISPLAY_NAME,
                                          g_param_spec_string ("display-name",
                                                               "display name",
@@ -2306,10 +2391,12 @@
                                                               G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
 
 
+        dbus_g_object_type_install_info (GDM_TYPE_SESSION_DIRECT, &dbus_glib_gdm_session_direct_object_info);
 }
 
 GdmSessionDirect *
-gdm_session_direct_new (const char *display_name,
+gdm_session_direct_new (const char *display_id,
+                        const char *display_name,
                         const char *display_hostname,
                         const char *display_device,
                         const char *display_x11_authority_file,
@@ -2318,6 +2405,7 @@
         GdmSessionDirect *session;
 
         session = g_object_new (GDM_TYPE_SESSION_DIRECT,
+                                "display-id", display_id,
                                 "display-name", display_name,
                                 "display-hostname", display_hostname,
                                 "display-device", display_device,
@@ -2327,3 +2415,41 @@
 
         return session;
 }
+
+gboolean
+gdm_session_direct_restart (GdmSessionDirect *session,
+                            GError          **error)
+{
+        gboolean ret;
+
+        ret = TRUE;
+        g_debug ("GdmSessionDirect: Request to restart session");
+
+        return ret;
+}
+
+gboolean
+gdm_session_direct_stop (GdmSessionDirect *session,
+                         GError          **error)
+{
+        gboolean ret;
+
+        ret = TRUE;
+
+        g_debug ("GdmSessionDirect: Request to stop session");
+
+        return ret;
+}
+
+gboolean
+gdm_session_direct_detach (GdmSessionDirect *session,
+                           GError          **error)
+{
+        gboolean ret;
+
+        ret = TRUE;
+
+        g_debug ("GdmSessionDirect: Request to detach session");
+
+        return ret;
+}

Modified: trunk/daemon/gdm-session-direct.h
==============================================================================
--- trunk/daemon/gdm-session-direct.h	(original)
+++ trunk/daemon/gdm-session-direct.h	Thu Mar  6 02:48:30 2008
@@ -48,7 +48,8 @@
 
 GType              gdm_session_direct_get_type                 (void);
 
-GdmSessionDirect * gdm_session_direct_new                      (const char *display_name,
+GdmSessionDirect * gdm_session_direct_new                      (const char *display_id,
+                                                                const char *display_name,
                                                                 const char *display_hostname,
                                                                 const char *display_device,
                                                                 const char *display_x11_authority_file,
@@ -56,6 +57,14 @@
 
 char             * gdm_session_direct_get_username             (GdmSessionDirect     *session_direct);
 
+/* Exported methods */
+gboolean           gdm_session_direct_restart                  (GdmSessionDirect     *session_direct,
+                                                                GError              **error);
+gboolean           gdm_session_direct_stop                     (GdmSessionDirect     *session_direct,
+                                                                GError              **error);
+gboolean           gdm_session_direct_detach                   (GdmSessionDirect     *session_direct,
+                                                                GError              **error);
+
 G_END_DECLS
 
 #endif /* GDM_SESSION_DIRECT_H */

Added: trunk/daemon/gdm-session-direct.xml
==============================================================================
--- (empty file)
+++ trunk/daemon/gdm-session-direct.xml	Thu Mar  6 02:48:30 2008
@@ -0,0 +1,12 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd";>
+<node>
+  <interface name="org.gnome.DisplayManager.Session">
+    <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="gdm_session_direct"/>
+    <method name="Restart">
+    </method>
+    <method name="Stop">
+    </method>
+    <method name="Detach">
+    </method>
+  </interface>
+</node>

Modified: trunk/daemon/gdm-simple-slave.c
==============================================================================
--- trunk/daemon/gdm-simple-slave.c	(original)
+++ trunk/daemon/gdm-simple-slave.c	Thu Mar  6 02:48:30 2008
@@ -63,7 +63,6 @@
 
 struct GdmSimpleSlavePrivate
 {
-        char              *id;
         GPid               pid;
 
         guint              greeter_reset_id;
@@ -400,6 +399,7 @@
 create_new_session (GdmSimpleSlave *slave)
 {
         gboolean       display_is_local;
+        char          *display_id;
         char          *display_name;
         char          *display_hostname;
         char          *display_device;
@@ -408,6 +408,7 @@
         g_debug ("GdmSimpleSlave: Creating new session");
 
         g_object_get (slave,
+                      "display-id", &display_id,
                       "display-name", &display_name,
                       "display-hostname", &display_hostname,
                       "display-is-local", &display_is_local,
@@ -419,11 +420,13 @@
                 display_device = gdm_server_get_display_device (slave->priv->server);
         }
 
-        slave->priv->session = gdm_session_direct_new (display_name,
+        slave->priv->session = gdm_session_direct_new (display_id,
+                                                       display_name,
                                                        display_hostname,
                                                        display_device,
                                                        display_x11_authority_file,
                                                        display_is_local);
+        g_free (display_id);
         g_free (display_name);
         g_free (display_device);
         g_free (display_hostname);

Modified: trunk/daemon/gdm-slave.c
==============================================================================
--- trunk/daemon/gdm-slave.c	(original)
+++ trunk/daemon/gdm-slave.c	Thu Mar  6 02:48:30 2008
@@ -1230,6 +1230,8 @@
                 id = slave->priv->display_id + strlen ("/org/gnome/DisplayManager/Display");
         }
 
+        g_assert (id != NULL);
+
         slave->priv->id = g_strdup_printf ("/org/gnome/DisplayManager/Slave%s", id);
         g_debug ("GdmSlave: Registering %s", slave->priv->id);
 

Modified: trunk/daemon/test-session.c
==============================================================================
--- trunk/daemon/test-session.c	(original)
+++ trunk/daemon/test-session.c	Thu Mar  6 02:48:30 2008
@@ -242,7 +242,8 @@
 
         do {
                 g_debug ("creating instance of GdmSessionDirect object...");
-                session = gdm_session_direct_new (":0",
+                session = gdm_session_direct_new ("/org/gnome/DisplayManager/Display1",
+                                                  ":0",
                                                   g_get_host_name (),
                                                   ttyname (STDIN_FILENO),
                                                   getenv("XAUTHORITY"),

Modified: trunk/data/gdm.conf
==============================================================================
--- trunk/data/gdm.conf	(original)
+++ trunk/data/gdm.conf	Thu Mar  6 02:48:30 2008
@@ -11,6 +11,8 @@
     <allow send_interface="org.gnome.DisplayManager.Display"/>
     <allow send_interface="org.gnome.DisplayManager.LocalDisplayFactory"/>
     <allow send_interface="org.gnome.DisplayManager.Settings"/>
+    <allow send_interface="org.gnome.DisplayManager.Slave"/>
+    <allow send_interface="org.gnome.DisplayManager.Session"/>
     <allow send_destination="org.gnome.DisplayManager"
            send_interface="org.gnome.DBus.Properties" />
   </policy>
@@ -20,6 +22,8 @@
     <deny send_interface="org.gnome.DisplayManager.Display"/>
     <deny send_interface="org.gnome.DisplayManager.LocalDisplayFactory"/>
     <deny send_interface="org.gnome.DisplayManager.Settings"/>
+    <deny send_interface="org.gnome.DisplayManager.Slave"/>
+    <deny send_interface="org.gnome.DisplayManager.Session"/>
     <deny send_destination="org.gnome.DisplayManager"
           send_interface="org.gnome.DBus.Properties" />
 



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