summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2012-07-12 22:41:15 -0400
committerRay Strode <rstrode@redhat.com>2012-07-17 03:34:20 -0400
commit7322279de23123b4fe35c872aa72c8a5e01cb640 (patch)
tree2971513c21c0424cec37e9e60f841953b1942e42
parent7b1931207544ebc00542eb158dae34a7331629c2 (diff)
downloadgdm-wip/slave-connection.tar.gz
chooser: port to libgdmwip/slave-connection
The chooser is the UI showns to XDMCP clients connecting via indirect queries. It shows a list of login screens on the network and lets the user pick that login screen to jump to. Right now it uses its own hardcoded D-Bus calls to interact with the GDM daemon. The D-Bus APIs have changed, though, and so now it no longer works. This commit changes simple-chooser to use libgdm instead.
-rw-r--r--configure.ac1
-rw-r--r--gui/simple-chooser/Makefile.am4
-rw-r--r--gui/simple-chooser/gdm-chooser-client.c403
-rw-r--r--gui/simple-chooser/gdm-chooser-client.h69
-rw-r--r--gui/simple-chooser/gdm-chooser-session.c68
5 files changed, 50 insertions, 495 deletions
diff --git a/configure.ac b/configure.ac
index af2e2956..a6360fb9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -162,7 +162,6 @@ AC_SUBST(LIBXKLAVIER_CFLAGS)
AC_SUBST(LIBXKLAVIER_LIBS)
PKG_CHECK_MODULES(SIMPLE_CHOOSER,
- dbus-glib-1 >= $DBUS_GLIB_REQUIRED_VERSION
gtk+-3.0 >= $GTK_REQUIRED_VERSION
)
AC_SUBST(SIMPLE_CHOOSER_CFLAGS)
diff --git a/gui/simple-chooser/Makefile.am b/gui/simple-chooser/Makefile.am
index eacf0c90..8b9c003c 100644
--- a/gui/simple-chooser/Makefile.am
+++ b/gui/simple-chooser/Makefile.am
@@ -2,6 +2,7 @@ NULL =
AM_CPPFLAGS = \
-I$(top_srcdir)/common \
+ -I$(top_srcdir)/gui/libgdm \
-DAUTHDIR=\""$(authdir)"\" \
-DDATADIR=\""$(datadir)"\" \
-DGDMCONFDIR=\"$(gdmconfdir)\" \
@@ -32,14 +33,13 @@ gdm_simple_chooser_SOURCES = \
gdm-host-chooser-widget.h \
gdm-host-chooser-dialog.c \
gdm-host-chooser-dialog.h \
- gdm-chooser-client.c \
- gdm-chooser-client.h \
gdm-chooser-session.c \
gdm-chooser-session.h \
$(NULL)
gdm_simple_chooser_LDADD = \
$(top_builddir)/common/libgdmcommon.la \
+ $(top_builddir)/gui/libgdm/libgdm.la \
$(GTK_LIBS) \
$(EXTRA_CHOOSER_LIBS) \
$(SIMPLE_CHOOSER_LIBS) \
diff --git a/gui/simple-chooser/gdm-chooser-client.c b/gui/simple-chooser/gdm-chooser-client.c
deleted file mode 100644
index 4316929b..00000000
--- a/gui/simple-chooser/gdm-chooser-client.c
+++ /dev/null
@@ -1,403 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- */
-
-#include "config.h"
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <string.h>
-
-#include <glib.h>
-#include <glib/gi18n.h>
-#include <glib-object.h>
-#define DBUS_API_SUBJECT_TO_CHANGE
-#include <dbus/dbus.h>
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus-glib-lowlevel.h>
-
-#include "gdm-chooser-client.h"
-
-#define GDM_CHOOSER_CLIENT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_CHOOSER_CLIENT, GdmChooserClientPrivate))
-
-#define CHOOSER_SERVER_DBUS_PATH "/org/gnome/DisplayManager/ChooserServer"
-#define CHOOSER_SERVER_DBUS_INTERFACE "org.gnome.DisplayManager.ChooserServer"
-
-#define GDM_DBUS_NAME "org.gnome.DisplayManager"
-#define GDM_DBUS_DISPLAY_INTERFACE "org.gnome.DisplayManager.Display"
-
-struct GdmChooserClientPrivate
-{
- DBusConnection *connection;
- char *address;
-};
-
-enum {
- PROP_0,
-};
-
-static void gdm_chooser_client_class_init (GdmChooserClientClass *klass);
-static void gdm_chooser_client_init (GdmChooserClient *chooser_client);
-static void gdm_chooser_client_finalize (GObject *object);
-
-G_DEFINE_TYPE (GdmChooserClient, gdm_chooser_client, G_TYPE_OBJECT)
-
-static gpointer client_object = NULL;
-
-GQuark
-gdm_chooser_client_error_quark (void)
-{
- static GQuark error_quark = 0;
-
- if (error_quark == 0)
- error_quark = g_quark_from_static_string ("gdm-chooser-client");
-
- return error_quark;
-}
-
-static gboolean
-send_dbus_string_method (DBusConnection *connection,
- const char *method,
- const char *payload)
-{
- DBusError error;
- DBusMessage *message;
- DBusMessage *reply;
- DBusMessageIter iter;
- const char *str;
-
- if (payload != NULL) {
- str = payload;
- } else {
- str = "";
- }
-
- g_debug ("GdmChooserClient: Calling %s", method);
- message = dbus_message_new_method_call (NULL,
- CHOOSER_SERVER_DBUS_PATH,
- CHOOSER_SERVER_DBUS_INTERFACE,
- method);
- if (message == NULL) {
- g_warning ("Couldn't allocate the D-Bus message");
- return FALSE;
- }
-
- dbus_message_iter_init_append (message, &iter);
- dbus_message_iter_append_basic (&iter,
- DBUS_TYPE_STRING,
- &str);
-
- dbus_error_init (&error);
- reply = dbus_connection_send_with_reply_and_block (connection,
- message,
- -1,
- &error);
-
- dbus_message_unref (message);
-
- if (dbus_error_is_set (&error)) {
- g_warning ("%s %s raised: %s\n",
- method,
- error.name,
- error.message);
- return FALSE;
- }
- if (reply != NULL) {
- dbus_message_unref (reply);
- }
- dbus_connection_flush (connection);
-
- return TRUE;
-}
-
-
-static gboolean
-send_dbus_void_method (DBusConnection *connection,
- const char *method)
-{
- DBusError error;
- DBusMessage *message;
- DBusMessage *reply;
-
- g_debug ("GdmChooserClient: Calling %s", method);
- message = dbus_message_new_method_call (NULL,
- CHOOSER_SERVER_DBUS_PATH,
- CHOOSER_SERVER_DBUS_INTERFACE,
- method);
- if (message == NULL) {
- g_warning ("Couldn't allocate the D-Bus message");
- return FALSE;
- }
-
- dbus_error_init (&error);
- reply = dbus_connection_send_with_reply_and_block (connection,
- message,
- -1,
- &error);
-
- dbus_message_unref (message);
-
- if (dbus_error_is_set (&error)) {
- g_warning ("%s %s raised: %s\n",
- method,
- error.name,
- error.message);
- return FALSE;
- }
- if (reply != NULL) {
- dbus_message_unref (reply);
- }
- dbus_connection_flush (connection);
-
- return TRUE;
-}
-
-void
-gdm_chooser_client_call_select_hostname (GdmChooserClient *client,
- const char *text)
-{
- send_dbus_string_method (client->priv->connection,
- "SelectHostname",
- text);
-}
-
-void
-gdm_chooser_client_call_disconnect (GdmChooserClient *client)
-{
- send_dbus_void_method (client->priv->connection,
- "Disconnect");
-}
-
-static DBusHandlerResult
-client_dbus_handle_message (DBusConnection *connection,
- DBusMessage *message,
- void *user_data,
- dbus_bool_t local_interface)
-{
-
-#if 0
- g_message ("obj_path=%s interface=%s method=%s destination=%s",
- dbus_message_get_path (message),
- dbus_message_get_interface (message),
- dbus_message_get_member (message),
- dbus_message_get_destination (message));
-#endif
-
- g_return_val_if_fail (connection != NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
- g_return_val_if_fail (message != NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
-
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-static DBusHandlerResult
-client_dbus_filter_function (DBusConnection *connection,
- DBusMessage *message,
- void *user_data)
-{
- GdmChooserClient *client = GDM_CHOOSER_CLIENT (user_data);
- const char *path;
-
- path = dbus_message_get_path (message);
-
- g_debug ("GdmChooserClient: obj_path=%s interface=%s method=%s",
- dbus_message_get_path (message),
- dbus_message_get_interface (message),
- dbus_message_get_member (message));
-
- if (dbus_message_is_signal (message, DBUS_INTERFACE_LOCAL, "Disconnected")
- && strcmp (path, DBUS_PATH_LOCAL) == 0) {
-
- g_message ("Got disconnected from the session message bus");
-
- dbus_connection_unref (connection);
- client->priv->connection = NULL;
-
- } else if (dbus_message_is_signal (message,
- DBUS_INTERFACE_DBUS,
- "NameOwnerChanged")) {
- g_debug ("GdmChooserClient: Name owner changed?");
- } else {
- return client_dbus_handle_message (connection, message, user_data, FALSE);
- }
-
- return DBUS_HANDLER_RESULT_HANDLED;
-}
-
-gboolean
-gdm_chooser_client_start (GdmChooserClient *client,
- GError **error)
-{
- gboolean ret;
- DBusError local_error;
-
- g_return_val_if_fail (GDM_IS_CHOOSER_CLIENT (client), FALSE);
-
- ret = FALSE;
-
- if (client->priv->address == NULL) {
- g_warning ("GDM_CHOOSER_DBUS_ADDRESS not set");
- g_set_error (error,
- GDM_CHOOSER_CLIENT_ERROR,
- GDM_CHOOSER_CLIENT_ERROR_GENERIC,
- "GDM_CHOOSER_DBUS_ADDRESS not set");
- goto out;
- }
-
- g_debug ("GdmChooserClient: connecting to address: %s", client->priv->address);
-
- dbus_error_init (&local_error);
- client->priv->connection = dbus_connection_open (client->priv->address, &local_error);
- if (client->priv->connection == NULL) {
- if (dbus_error_is_set (&local_error)) {
- g_warning ("error opening connection: %s", local_error.message);
- g_set_error (error,
- GDM_CHOOSER_CLIENT_ERROR,
- GDM_CHOOSER_CLIENT_ERROR_GENERIC,
- "%s", local_error.message);
- dbus_error_free (&local_error);
- } else {
- g_warning ("Unable to open connection");
- }
- goto out;
- }
-
- dbus_connection_setup_with_g_main (client->priv->connection, NULL);
- dbus_connection_set_exit_on_disconnect (client->priv->connection, TRUE);
-
- dbus_connection_add_filter (client->priv->connection,
- client_dbus_filter_function,
- client,
- NULL);
-
- ret = TRUE;
-
- out:
- return ret;
-}
-
-void
-gdm_chooser_client_stop (GdmChooserClient *client)
-{
- g_return_if_fail (GDM_IS_CHOOSER_CLIENT (client));
-
-}
-
-static void
-gdm_chooser_client_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- switch (prop_id) {
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-gdm_chooser_client_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- switch (prop_id) {
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static GObject *
-gdm_chooser_client_constructor (GType type,
- guint n_construct_properties,
- GObjectConstructParam *construct_properties)
-{
- GdmChooserClient *chooser_client;
-
- chooser_client = GDM_CHOOSER_CLIENT (G_OBJECT_CLASS (gdm_chooser_client_parent_class)->constructor (type,
- n_construct_properties,
- construct_properties));
-
- return G_OBJECT (chooser_client);
-}
-
-static void
-gdm_chooser_client_dispose (GObject *object)
-{
- g_debug ("GdmChooserClient: Disposing chooser_client");
-
- G_OBJECT_CLASS (gdm_chooser_client_parent_class)->dispose (object);
-}
-
-static void
-gdm_chooser_client_class_init (GdmChooserClientClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- object_class->get_property = gdm_chooser_client_get_property;
- object_class->set_property = gdm_chooser_client_set_property;
- object_class->constructor = gdm_chooser_client_constructor;
- object_class->dispose = gdm_chooser_client_dispose;
- object_class->finalize = gdm_chooser_client_finalize;
-
- g_type_class_add_private (klass, sizeof (GdmChooserClientPrivate));
-}
-
-static void
-gdm_chooser_client_init (GdmChooserClient *client)
-{
-
- client->priv = GDM_CHOOSER_CLIENT_GET_PRIVATE (client);
-
- client->priv->address = g_strdup (g_getenv ("GDM_CHOOSER_DBUS_ADDRESS"));
-}
-
-static void
-gdm_chooser_client_finalize (GObject *object)
-{
- GdmChooserClient *client;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (GDM_IS_CHOOSER_CLIENT (object));
-
- client = GDM_CHOOSER_CLIENT (object);
-
- g_return_if_fail (client->priv != NULL);
-
- g_free (client->priv->address);
-
- G_OBJECT_CLASS (gdm_chooser_client_parent_class)->finalize (object);
-}
-
-GdmChooserClient *
-gdm_chooser_client_new (void)
-{
- if (client_object != NULL) {
- g_object_ref (client_object);
- } else {
- client_object = g_object_new (GDM_TYPE_CHOOSER_CLIENT, NULL);
- g_object_add_weak_pointer (client_object,
- (gpointer *) &client_object);
- }
-
- return GDM_CHOOSER_CLIENT (client_object);
-}
diff --git a/gui/simple-chooser/gdm-chooser-client.h b/gui/simple-chooser/gdm-chooser-client.h
deleted file mode 100644
index 540040d1..00000000
--- a/gui/simple-chooser/gdm-chooser-client.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
- *
- * Copyright (C) 2007 William Jon McCann <mccann@jhu.edu>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- */
-
-#ifndef __GDM_CHOOSER_CLIENT_H
-#define __GDM_CHOOSER_CLIENT_H
-
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-#define GDM_TYPE_CHOOSER_CLIENT (gdm_chooser_client_get_type ())
-#define GDM_CHOOSER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GDM_TYPE_CHOOSER_CLIENT, GdmChooserClient))
-#define GDM_CHOOSER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GDM_TYPE_CHOOSER_CLIENT, GdmChooserClientClass))
-#define GDM_IS_CHOOSER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDM_TYPE_CHOOSER_CLIENT))
-#define GDM_IS_CHOOSER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GDM_TYPE_CHOOSER_CLIENT))
-#define GDM_CHOOSER_CLIENT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GDM_TYPE_CHOOSER_CLIENT, GdmChooserClientClass))
-
-typedef struct GdmChooserClientPrivate GdmChooserClientPrivate;
-
-typedef struct
-{
- GObject parent;
- GdmChooserClientPrivate *priv;
-} GdmChooserClient;
-
-typedef struct
-{
- GObjectClass parent_class;
-} GdmChooserClientClass;
-
-#define GDM_CHOOSER_CLIENT_ERROR (gdm_chooser_client_error_quark ())
-
-typedef enum _GdmChooserClientError {
- GDM_CHOOSER_CLIENT_ERROR_GENERIC = 0,
-} GdmChooserClientError;
-
-GType gdm_chooser_client_get_type (void);
-GQuark gdm_chooser_client_error_quark (void);
-
-GdmChooserClient * gdm_chooser_client_new (void);
-
-gboolean gdm_chooser_client_start (GdmChooserClient *client,
- GError **error);
-void gdm_chooser_client_stop (GdmChooserClient *client);
-
-void gdm_chooser_client_call_disconnect (GdmChooserClient *client);
-void gdm_chooser_client_call_select_hostname (GdmChooserClient *client,
- const char *text);
-
-G_END_DECLS
-
-#endif /* __GDM_CHOOSER_CLIENT_H */
diff --git a/gui/simple-chooser/gdm-chooser-session.c b/gui/simple-chooser/gdm-chooser-session.c
index da1e8963..3a69aa71 100644
--- a/gui/simple-chooser/gdm-chooser-session.c
+++ b/gui/simple-chooser/gdm-chooser-session.c
@@ -30,7 +30,7 @@
#include <glib-object.h>
#include "gdm-chooser-session.h"
-#include "gdm-chooser-client.h"
+#include "gdm-client.h"
#include "gdm-host-chooser-dialog.h"
@@ -38,7 +38,9 @@
struct GdmChooserSessionPrivate
{
- GdmChooserClient *client;
+ GdmClient *client;
+ GdmRemoteGreeter *remote_greeter;
+ GdmChooser *chooser;
GtkWidget *chooser_dialog;
};
@@ -150,6 +152,7 @@ on_dialog_response (GtkDialog *dialog,
GdmChooserSession *session)
{
GdmChooserHost *host;
+ GError *error = NULL;
host = NULL;
switch (response_id) {
@@ -172,38 +175,59 @@ on_dialog_response (GtkDialog *dialog,
/* FIXME: fall back to numerical address? */
if (hostname != NULL) {
g_debug ("GdmChooserSession: Selected hostname '%s'", hostname);
- gdm_chooser_client_call_select_hostname (session->priv->client, hostname);
+ gdm_chooser_call_select_hostname_sync (session->priv->chooser,
+ hostname,
+ NULL,
+ &error);
+
+ if (error != NULL) {
+ g_debug ("GdmChooserSession: %s", error->message);
+ g_clear_error (&error);
+ }
g_free (hostname);
}
}
- gdm_chooser_client_call_disconnect (session->priv->client);
+ gdm_remote_greeter_call_disconnect_sync (session->priv->remote_greeter,
+ NULL,
+ &error);
+ if (error != NULL) {
+ g_debug ("GdmChooserSession: disconnect failed: %s", error->message);
+ }
}
gboolean
gdm_chooser_session_start (GdmChooserSession *session,
GError **error)
{
- gboolean res;
-
g_return_val_if_fail (GDM_IS_CHOOSER_SESSION (session), FALSE);
- res = gdm_chooser_client_start (session->priv->client, error);
-
- if (res) {
- start_settings_daemon (session);
- start_window_manager (session);
+ session->priv->remote_greeter = gdm_client_get_remote_greeter_sync (session->priv->client,
+ NULL,
+ error);
+ if (session->priv->remote_greeter == NULL) {
+ return FALSE;
+ }
- /* Only support XDMCP on remote choosers */
- session->priv->chooser_dialog = gdm_host_chooser_dialog_new (GDM_CHOOSER_HOST_KIND_XDMCP);
- g_signal_connect (session->priv->chooser_dialog,
- "response",
- G_CALLBACK (on_dialog_response),
- session);
- gtk_widget_show (session->priv->chooser_dialog);
+ session->priv->chooser = gdm_client_get_chooser_sync (session->priv->client,
+ NULL,
+ error);
+ if (session->priv->chooser == NULL) {
+ return FALSE;
}
- return res;
+ start_settings_daemon (session);
+ start_window_manager (session);
+
+ /* Only support XDMCP on remote choosers */
+ session->priv->chooser_dialog = gdm_host_chooser_dialog_new (GDM_CHOOSER_HOST_KIND_XDMCP);
+ g_signal_connect (session->priv->chooser_dialog,
+ "response",
+ G_CALLBACK (on_dialog_response),
+ session);
+ gtk_widget_show (session->priv->chooser_dialog);
+
+ return TRUE;
}
void
@@ -281,7 +305,7 @@ gdm_chooser_session_init (GdmChooserSession *session)
session->priv = GDM_CHOOSER_SESSION_GET_PRIVATE (session);
- session->priv->client = gdm_chooser_client_new ();
+ session->priv->client = gdm_client_new ();
}
static void
@@ -296,6 +320,10 @@ gdm_chooser_session_finalize (GObject *object)
g_return_if_fail (chooser_session->priv != NULL);
+ g_clear_object (&chooser_session->priv->chooser);
+ g_clear_object (&chooser_session->priv->remote_greeter);
+ g_clear_object (&chooser_session->priv->client);
+
G_OBJECT_CLASS (gdm_chooser_session_parent_class)->finalize (object);
}