#include "lightdm/greeter.h"
+G_DEFINE_QUARK (lightdm_greeter_error, lightdm_greeter_error)
+
enum {
PROP_0,
PROP_DEFAULT_SESSION_HINT,
GAsyncReadyCallback callback;
gpointer user_data;
gboolean complete;
+ gboolean connected;
guint32 return_code;
gchar *dir;
} Request;
#define REQUEST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), request_get_type (), Request))
G_DEFINE_TYPE_WITH_CODE (Request, request, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_RESULT, request_iface_init));
+GType
+lightdm_greeter_error_get_type (void)
+{
+ static GType enum_type = 0;
+
+ if (G_UNLIKELY(enum_type == 0)) {
+ static const GEnumValue values[] = {
+ { LIGHTDM_GREETER_ERROR_CONNECTION_FAILED, "LIGHTDM_GREETER_ERROR_CONNECTION_FAILED", "connection-failed" },
+ { LIGHTDM_GREETER_ERROR_SESSION_FAILED, "LIGHTDM_GREETER_ERROR_SESSION_FAILED", "session-failed" },
+ { 0, NULL, NULL }
+ };
+ enum_type = g_enum_register_static (g_intern_static_string ("LightDMGreeterError"), values);
+ }
+
+ return enum_type;
+}
+
GType
lightdm_prompt_type_get_type (void)
{
request = g_list_nth_data (priv->connect_requests, 0);
if (request)
{
+ request->connected = TRUE;
request_complete (request, G_OBJECT (greeter));
priv->connect_requests = g_list_remove (priv->connect_requests, request);
g_object_unref (request);
gboolean
lightdm_greeter_connect_to_daemon_finish (LightDMGreeter *greeter, GAsyncResult *result, GError **error)
{
+ Request *request = REQUEST (result);
+
g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
- return REQUEST (result)->complete;
+
+ if (request->connected)
+ return TRUE;
+ else
+ {
+ g_set_error_literal (error, LIGHTDM_GREETER_ERROR, LIGHTDM_GREETER_ERROR_CONNECTION_FAILED, "Failed to connect to daemon");
+ return FALSE;
+ }
}
/**
{
LightDMGreeterPrivate *priv;
Request *request;
- gboolean result;
g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
g_free (message);
} while (!request->complete);
- result = request->complete;
- g_object_unref (request);
-
- return result;
+ return lightdm_greeter_connect_to_daemon_finish (greeter, G_ASYNC_RESULT (request), error);
}
/**
gboolean
lightdm_greeter_start_session_finish (LightDMGreeter *greeter, GAsyncResult *result, GError **error)
{
+ Request *request = REQUEST (result);
+
g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
- return REQUEST (result)->return_code == 0;
+
+ if (request->return_code == 0)
+ return TRUE;
+ else
+ {
+ g_set_error (error, LIGHTDM_GREETER_ERROR, LIGHTDM_GREETER_ERROR_SESSION_FAILED, "Session returned error code %d", request->return_code);
+ return FALSE;
+ }
}
/**
{
LightDMGreeterPrivate *priv;
Request *request;
- guint32 return_code;
g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
g_free (message);
} while (!request->complete);
- return_code = request->return_code;
- g_object_unref (request);
-
- return return_code == 0;
+ return lightdm_greeter_start_session_finish (greeter, G_ASYNC_RESULT (request), error);
}
/**
#define LIGHTDM_IS_GREETER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LIGHTDM_TYPE_GREETER))
#define LIGHTDM_GREETER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), LIGHTDM_TYPE_GREETER, LightDMGreeterClass))
+#define LIGHTDM_GREETER_ERROR lightdm_greeter_error_quark ()
+
#define LIGHTDM_GREETER_SIGNAL_SHOW_PROMPT "show-prompt"
#define LIGHTDM_GREETER_SIGNAL_SHOW_MESSAGE "show-message"
#define LIGHTDM_GREETER_SIGNAL_AUTHENTICATION_COMPLETE "authentication-complete"
}
#endif
+/**
+ * LightDMGreeterError:
+ * @LIGHTDM_GREETER_ERROR_CONNECTION_FAILED: Failed to connect to the daemon
+ * @LIGHTDM_GREETER_ERROR_SESSION_FAILED: Requested session failed to start
+ */
+typedef enum
+{
+ LIGHTDM_GREETER_ERROR_CONNECTION_FAILED,
+ LIGHTDM_GREETER_ERROR_SESSION_FAILED
+} LightDMGreeterError;
+
+GQuark lightdm_greeter_error_quark (void);
+
+GType lightdm_greeter_error_get_type (void);
+
GType lightdm_greeter_get_type (void);
LightDMGreeter *lightdm_greeter_new (void);
r = '%s START-SESSION' % greeter_id
if request == r:
- if not greeter.start_session_sync (None):
+ try:
+ greeter.start_session_sync (None)
+ except:
status_notify ('%s SESSION-FAILED' % greeter_id)
r = '%s START-SESSION SESSION=' % greeter_id
if request.startswith (r):
- if not greeter.start_session_sync (request[len(r):]):
+ try:
+ greeter.start_session_sync (request[len(r):])
+ except:
status_notify ('%s SESSION-FAILED' % greeter_id)
r = '%s LOG-USER-LIST-LENGTH' % greeter_id
LightDM.UserList.get_instance ().connect ('user-removed', user_removed_cb)
status_notify ('%s CONNECT-TO-DAEMON' % greeter_id)
-if not greeter.connect_to_daemon_sync ():
+try:
+ greeter.connect_to_daemon_sync ()
+except:
status_notify ('%s FAIL-CONNECT-DAEMON' % greeter_id)
exit (1)