[gdm/multi-stack: 7/45] emit "ConversationStopped" signal at end of conv
- From: Ray Strode <halfline src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gdm/multi-stack: 7/45] emit "ConversationStopped" signal at end of conv
- Date: Tue, 27 Apr 2010 19:41:27 +0000 (UTC)
commit ef0d8f12990fa0c4b7d88fde8308a1594940eb88
Author: Ray Strode <rstrode redhat com>
Date: Sat Feb 7 11:36:40 2009 -0500
emit "ConversationStopped" signal at end of conv
This will allow us to track when individual
PAM conversations fail, instead of doing one
giant reset. The reason this is useful is that
some PAM modules fail immediately for some users
(for instance the fingerprint PAM module fails if
a user hasn't enrolled their print).
daemon/gdm-greeter-server.c | 14 ++++++++++++++
daemon/gdm-greeter-server.h | 2 ++
daemon/gdm-session-direct.c | 36 ++++++++++++++++++++++++++++++++++++
daemon/gdm-session-private.h | 2 ++
daemon/gdm-session.c | 28 ++++++++++++++++++++++++++++
daemon/gdm-session.h | 6 ++++++
daemon/gdm-simple-slave.c | 34 ++++++++++++++++++++++++++--------
7 files changed, 114 insertions(+), 8 deletions(-)
---
diff --git a/daemon/gdm-greeter-server.c b/daemon/gdm-greeter-server.c
index dae34c5..ecb2ad6 100644
--- a/daemon/gdm-greeter-server.c
+++ b/daemon/gdm-greeter-server.c
@@ -299,6 +299,14 @@ gdm_greeter_server_ready (GdmGreeterServer *greeter_server,
return TRUE;
}
+gboolean
+gdm_greeter_server_conversation_stopped (GdmGreeterServer *greeter_server,
+ const char *service_name)
+{
+ send_dbus_string_signal (greeter_server, "ConversationStopped", service_name);
+ return TRUE;
+}
+
void
gdm_greeter_server_selected_user_changed (GdmGreeterServer *greeter_server,
const char *username)
@@ -797,6 +805,9 @@ do_introspect (DBusConnection *connection,
" <method name=\"StartConversation\">\n"
" <arg name=\"service_name\" direction=\"in\" type=\"s\"/>\n"
" </method>\n"
+ " <method name=\"StopConversation\">\n"
+ " <arg name=\"service_name\" direction=\"in\" type=\"s\"/>\n"
+ " </method>\n"
" <method name=\"BeginVerification\">\n"
" <arg name=\"service_name\" direction=\"in\" type=\"s\"/>\n"
" </method>\n"
@@ -868,6 +879,9 @@ do_introspect (DBusConnection *connection,
" <signal name=\"Ready\">\n"
" <arg name=\"service-name\" type=\"s\"/>\n"
" </signal>\n"
+ " <signal name=\"ConversationStopped\">\n"
+ " <arg name=\"service-name\" type=\"s\"/>\n"
+ " </signal>\n"
" <signal name=\"Reset\">\n"
" </signal>\n"
" <signal name=\"UserAuthorized\">\n"
diff --git a/daemon/gdm-greeter-server.h b/daemon/gdm-greeter-server.h
index 6d0dd87..976f0b7 100644
--- a/daemon/gdm-greeter-server.h
+++ b/daemon/gdm-greeter-server.h
@@ -96,6 +96,8 @@ gboolean gdm_greeter_server_problem (GdmGreeterServer *
gboolean gdm_greeter_server_reset (GdmGreeterServer *greeter_server);
gboolean gdm_greeter_server_ready (GdmGreeterServer *greeter_server,
const char *service_name);
+gboolean gdm_greeter_server_conversation_stopped (GdmGreeterServer *greeter_server,
+ const char *service_name);
void gdm_greeter_server_selected_user_changed (GdmGreeterServer *greeter_server,
const char *text);
void gdm_greeter_server_default_language_name_changed (GdmGreeterServer *greeter_server,
diff --git a/daemon/gdm-session-direct.c b/daemon/gdm-session-direct.c
index 9d6a6b9..649dd91 100644
--- a/daemon/gdm-session-direct.c
+++ b/daemon/gdm-session-direct.c
@@ -1794,9 +1794,15 @@ worker_exited (GdmSessionWorkerJob *job,
{
g_debug ("GdmSessionDirect: Worker job exited: %d", code);
+ g_object_ref (conversation->job);
if (conversation->session->priv->is_running) {
_gdm_session_session_exited (GDM_SESSION (conversation->session), code);
}
+
+ g_debug ("GdmSessionDirect: Emitting conversation-stopped signal");
+ _gdm_session_conversation_stopped (GDM_SESSION (conversation->session),
+ conversation->service_name);
+ g_object_unref (conversation->job);
}
static void
@@ -1806,9 +1812,15 @@ worker_died (GdmSessionWorkerJob *job,
{
g_debug ("GdmSessionDirect: Worker job died: %d", signum);
+ g_object_ref (conversation->job);
if (conversation->session->priv->is_running) {
_gdm_session_session_died (GDM_SESSION (conversation->session), signum);
}
+
+ g_debug ("GdmSessionDirect: Emitting conversation-stopped signal");
+ _gdm_session_conversation_stopped (GDM_SESSION (conversation->session),
+ conversation->service_name);
+ g_object_unref (conversation->job);
}
static GdmSessionConversation *
@@ -1881,6 +1893,10 @@ stop_conversation (GdmSessionConversation *conversation)
g_object_unref (conversation->job);
conversation->job = NULL;
+
+ g_debug ("GdmSessionDirect: Emitting conversation-stopped signal");
+ _gdm_session_conversation_stopped (GDM_SESSION (session),
+ conversation->service_name);
}
static void
@@ -1901,6 +1917,25 @@ gdm_session_direct_start_conversation (GdmSession *session,
}
static void
+gdm_session_direct_stop_conversation (GdmSession *session,
+ const char *service_name)
+{
+ GdmSessionDirect *impl = GDM_SESSION_DIRECT (session);
+ GdmSessionConversation *conversation;
+
+ g_return_if_fail (session != NULL);
+
+ g_debug ("GdmSessionDirect: stopping conversation");
+
+ conversation = find_conversation_by_name (impl, service_name);
+
+ if (conversation != NULL) {
+ stop_conversation (conversation);
+ g_hash_table_remove (impl->priv->conversations, service_name);
+ }
+}
+
+static void
send_setup (GdmSessionDirect *session,
const char *service_name)
{
@@ -2794,6 +2829,7 @@ static void
gdm_session_iface_init (GdmSessionIface *iface)
{
iface->start_conversation = gdm_session_direct_start_conversation;
+ iface->stop_conversation = gdm_session_direct_stop_conversation;
iface->setup = gdm_session_direct_setup;
iface->setup_for_user = gdm_session_direct_setup_for_user;
iface->authenticate = gdm_session_direct_authenticate;
diff --git a/daemon/gdm-session-private.h b/daemon/gdm-session-private.h
index 4dc6e44..36781dd 100644
--- a/daemon/gdm-session-private.h
+++ b/daemon/gdm-session-private.h
@@ -29,6 +29,8 @@ G_BEGIN_DECLS
/* state changes */
void _gdm_session_conversation_started (GdmSession *session,
const char *service_name);
+void _gdm_session_conversation_stopped (GdmSession *session,
+ const char *service_name);
void _gdm_session_setup_complete (GdmSession *session,
const char *service_name);
void _gdm_session_setup_failed (GdmSession *session,
diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
index a7b4e8b..8858071 100644
--- a/daemon/gdm-session.c
+++ b/daemon/gdm-session.c
@@ -30,6 +30,7 @@
enum {
CONVERSATION_STARTED = 0,
+ CONVERSATION_STOPPED,
SETUP_COMPLETE,
SETUP_FAILED,
RESET_COMPLETE,
@@ -90,6 +91,15 @@ gdm_session_start_conversation (GdmSession *session,
}
void
+gdm_session_stop_conversation (GdmSession *session,
+ const char *service_name)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+
+ GDM_SESSION_GET_IFACE (session)->stop_conversation (session, service_name);
+}
+
+void
gdm_session_close (GdmSession *session)
{
g_return_if_fail (GDM_IS_SESSION (session));
@@ -231,6 +241,16 @@ gdm_session_class_init (gpointer g_iface)
g_cclosure_marshal_VOID__STRING,
G_TYPE_NONE,
1, G_TYPE_STRING);
+ signals [CONVERSATION_STOPPED] =
+ g_signal_new ("conversation-stopped",
+ iface_type,
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GdmSessionIface, conversation_stopped),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE,
+ 1, G_TYPE_STRING);
signals [SETUP_COMPLETE] =
g_signal_new ("setup-complete",
iface_type,
@@ -688,6 +708,14 @@ _gdm_session_conversation_started (GdmSession *session,
}
void
+_gdm_session_conversation_stopped (GdmSession *session,
+ const char *service_name)
+{
+ g_return_if_fail (GDM_IS_SESSION (session));
+ g_signal_emit (session, signals [CONVERSATION_STOPPED], 0, service_name);
+}
+
+void
_gdm_session_closed (GdmSession *session)
{
g_return_if_fail (GDM_IS_SESSION (session));
diff --git a/daemon/gdm-session.h b/daemon/gdm-session.h
index 20a442b..22c2ccb 100644
--- a/daemon/gdm-session.h
+++ b/daemon/gdm-session.h
@@ -47,6 +47,8 @@ struct _GdmSessionIface
/* Methods */
void (* start_conversation) (GdmSession *session,
const char *service_name);
+ void (* stop_conversation) (GdmSession *session,
+ const char *service_name);
void (* setup) (GdmSession *session,
const char *service_name);
void (* setup_for_user) (GdmSession *session,
@@ -132,6 +134,8 @@ struct _GdmSessionIface
int signal_number);
void (* conversation_started) (GdmSession *session,
const char *service_name);
+ void (* conversation_stopped) (GdmSession *session,
+ const char *service_name);
void (* closed) (GdmSession *session);
void (* selected_user_changed) (GdmSession *session,
const char *text);
@@ -148,6 +152,8 @@ GType gdm_session_get_type (void) G_GNUC_CONST;
void gdm_session_start_conversation (GdmSession *session,
const char *service_name);
+void gdm_session_stop_conversation (GdmSession *session,
+ const char *service_name);
void gdm_session_setup (GdmSession *session,
const char *service_name);
void gdm_session_setup_for_user (GdmSession *session,
diff --git a/daemon/gdm-simple-slave.c b/daemon/gdm-simple-slave.c
index fed2e8b..20fe4ab 100644
--- a/daemon/gdm-simple-slave.c
+++ b/daemon/gdm-simple-slave.c
@@ -230,8 +230,7 @@ on_session_setup_failed (GdmSession *session,
message != NULL ? message: _("Unable to initialize login system"));
}
- destroy_session (slave);
- queue_greeter_reset (slave);
+ gdm_session_stop_conversation (session, service_name);
}
static void
@@ -268,8 +267,8 @@ on_session_authentication_failed (GdmSession *session,
service_name,
message != NULL ? message : _("Unable to authenticate user"));
}
- destroy_session (slave);
- queue_greeter_reset (slave);
+
+ gdm_session_stop_conversation (session, service_name);
}
static void
@@ -327,8 +326,7 @@ on_session_authorization_failed (GdmSession *session,
message != NULL ? message : _("Unable to authorize user"));
}
- destroy_session (slave);
- queue_greeter_reset (slave);
+ gdm_session_stop_conversation (session, service_name);
}
static gboolean
@@ -471,9 +469,8 @@ on_session_accreditation_failed (GdmSession *session,
when Xorg exits it switches to the VT it was
started from. That interferes with fast
user switching. */
- destroy_session (slave);
- queue_greeter_reset (slave);
+ gdm_session_stop_conversation (session, service_name);
}
static void
@@ -582,6 +579,23 @@ on_session_conversation_started (GdmSession *session,
}
static void
+on_session_conversation_stopped (GdmSession *session,
+ const char *service_name,
+ GdmSimpleSlave *slave)
+{
+ gboolean res;
+ g_debug ("GdmSimpleSlave: conversation stopped");
+
+ if (slave->priv->greeter_server != NULL) {
+ res = gdm_greeter_server_conversation_stopped (slave->priv->greeter_server,
+ service_name);
+ if (! res) {
+ g_warning ("Unable to send conversation stopped");
+ }
+ }
+}
+
+static void
on_session_selected_user_changed (GdmSession *session,
const char *text,
GdmSimpleSlave *slave)
@@ -670,6 +684,10 @@ create_new_session (GdmSimpleSlave *slave)
G_CALLBACK (on_session_conversation_started),
slave);
g_signal_connect (slave->priv->session,
+ "conversation-stopped",
+ G_CALLBACK (on_session_conversation_stopped),
+ slave);
+ g_signal_connect (slave->priv->session,
"setup-complete",
G_CALLBACK (on_session_setup_complete),
slave);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]