]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Set GError values on greeter method failures
authorRobert Ancell <robert.ancell@canonical.com>
Fri, 24 Jun 2016 00:27:09 +0000 (12:27 +1200)
committerRobert Ancell <robert.ancell@canonical.com>
Fri, 24 Jun 2016 00:27:09 +0000 (12:27 +1200)
liblightdm-gobject/greeter.c
liblightdm-gobject/lightdm/greeter.h
tests/src/test-gobject-greeter.c
tests/src/test-python-greeter

index 5e6996d3e0eeea02cac78009889eeaaa07637620..7db92c021c6226a73f6f2299c8bb44d5b677d774 100644 (file)
@@ -16,6 +16,8 @@
 
 #include "lightdm/greeter.h"
 
+G_DEFINE_QUARK (lightdm_greeter_error, lightdm_greeter_error)
+
 enum {
     PROP_0,
     PROP_DEFAULT_SESSION_HINT,
@@ -129,6 +131,7 @@ typedef struct
     GAsyncReadyCallback callback;
     gpointer user_data;
     gboolean complete;
+    gboolean connected;
     guint32 return_code;
     gchar *dir;
 } Request;
@@ -141,6 +144,23 @@ static void request_iface_init (GAsyncResultIface *iface);
 #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)
 {
@@ -434,6 +454,7 @@ handle_connected (LightDMGreeter *greeter, guint8 *message, gsize message_length
     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);
@@ -813,8 +834,17 @@ lightdm_greeter_connect_to_daemon (LightDMGreeter *greeter, GCancellable *cancel
 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;
+    }
 }
 
 /**
@@ -831,7 +861,6 @@ lightdm_greeter_connect_to_daemon_sync (LightDMGreeter *greeter, GError **error)
 {
     LightDMGreeterPrivate *priv;
     Request *request;
-    gboolean result;
 
     g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
 
@@ -853,10 +882,7 @@ lightdm_greeter_connect_to_daemon_sync (LightDMGreeter *greeter, GError **error)
         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);
 }
 
 /**
@@ -1433,8 +1459,17 @@ lightdm_greeter_start_session (LightDMGreeter *greeter, const gchar *session, GC
 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;
+    }
 }
 
 /**
@@ -1452,7 +1487,6 @@ lightdm_greeter_start_session_sync (LightDMGreeter *greeter, const gchar *sessio
 {
     LightDMGreeterPrivate *priv;
     Request *request;
-    guint32 return_code;
 
     g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
 
@@ -1477,10 +1511,7 @@ lightdm_greeter_start_session_sync (LightDMGreeter *greeter, const gchar *sessio
         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);
 }
 
 /**
index f915601e7aed67ad5f8eb71fbe27ae2cc17375f3..aac67e969ec172d477848dadaf84a61c9a923057 100644 (file)
@@ -23,6 +23,8 @@ G_BEGIN_DECLS
 #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"
@@ -87,6 +89,21 @@ static inline void glib_autoptr_cleanup_LightDMGreeter (LightDMGreeter **_ptr)
 }
 #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);
index 0b67e80f71ad3888b8dd5481307d402613d312a1..92c9acaa8709c7e618aa8af73f2ae304aa5f29e4 100644 (file)
@@ -125,7 +125,7 @@ start_session_finished (GObject *object, GAsyncResult *result, gpointer data)
     GError *error = NULL;
 
     if (!lightdm_greeter_start_session_finish (greeter, result, &error))
-        status_notify ("%s SESSION-FAILED", greeter_id);
+        status_notify ("%s SESSION-FAILED ERROR=%s", greeter_id, error->message);
     g_clear_error (&error);
 }
 
index 183858170af927536c4ffc7de2f9b574c0adbf75..e2b1180dea57d56df17adbd01d9c42d72179a336 100755 (executable)
@@ -76,12 +76,16 @@ def request_cb (channel, condition):
 
     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
@@ -291,7 +295,9 @@ if log_user_changes:
     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)