Merge lp:~robert-ancell/lightdm/liblightdm-async into lp:lightdm

Proposed by Robert Ancell
Status: Merged
Merged at revision: 1975
Proposed branch: lp:~robert-ancell/lightdm/liblightdm-async
Merge into: lp:lightdm
Diff against target: 997 lines (+442/-114)
7 files modified
debian/liblightdm-gobject-1-0.symbols (+6/-0)
doc/lightdm-gobject-1-sections.txt (+6/-0)
doc/tmpl/greeter.sgml (+67/-0)
liblightdm-gobject/greeter.c (+255/-52)
liblightdm-gobject/liblightdm-gobject-1.vapi (+4/-0)
liblightdm-gobject/lightdm/greeter.h (+14/-1)
tests/src/test-gobject-greeter.c (+90/-61)
To merge this branch: bzr merge lp:~robert-ancell/lightdm/liblightdm-async
Reviewer Review Type Date Requested Status
PS Jenkins bot continuous-integration Needs Fixing
LightDM Development Team Pending
Review via email: mp+217532@code.launchpad.net

Commit message

Add asynchronous methods to liblightdm - lightdm_greeter_connect, lightdm_greeter_ensure_shared_data_dir and lightdm_greeter_start_session

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
1955. By Robert Ancell

Update documentation

1956. By Robert Ancell

Merge with trunk

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'debian/liblightdm-gobject-1-0.symbols'
--- debian/liblightdm-gobject-1-0.symbols 2014-04-28 14:33:32 +0000
+++ debian/liblightdm-gobject-1-0.symbols 2014-04-29 01:26:07 +0000
@@ -16,7 +16,11 @@
16 lightdm_greeter_authenticate_remote@Base 1.3.316 lightdm_greeter_authenticate_remote@Base 1.3.3
17 lightdm_greeter_cancel_authentication@Base 0.9.217 lightdm_greeter_cancel_authentication@Base 0.9.2
18 lightdm_greeter_cancel_autologin@Base 0.9.218 lightdm_greeter_cancel_autologin@Base 0.9.2
19 lightdm_greeter_connect@Base 1.11.1
20 lightdm_greeter_connect_finish@Base 1.11.1
19 lightdm_greeter_connect_sync@Base 0.9.221 lightdm_greeter_connect_sync@Base 0.9.2
22 lightdm_greeter_ensure_shared_data_dir@Base 1.11.1
23 lightdm_greeter_ensure_shared_data_dir_finish@Base 1.11.1
20 lightdm_greeter_ensure_shared_data_dir_sync@Base 1.9.824 lightdm_greeter_ensure_shared_data_dir_sync@Base 1.9.8
21 lightdm_greeter_get_authentication_user@Base 0.9.225 lightdm_greeter_get_authentication_user@Base 0.9.2
22 lightdm_greeter_get_autologin_guest_hint@Base 0.9.226 lightdm_greeter_get_autologin_guest_hint@Base 0.9.2
@@ -38,6 +42,8 @@
38 lightdm_greeter_respond@Base 0.9.242 lightdm_greeter_respond@Base 0.9.2
39 lightdm_greeter_set_language@Base 0.9.843 lightdm_greeter_set_language@Base 0.9.8
40 lightdm_greeter_set_resettable@Base 1.11.144 lightdm_greeter_set_resettable@Base 1.11.1
45 lightdm_greeter_start_session@Base 1.11.1
46 lightdm_greeter_start_session_finish@Base 1.11.1
41 lightdm_greeter_start_session_sync@Base 0.9.247 lightdm_greeter_start_session_sync@Base 0.9.2
42 lightdm_hibernate@Base 0.9.248 lightdm_hibernate@Base 0.9.2
43 lightdm_language_get_code@Base 0.9.249 lightdm_language_get_code@Base 0.9.2
4450
=== modified file 'doc/lightdm-gobject-1-sections.txt'
--- doc/lightdm-gobject-1-sections.txt 2014-04-29 01:22:06 +0000
+++ doc/lightdm-gobject-1-sections.txt 2014-04-29 01:26:07 +0000
@@ -133,7 +133,11 @@
133LightDMPromptType133LightDMPromptType
134lightdm_greeter_new134lightdm_greeter_new
135lightdm_greeter_set_resettable135lightdm_greeter_set_resettable
136lightdm_greeter_connect
137lightdm_greeter_connect_finish
136lightdm_greeter_connect_sync138lightdm_greeter_connect_sync
139lightdm_greeter_ensure_shared_data_dir
140lightdm_greeter_ensure_shared_data_dir_finish
137lightdm_greeter_ensure_shared_data_dir_sync141lightdm_greeter_ensure_shared_data_dir_sync
138lightdm_greeter_get_default_session_hint142lightdm_greeter_get_default_session_hint
139lightdm_greeter_get_hint143lightdm_greeter_get_hint
@@ -158,6 +162,8 @@
158lightdm_greeter_get_in_authentication162lightdm_greeter_get_in_authentication
159lightdm_greeter_get_is_authenticated163lightdm_greeter_get_is_authenticated
160lightdm_greeter_get_authentication_user164lightdm_greeter_get_authentication_user
165lightdm_greeter_start_session
166lightdm_greeter_start_session_finish
161lightdm_greeter_start_session_sync167lightdm_greeter_start_session_sync
162<SUBSECTION Standard>168<SUBSECTION Standard>
163LIGHTDM_GREETER169LIGHTDM_GREETER
164170
=== modified file 'doc/tmpl/greeter.sgml'
--- doc/tmpl/greeter.sgml 2014-04-29 01:22:06 +0000
+++ doc/tmpl/greeter.sgml 2014-04-29 01:26:07 +0000
@@ -155,6 +155,28 @@
155@resettable: 155@resettable:
156156
157157
158<!-- ##### FUNCTION lightdm_greeter_connect ##### -->
159<para>
160
161</para>
162
163@greeter:
164@cancellable:
165@callback:
166@user_data:
167
168
169<!-- ##### FUNCTION lightdm_greeter_connect_finish ##### -->
170<para>
171
172</para>
173
174@greeter:
175@result:
176@error:
177@Returns:
178
179
158<!-- ##### FUNCTION lightdm_greeter_connect_sync ##### -->180<!-- ##### FUNCTION lightdm_greeter_connect_sync ##### -->
159<para>181<para>
160182
@@ -165,6 +187,28 @@
165@Returns: 187@Returns:
166188
167189
190<!-- ##### FUNCTION lightdm_greeter_ensure_shared_data_dir ##### -->
191<para>
192
193</para>
194
195@greeter:
196@username:
197@cancellable:
198@callback:
199@user_data:
200
201
202<!-- ##### FUNCTION lightdm_greeter_ensure_shared_data_dir_finish ##### -->
203<para>
204
205</para>
206
207@greeter:
208@result:
209@Returns:
210
211
168<!-- ##### FUNCTION lightdm_greeter_ensure_shared_data_dir_sync ##### -->212<!-- ##### FUNCTION lightdm_greeter_ensure_shared_data_dir_sync ##### -->
169<para>213<para>
170214
@@ -380,6 +424,29 @@
380@Returns: 424@Returns:
381425
382426
427<!-- ##### FUNCTION lightdm_greeter_start_session ##### -->
428<para>
429
430</para>
431
432@greeter:
433@session:
434@cancellable:
435@callback:
436@user_data:
437
438
439<!-- ##### FUNCTION lightdm_greeter_start_session_finish ##### -->
440<para>
441
442</para>
443
444@greeter:
445@result:
446@error:
447@Returns:
448
449
383<!-- ##### FUNCTION lightdm_greeter_start_session_sync ##### -->450<!-- ##### FUNCTION lightdm_greeter_start_session_sync ##### -->
384<para>451<para>
385452
386453
=== modified file 'liblightdm-gobject/greeter.c'
--- liblightdm-gobject/greeter.c 2014-04-28 22:56:38 +0000
+++ liblightdm-gobject/greeter.c 2014-04-29 01:26:07 +0000
@@ -125,6 +125,9 @@
125typedef struct125typedef struct
126{126{
127 GObject parent_instance;127 GObject parent_instance;
128 GCancellable *cancellable;
129 GAsyncReadyCallback callback;
130 gpointer user_data;
128 gboolean complete;131 gboolean complete;
129 guint32 return_code;132 guint32 return_code;
130 gchar *dir;133 gchar *dir;
@@ -134,8 +137,9 @@
134 GObjectClass parent_class;137 GObjectClass parent_class;
135} RequestClass;138} RequestClass;
136GType request_get_type (void);139GType request_get_type (void);
140static void request_iface_init (GAsyncResultIface *iface);
137#define REQUEST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), request_get_type (), Request))141#define REQUEST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), request_get_type (), Request))
138G_DEFINE_TYPE (Request, request, G_TYPE_OBJECT);142G_DEFINE_TYPE_WITH_CODE (Request, request, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_RESULT, request_iface_init));
139143
140/**144/**
141 * lightdm_greeter_new:145 * lightdm_greeter_new:
@@ -172,15 +176,33 @@
172}176}
173177
174static Request *178static Request *
175request_new (void)179request_new (GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
176{180{
177 Request *request;181 Request *request;
178182
179 request = g_object_new (request_get_type (), NULL);183 request = g_object_new (request_get_type (), NULL);
184 if (cancellable)
185 request->cancellable = g_object_ref (cancellable);
186 request->callback = callback;
187 request->user_data = user_data;
180188
181 return request;189 return request;
182}190}
183191
192static void
193request_complete (Request *request, GObject *object)
194{
195 request->complete = TRUE;
196
197 if (!request->callback)
198 return;
199
200 if (request->cancellable && g_cancellable_is_cancelled (request->cancellable))
201 return;
202
203 request->callback (object, G_ASYNC_RESULT (request), request->user_data);
204}
205
184static gboolean206static gboolean
185timed_login_cb (gpointer data)207timed_login_cb (gpointer data)
186{208{
@@ -288,14 +310,17 @@
288 return read_int (message, message_length, &offset);310 return read_int (message, message_length, &offset);
289}311}
290312
291static void313static gboolean
292write_message (LightDMGreeter *greeter, guint8 *message, gsize message_length)314send_message (LightDMGreeter *greeter, guint8 *message, gsize message_length)
293{315{
294 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);316 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
295 GIOStatus status;317 GIOStatus status;
296 GError *error = NULL;318 GError *error = NULL;
297 guint32 stated_length;319 guint32 stated_length;
298320
321 if (!priv->to_server_channel)
322 return FALSE;
323
299 /* Double check that we're sending well-formed messages. If we say we're324 /* Double check that we're sending well-formed messages. If we say we're
300 sending more than we do, we end up DOS'ing lightdm as it waits for the325 sending more than we do, we end up DOS'ing lightdm as it waits for the
301 rest. If we say we're sending less than we do, we confuse the heck out326 rest. If we say we're sending less than we do, we confuse the heck out
@@ -305,16 +330,20 @@
305 if (stated_length != message_length)330 if (stated_length != message_length)
306 {331 {
307 g_warning ("Refusing to write malformed packet to daemon: declared size is %u, but actual size is %zu", stated_length, message_length);332 g_warning ("Refusing to write malformed packet to daemon: declared size is %u, but actual size is %zu", stated_length, message_length);
308 return;333 return FALSE;
309 }334 }
310335
311 status = g_io_channel_write_chars (priv->to_server_channel, (gchar *) message, message_length, NULL, &error);336 status = g_io_channel_write_chars (priv->to_server_channel, (gchar *) message, message_length, NULL, &error);
312 if (error)337 if (error)
313 g_warning ("Error writing to daemon: %s", error->message);338 g_warning ("Error writing to daemon: %s", error->message);
314 g_clear_error (&error);339 g_clear_error (&error);
315 if (status == G_IO_STATUS_NORMAL)340 if (status != G_IO_STATUS_NORMAL)
316 g_debug ("Wrote %zi bytes to daemon", message_length);341 return FALSE;
342
343 g_debug ("Wrote %zi bytes to daemon", message_length);
317 g_io_channel_flush (priv->to_server_channel, NULL);344 g_io_channel_flush (priv->to_server_channel, NULL);
345
346 return TRUE;
318}347}
319348
320static void349static void
@@ -351,10 +380,11 @@
351 priv->autologin_timeout = g_timeout_add (timeout * 1000, timed_login_cb, greeter);380 priv->autologin_timeout = g_timeout_add (timeout * 1000, timed_login_cb, greeter);
352 }381 }
353382
383 /* Notify asynchronous caller */
354 request = g_list_nth_data (priv->connect_requests, 0);384 request = g_list_nth_data (priv->connect_requests, 0);
355 if (request)385 if (request)
356 {386 {
357 request->complete = TRUE;387 request_complete (request, G_OBJECT (greeter));
358 priv->connect_requests = g_list_remove (priv->connect_requests, request);388 priv->connect_requests = g_list_remove (priv->connect_requests, request);
359 g_object_unref (request);389 g_object_unref (request);
360 }390 }
@@ -501,11 +531,12 @@
501 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);531 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
502 Request *request;532 Request *request;
503533
534 /* Notify asynchronous caller */
504 request = g_list_nth_data (priv->start_session_requests, 0);535 request = g_list_nth_data (priv->start_session_requests, 0);
505 if (request)536 if (request)
506 {537 {
507 request->return_code = read_int (message, message_length, offset);538 request->return_code = read_int (message, message_length, offset);
508 request->complete = TRUE;539 request_complete (request, G_OBJECT (greeter));
509 priv->start_session_requests = g_list_remove (priv->start_session_requests, request);540 priv->start_session_requests = g_list_remove (priv->start_session_requests, request);
510 g_object_unref (request);541 g_object_unref (request);
511 }542 }
@@ -517,6 +548,7 @@
517 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);548 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
518 Request *request;549 Request *request;
519550
551 /* Notify asynchronous caller */
520 request = g_list_nth_data (priv->ensure_shared_data_dir_requests, 0);552 request = g_list_nth_data (priv->ensure_shared_data_dir_requests, 0);
521 if (request)553 if (request)
522 {554 {
@@ -527,7 +559,7 @@
527 g_free (request->dir);559 g_free (request->dir);
528 request->dir = NULL;560 request->dir = NULL;
529 }561 }
530 request->complete = TRUE;562 request_complete (request, G_OBJECT (greeter));
531 priv->ensure_shared_data_dir_requests = g_list_remove (priv->ensure_shared_data_dir_requests, request);563 priv->ensure_shared_data_dir_requests = g_list_remove (priv->ensure_shared_data_dir_requests, request);
532 g_object_unref (request);564 g_object_unref (request);
533 }565 }
@@ -571,13 +603,16 @@
571}603}
572604
573static guint8 *605static guint8 *
574read_message (LightDMGreeter *greeter, gsize *length, gboolean block)606recv_message (LightDMGreeter *greeter, gsize *length, gboolean block)
575{607{
576 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);608 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
577 gsize n_to_read, n_read;609 gsize n_to_read, n_read;
578 guint8 *buffer;610 guint8 *buffer;
579 GError *error = NULL;611 GError *error = NULL;
580612
613 if (!priv->from_server_channel)
614 return NULL;
615
581 /* Read the header, or the whole message if we already have that */616 /* Read the header, or the whole message if we already have that */
582 n_to_read = HEADER_SIZE;617 n_to_read = HEADER_SIZE;
583 if (priv->n_read >= HEADER_SIZE)618 if (priv->n_read >= HEADER_SIZE)
@@ -613,7 +648,7 @@
613 if (n_to_read > 0)648 if (n_to_read > 0)
614 {649 {
615 priv->read_buffer = g_realloc (priv->read_buffer, HEADER_SIZE + n_to_read);650 priv->read_buffer = g_realloc (priv->read_buffer, HEADER_SIZE + n_to_read);
616 return read_message (greeter, length, block);651 return recv_message (greeter, length, block);
617 }652 }
618 }653 }
619654
@@ -634,7 +669,7 @@
634 gsize message_length;669 gsize message_length;
635670
636 /* Read one message and process it */671 /* Read one message and process it */
637 message = read_message (greeter, &message_length, FALSE);672 message = recv_message (greeter, &message_length, FALSE);
638 if (message)673 if (message)
639 {674 {
640 handle_message (greeter, message, message_length);675 handle_message (greeter, message, message_length);
@@ -644,7 +679,7 @@
644 return TRUE;679 return TRUE;
645}680}
646681
647static void682static gboolean
648send_connect (LightDMGreeter *greeter, gboolean resettable)683send_connect (LightDMGreeter *greeter, gboolean resettable)
649{684{
650 guint8 message[MAX_MESSAGE_LENGTH];685 guint8 message[MAX_MESSAGE_LENGTH];
@@ -654,10 +689,11 @@
654 write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CONNECT, string_length (VERSION) + int_length (), &offset);689 write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CONNECT, string_length (VERSION) + int_length (), &offset);
655 write_string (message, MAX_MESSAGE_LENGTH, VERSION, &offset);690 write_string (message, MAX_MESSAGE_LENGTH, VERSION, &offset);
656 write_int (message, MAX_MESSAGE_LENGTH, resettable ? 1 : 0, &offset);691 write_int (message, MAX_MESSAGE_LENGTH, resettable ? 1 : 0, &offset);
657 write_message (greeter, message, offset);692
693 return send_message (greeter, message, offset);
658}694}
659695
660static void696static gboolean
661send_start_session (LightDMGreeter *greeter, const gchar *session)697send_start_session (LightDMGreeter *greeter, const gchar *session)
662{698{
663 guint8 message[MAX_MESSAGE_LENGTH];699 guint8 message[MAX_MESSAGE_LENGTH];
@@ -670,10 +706,10 @@
670706
671 write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_START_SESSION, string_length (session), &offset);707 write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_START_SESSION, string_length (session), &offset);
672 write_string (message, MAX_MESSAGE_LENGTH, session, &offset);708 write_string (message, MAX_MESSAGE_LENGTH, session, &offset);
673 write_message (greeter, message, offset);709 return send_message (greeter, message, offset);
674}710}
675711
676static void712static gboolean
677send_ensure_shared_data_dir (LightDMGreeter *greeter, const gchar *username)713send_ensure_shared_data_dir (LightDMGreeter *greeter, const gchar *username)
678{714{
679 guint8 message[MAX_MESSAGE_LENGTH];715 guint8 message[MAX_MESSAGE_LENGTH];
@@ -683,7 +719,51 @@
683719
684 write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_ENSURE_SHARED_DIR, string_length (username), &offset);720 write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_ENSURE_SHARED_DIR, string_length (username), &offset);
685 write_string (message, MAX_MESSAGE_LENGTH, username, &offset);721 write_string (message, MAX_MESSAGE_LENGTH, username, &offset);
686 write_message (greeter, message, offset);722 return send_message (greeter, message, offset);
723}
724
725/**
726 * lightdm_greeter_connect:
727 * @greeter: The greeter to connect
728 * @cancellable: (allow-none): A #GCancellable or %NULL.
729 * @callback: (allow-none): A #GAsyncReadyCallback to call when completed or %NULL.
730 * @user_data: (allow-none): data to pass to the @callback or %NULL.
731 *
732 * Asynchronously connects the greeter to the display manager.
733 *
734 * When the operation is finished, @callback will be invoked. You can then call lightdm_greeter_connect_finish() to get the result of the operation.
735 *
736 * See lightdm_greeter_connect_sync() for the synchronous version.
737 **/
738void
739lightdm_greeter_connect (LightDMGreeter *greeter, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
740{
741 LightDMGreeterPrivate *priv;
742 Request *request;
743
744 g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
745
746 priv = GET_PRIVATE (greeter);
747
748 request = request_new (cancellable, callback, user_data);
749 priv->connect_requests = g_list_append (priv->connect_requests, request);
750 send_connect (greeter, priv->resettable);
751}
752
753/**
754 * lightdm_greeter_connect_finish:
755 * @result: A #GAsyncResult.
756 * @error: return location for a #GError, or %NULL
757 *
758 * Finishes an operation started with lightdm_greeter_connect().
759 *
760 * Return value: #TRUE if successfully connected
761 **/
762gboolean
763lightdm_greeter_connect_finish (LightDMGreeter *greeter, GAsyncResult *result, GError **error)
764{
765 g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
766 return REQUEST (result)->complete;
687}767}
688768
689/**769/**
@@ -699,42 +779,22 @@
699lightdm_greeter_connect_sync (LightDMGreeter *greeter, GError **error)779lightdm_greeter_connect_sync (LightDMGreeter *greeter, GError **error)
700{780{
701 LightDMGreeterPrivate *priv;781 LightDMGreeterPrivate *priv;
702 const gchar *fd;
703 Request *request;782 Request *request;
704783
705 g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);784 g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
706785
707 priv = GET_PRIVATE (greeter);786 priv = GET_PRIVATE (greeter);
708787
709 fd = g_getenv ("LIGHTDM_TO_SERVER_FD");
710 if (!fd)
711 {
712 g_warning ("No LIGHTDM_TO_SERVER_FD environment variable");
713 return FALSE;
714 }
715 priv->to_server_channel = g_io_channel_unix_new (atoi (fd));
716 g_io_channel_set_encoding (priv->to_server_channel, NULL, NULL);
717
718 fd = g_getenv ("LIGHTDM_FROM_SERVER_FD");
719 if (!fd)
720 {
721 g_warning ("No LIGHTDM_FROM_SERVER_FD environment variable");
722 return FALSE;
723 }
724 priv->from_server_channel = g_io_channel_unix_new (atoi (fd));
725 g_io_channel_set_encoding (priv->from_server_channel, NULL, NULL);
726 g_io_add_watch (priv->from_server_channel, G_IO_IN, from_server_cb, greeter);
727
728 /* Read until we are connected */788 /* Read until we are connected */
729 send_connect (greeter, priv->resettable);789 send_connect (greeter, priv->resettable);
730 request = request_new ();790 request = request_new (NULL, NULL, NULL);
731 priv->connect_requests = g_list_append (priv->connect_requests, g_object_ref (request));791 priv->connect_requests = g_list_append (priv->connect_requests, g_object_ref (request));
732 do792 do
733 {793 {
734 guint8 *message;794 guint8 *message;
735 gsize message_length;795 gsize message_length;
736796
737 message = read_message (greeter, &message_length, TRUE);797 message = recv_message (greeter, &message_length, TRUE);
738 if (!message)798 if (!message)
739 break;799 break;
740 handle_message (greeter, message, message_length);800 handle_message (greeter, message, message_length);
@@ -1028,7 +1088,7 @@
1028 write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_AUTHENTICATE, int_length () + string_length (username), &offset);1088 write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_AUTHENTICATE, int_length () + string_length (username), &offset);
1029 write_int (message, MAX_MESSAGE_LENGTH, priv->authenticate_sequence_number, &offset);1089 write_int (message, MAX_MESSAGE_LENGTH, priv->authenticate_sequence_number, &offset);
1030 write_string (message, MAX_MESSAGE_LENGTH, username, &offset);1090 write_string (message, MAX_MESSAGE_LENGTH, username, &offset);
1031 write_message (greeter, message, offset);1091 send_message (greeter, message, offset);
1032}1092}
10331093
1034/**1094/**
@@ -1060,7 +1120,7 @@
1060 g_debug ("Starting authentication for guest account...");1120 g_debug ("Starting authentication for guest account...");
1061 write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_AUTHENTICATE_AS_GUEST, int_length (), &offset);1121 write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_AUTHENTICATE_AS_GUEST, int_length (), &offset);
1062 write_int (message, MAX_MESSAGE_LENGTH, priv->authenticate_sequence_number, &offset);1122 write_int (message, MAX_MESSAGE_LENGTH, priv->authenticate_sequence_number, &offset);
1063 write_message (greeter, message, offset);1123 send_message (greeter, message, offset);
1064}1124}
10651125
1066/**1126/**
@@ -1117,7 +1177,7 @@
1117 write_int (message, MAX_MESSAGE_LENGTH, priv->authenticate_sequence_number, &offset);1177 write_int (message, MAX_MESSAGE_LENGTH, priv->authenticate_sequence_number, &offset);
1118 write_string (message, MAX_MESSAGE_LENGTH, session, &offset);1178 write_string (message, MAX_MESSAGE_LENGTH, session, &offset);
1119 write_string (message, MAX_MESSAGE_LENGTH, username, &offset);1179 write_string (message, MAX_MESSAGE_LENGTH, username, &offset);
1120 write_message (greeter, message, offset);1180 send_message (greeter, message, offset);
1121}1181}
11221182
1123/**1183/**
@@ -1160,7 +1220,7 @@
1160 write_int (message, MAX_MESSAGE_LENGTH, g_list_length (priv->responses_received), &offset);1220 write_int (message, MAX_MESSAGE_LENGTH, g_list_length (priv->responses_received), &offset);
1161 for (iter = priv->responses_received; iter; iter = iter->next)1221 for (iter = priv->responses_received; iter; iter = iter->next)
1162 write_string (message, MAX_MESSAGE_LENGTH, (gchar *)iter->data, &offset);1222 write_string (message, MAX_MESSAGE_LENGTH, (gchar *)iter->data, &offset);
1163 write_message (greeter, message, offset);1223 send_message (greeter, message, offset);
11641224
1165 g_list_free_full (priv->responses_received, g_free);1225 g_list_free_full (priv->responses_received, g_free);
1166 priv->responses_received = NULL;1226 priv->responses_received = NULL;
@@ -1188,7 +1248,7 @@
11881248
1189 priv->cancelling_authentication = TRUE;1249 priv->cancelling_authentication = TRUE;
1190 write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CANCEL_AUTHENTICATION, 0, &offset);1250 write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_CANCEL_AUTHENTICATION, 0, &offset);
1191 write_message (greeter, message, offset);1251 send_message (greeter, message, offset);
1192}1252}
11931253
1194/**1254/**
@@ -1258,7 +1318,53 @@
12581318
1259 write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_SET_LANGUAGE, string_length (language), &offset);1319 write_header (message, MAX_MESSAGE_LENGTH, GREETER_MESSAGE_SET_LANGUAGE, string_length (language), &offset);
1260 write_string (message, MAX_MESSAGE_LENGTH, language, &offset);1320 write_string (message, MAX_MESSAGE_LENGTH, language, &offset);
1261 write_message (greeter, message, offset);1321 send_message (greeter, message, offset);
1322}
1323
1324/**
1325 * lightdm_greeter_start_session:
1326 * @greeter: A #LightDMGreeter
1327 * @session: (allow-none): The session to log into or #NULL to use the default.
1328 * @cancellable: (allow-none): A #GCancellable or %NULL.
1329 * @callback: (allow-none): A #GAsyncReadyCallback to call when completed or %NULL.
1330 * @user_data: (allow-none): data to pass to the @callback or %NULL.
1331 *
1332 * Asynchronously start a session for the authenticated user.
1333 *
1334 * When the operation is finished, @callback will be invoked. You can then call lightdm_greeter_start_session_finish() to get the result of the operation.
1335 *
1336 * See lightdm_greeter_start_session_sync() for the synchronous version.
1337 **/
1338void
1339lightdm_greeter_start_session (LightDMGreeter *greeter, const gchar *session, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
1340{
1341 LightDMGreeterPrivate *priv;
1342 Request *request;
1343
1344 g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
1345
1346 priv = GET_PRIVATE (greeter);
1347
1348 send_start_session (greeter, session);
1349 request = request_new (cancellable, callback, user_data);
1350 priv->start_session_requests = g_list_append (priv->start_session_requests, request);
1351}
1352
1353/**
1354 * lightdm_greeter_start_session_finish:
1355 * @greeter: A #LightDMGreeter
1356 * @result: A #GAsyncResult.
1357 * @error: return location for a #GError, or %NULL
1358 *
1359 * Start a session for the authenticated user.
1360 *
1361 * Return value: TRUE if the session was started.
1362 **/
1363gboolean
1364lightdm_greeter_start_session_finish (LightDMGreeter *greeter, GAsyncResult *result, GError **error)
1365{
1366 g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), FALSE);
1367 return REQUEST (result)->return_code == 0;
1262}1368}
12631369
1264/**1370/**
@@ -1287,14 +1393,14 @@
12871393
1288 /* Read until the session is started */1394 /* Read until the session is started */
1289 send_start_session (greeter, session);1395 send_start_session (greeter, session);
1290 request = request_new ();1396 request = request_new (NULL, NULL, NULL);
1291 priv->start_session_requests = g_list_append (priv->start_session_requests, g_object_ref (request));1397 priv->start_session_requests = g_list_append (priv->start_session_requests, g_object_ref (request));
1292 do1398 do
1293 {1399 {
1294 guint8 *message;1400 guint8 *message;
1295 gsize message_length;1401 gsize message_length;
12961402
1297 message = read_message (greeter, &message_length, TRUE);1403 message = recv_message (greeter, &message_length, TRUE);
1298 if (!message)1404 if (!message)
1299 break;1405 break;
1300 handle_message (greeter, message, message_length);1406 handle_message (greeter, message, message_length);
@@ -1308,6 +1414,55 @@
1308}1414}
13091415
1310/**1416/**
1417 * lightdm_greeter_ensure_shared_data_dir:
1418 * @greeter: A #LightDMGreeter
1419 * @username: A username
1420 * @cancellable: (allow-none): A #GCancellable or %NULL.
1421 * @callback: (allow-none): A #GAsyncReadyCallback to call when completed or %NULL.
1422 * @user_data: (allow-none): data to pass to the @callback or %NULL.
1423 *
1424 * Ensure that a shared data dir for the given user is available. Both the
1425 * greeter user and @username will have write access to that folder. The
1426 * intention is that larger pieces of shared data would be stored there (files
1427 * that the greeter creates but wants to give to a user -- like camera
1428 * photos -- or files that the user creates but wants the greeter to
1429 * see -- like contact avatars).
1430 *
1431 * LightDM will automatically create these if the user actually logs in, so
1432 * greeters only need to call this method if they want to store something in
1433 * the directory themselves.
1434 **/
1435void
1436lightdm_greeter_ensure_shared_data_dir (LightDMGreeter *greeter, const gchar *username, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
1437{
1438 LightDMGreeterPrivate *priv;
1439 Request *request;
1440
1441 g_return_if_fail (LIGHTDM_IS_GREETER (greeter));
1442
1443 priv = GET_PRIVATE (greeter);
1444
1445 send_ensure_shared_data_dir (greeter, username);
1446 request = request_new (cancellable, callback, user_data);
1447 priv->ensure_shared_data_dir_requests = g_list_append (priv->ensure_shared_data_dir_requests, request);
1448}
1449
1450/**
1451 * lightdm_greeter_ensure_shared_data_dir_finish:
1452 * @result: A #GAsyncResult.
1453 * @greeter: A #LightDMGreeter
1454 *
1455 *
1456 * Return value: The path to the shared directory, free with g_free.
1457 **/
1458gchar *
1459lightdm_greeter_ensure_shared_data_dir_finish (LightDMGreeter *greeter, GAsyncResult *result)
1460{
1461 g_return_val_if_fail (LIGHTDM_IS_GREETER (greeter), NULL);
1462 return g_strdup (REQUEST (result)->dir);
1463}
1464
1465/**
1311 * lightdm_greeter_ensure_shared_data_dir_sync:1466 * lightdm_greeter_ensure_shared_data_dir_sync:
1312 * @greeter: A #LightDMGreeter1467 * @greeter: A #LightDMGreeter
1313 * @username: A username1468 * @username: A username
@@ -1323,7 +1478,7 @@
1323 * greeters only need to call this method if they want to store something in1478 * greeters only need to call this method if they want to store something in
1324 * the directory themselves.1479 * the directory themselves.
1325 *1480 *
1326 * Return value: The path to the shared directory, free with g_free1481 * Return value: The path to the shared directory, free with g_free.
1327 **/1482 **/
1328gchar *1483gchar *
1329lightdm_greeter_ensure_shared_data_dir_sync (LightDMGreeter *greeter, const gchar *username)1484lightdm_greeter_ensure_shared_data_dir_sync (LightDMGreeter *greeter, const gchar *username)
@@ -1340,14 +1495,14 @@
13401495
1341 /* Read until a response */1496 /* Read until a response */
1342 send_ensure_shared_data_dir (greeter, username);1497 send_ensure_shared_data_dir (greeter, username);
1343 request = request_new ();1498 request = request_new (NULL, NULL, NULL);
1344 priv->ensure_shared_data_dir_requests = g_list_append (priv->ensure_shared_data_dir_requests, g_object_ref (request));1499 priv->ensure_shared_data_dir_requests = g_list_append (priv->ensure_shared_data_dir_requests, g_object_ref (request));
1345 do1500 do
1346 {1501 {
1347 guint8 *message;1502 guint8 *message;
1348 gsize message_length;1503 gsize message_length;
13491504
1350 message = read_message (greeter, &message_length, TRUE);1505 message = recv_message (greeter, &message_length, TRUE);
1351 if (!message)1506 if (!message)
1352 break;1507 break;
1353 handle_message (greeter, message, message_length);1508 handle_message (greeter, message, message_length);
@@ -1364,9 +1519,29 @@
1364lightdm_greeter_init (LightDMGreeter *greeter)1519lightdm_greeter_init (LightDMGreeter *greeter)
1365{1520{
1366 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);1521 LightDMGreeterPrivate *priv = GET_PRIVATE (greeter);
1522 const gchar *fd;
13671523
1368 priv->read_buffer = g_malloc (HEADER_SIZE);1524 priv->read_buffer = g_malloc (HEADER_SIZE);
1369 priv->hints = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);1525 priv->hints = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
1526
1527 fd = g_getenv ("LIGHTDM_TO_SERVER_FD");
1528 if (fd)
1529 {
1530 priv->to_server_channel = g_io_channel_unix_new (atoi (fd));
1531 g_io_channel_set_encoding (priv->to_server_channel, NULL, NULL);
1532 }
1533 else
1534 g_warning ("No LIGHTDM_TO_SERVER_FD environment variable");
1535
1536 fd = g_getenv ("LIGHTDM_FROM_SERVER_FD");
1537 if (fd)
1538 {
1539 priv->from_server_channel = g_io_channel_unix_new (atoi (fd));
1540 g_io_channel_set_encoding (priv->from_server_channel, NULL, NULL);
1541 g_io_add_watch (priv->from_server_channel, G_IO_IN, from_server_cb, greeter);
1542 }
1543 else
1544 g_warning ("No LIGHTDM_FROM_SERVER_FD environment variable");
1370}1545}
13711546
1372static void1547static void
@@ -1699,6 +1874,8 @@
1699 Request *request = REQUEST (object);1874 Request *request = REQUEST (object);
17001875
1701 g_free (request->dir);1876 g_free (request->dir);
1877 if (request->cancellable)
1878 g_object_unref (request->cancellable);
17021879
1703 G_OBJECT_CLASS (request_parent_class)->finalize (object);1880 G_OBJECT_CLASS (request_parent_class)->finalize (object);
1704}1881}
@@ -1709,3 +1886,29 @@
1709 GObjectClass *object_class = G_OBJECT_CLASS (klass);1886 GObjectClass *object_class = G_OBJECT_CLASS (klass);
1710 object_class->finalize = request_finalize;1887 object_class->finalize = request_finalize;
1711}1888}
1889
1890static gpointer
1891request_get_user_data (GAsyncResult *result)
1892{
1893 return REQUEST (result)->user_data;
1894}
1895
1896static GObject *
1897request_get_source_object (GAsyncResult *res)
1898{
1899 return NULL;
1900}
1901
1902static gboolean
1903request_is_tagged (GAsyncResult *res, gpointer source_tag)
1904{
1905 return FALSE;
1906}
1907
1908static void
1909request_iface_init (GAsyncResultIface *iface)
1910{
1911 iface->get_user_data = request_get_user_data;
1912 iface->get_source_object = request_get_source_object;
1913 iface->is_tagged = request_is_tagged;
1914}
17121915
=== modified file 'liblightdm-gobject/liblightdm-gobject-1.vapi'
--- liblightdm-gobject/liblightdm-gobject-1.vapi 2014-04-08 00:32:13 +0000
+++ liblightdm-gobject/liblightdm-gobject-1.vapi 2014-04-29 01:26:07 +0000
@@ -24,6 +24,7 @@
24 public signal void authentication_complete ();24 public signal void authentication_complete ();
25 public signal void autologin_timer_expired ();25 public signal void autologin_timer_expired ();
2626
27 public async bool connect_sync () throws GLib.Error;
27 public bool connect_sync () throws GLib.Error;28 public bool connect_sync () throws GLib.Error;
28 public unowned string get_hint (string name);29 public unowned string get_hint (string name);
29 public unowned string default_session_hint { get; }30 public unowned string default_session_hint { get; }
@@ -47,7 +48,10 @@
47 public bool in_authentication { get; }48 public bool in_authentication { get; }
48 public bool is_authenticated { get; }49 public bool is_authenticated { get; }
49 public unowned string? authentication_user { get; }50 public unowned string? authentication_user { get; }
51 public async void start_session (string? session = null) throws GLib.Error;
50 public bool start_session_sync (string? session = null) throws GLib.Error;52 public bool start_session_sync (string? session = null) throws GLib.Error;
53 public async string ensure_shared_data_dir (string username);
54 public string ensure_shared_data_dir_sync (string username);
51 }55 }
52 [CCode (has_type_id = false)]56 [CCode (has_type_id = false)]
53 public enum MessageType {57 public enum MessageType {
5458
=== modified file 'liblightdm-gobject/lightdm/greeter.h'
--- liblightdm-gobject/lightdm/greeter.h 2014-04-28 20:56:28 +0000
+++ liblightdm-gobject/lightdm/greeter.h 2014-04-29 01:26:07 +0000
@@ -12,11 +12,12 @@
12#define LIGHTDM_GREETER_H_12#define LIGHTDM_GREETER_H_
1313
14#include <glib-object.h>14#include <glib-object.h>
15#include <gio/gio.h>
1516
16G_BEGIN_DECLS17G_BEGIN_DECLS
1718
18#define LIGHTDM_TYPE_GREETER (lightdm_greeter_get_type())19#define LIGHTDM_TYPE_GREETER (lightdm_greeter_get_type())
19#define LIGHTDM_GREETER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LIGHTDM_TYPE_GREETER, LightDMGreeter));20#define LIGHTDM_GREETER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), LIGHTDM_TYPE_GREETER, LightDMGreeter))
20#define LIGHTDM_GREETER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LIGHTDM_TYPE_GREETER, LightDMGreeterClass))21#define LIGHTDM_GREETER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), LIGHTDM_TYPE_GREETER, LightDMGreeterClass))
21#define LIGHTDM_IS_GREETER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LIGHTDM_TYPE_GREETER))22#define LIGHTDM_IS_GREETER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LIGHTDM_TYPE_GREETER))
22#define LIGHTDM_IS_GREETER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LIGHTDM_TYPE_GREETER))23#define LIGHTDM_IS_GREETER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LIGHTDM_TYPE_GREETER))
@@ -73,6 +74,10 @@
7374
74void lightdm_greeter_set_resettable (LightDMGreeter *greeter, gboolean resettable);75void lightdm_greeter_set_resettable (LightDMGreeter *greeter, gboolean resettable);
7576
77void lightdm_greeter_connect (LightDMGreeter *greeter, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data);
78
79gboolean lightdm_greeter_connect_finish (LightDMGreeter *greeter, GAsyncResult *result, GError **error);
80
76gboolean lightdm_greeter_connect_sync (LightDMGreeter *greeter, GError **error);81gboolean lightdm_greeter_connect_sync (LightDMGreeter *greeter, GError **error);
7782
78const gchar *lightdm_greeter_get_hint (LightDMGreeter *greeter, const gchar *name);83const gchar *lightdm_greeter_get_hint (LightDMGreeter *greeter, const gchar *name);
@@ -121,8 +126,16 @@
121126
122void lightdm_greeter_set_language (LightDMGreeter *greeter, const gchar *language);127void lightdm_greeter_set_language (LightDMGreeter *greeter, const gchar *language);
123128
129void lightdm_greeter_start_session (LightDMGreeter *greeter, const gchar *session, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data);
130
131gboolean lightdm_greeter_start_session_finish (LightDMGreeter *greeter, GAsyncResult *result, GError **error);
132
124gboolean lightdm_greeter_start_session_sync (LightDMGreeter *greeter, const gchar *session, GError **error);133gboolean lightdm_greeter_start_session_sync (LightDMGreeter *greeter, const gchar *session, GError **error);
125134
135void lightdm_greeter_ensure_shared_data_dir (LightDMGreeter *greeter, const gchar *username, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data);
136
137gchar *lightdm_greeter_ensure_shared_data_dir_finish (LightDMGreeter *greeter, GAsyncResult *result);
138
126gchar *lightdm_greeter_ensure_shared_data_dir_sync (LightDMGreeter *greeter, const gchar *username);139gchar *lightdm_greeter_ensure_shared_data_dir_sync (LightDMGreeter *greeter, const gchar *username);
127140
128G_END_DECLS141G_END_DECLS
129142
=== modified file 'tests/src/test-gobject-greeter.c'
--- tests/src/test-gobject-greeter.c 2014-04-28 20:56:28 +0000
+++ tests/src/test-gobject-greeter.c 2014-04-29 01:26:07 +0000
@@ -10,6 +10,7 @@
1010
11#include "status.h"11#include "status.h"
1212
13static int exit_code = EXIT_SUCCESS;
13static gchar *greeter_id;14static gchar *greeter_id;
14static GMainLoop *loop;15static GMainLoop *loop;
15static LightDMGreeter *greeter;16static LightDMGreeter *greeter;
@@ -103,6 +104,70 @@
103}104}
104105
105static void106static void
107start_session_finished (GObject *object, GAsyncResult *result, gpointer data)
108{
109 LightDMGreeter *greeter = LIGHTDM_GREETER (object);
110 GError *error = NULL;
111
112 if (!lightdm_greeter_start_session_finish (greeter, result, &error))
113 status_notify ("%s SESSION-FAILED", greeter_id);
114 g_clear_error (&error);
115}
116
117static void
118write_shared_data_finished (GObject *object, GAsyncResult *result, gpointer data)
119{
120 LightDMGreeter *greeter = LIGHTDM_GREETER (object);
121 gchar *dir, *path, *test_data;
122 FILE *f;
123
124 dir = lightdm_greeter_ensure_shared_data_dir_finish (greeter, result);
125 if (!dir)
126 {
127 status_notify ("%s WRITE-SHARED-DATA ERROR=NO_SHARED_DIR", greeter_id);
128 return;
129 }
130
131 path = g_build_filename (dir, "data", NULL);
132 test_data = data;
133 if (!(f = fopen (path, "w")) || fprintf (f, "%s", test_data) < 0)
134 status_notify ("%s WRITE-SHARED-DATA ERROR=%s", greeter_id, strerror (errno));
135 else
136 status_notify ("%s WRITE-SHARED-DATA RESULT=TRUE", greeter_id);
137 g_free (test_data);
138
139 if (f)
140 fclose (f);
141 g_free (path);
142 g_free (dir);
143}
144
145static void
146read_shared_data_finished (GObject *object, GAsyncResult *result, gpointer data)
147{
148 LightDMGreeter *greeter = LIGHTDM_GREETER (object);
149 gchar *dir, *path;
150 gchar *contents = NULL;
151 GError *error = NULL;
152
153 dir = lightdm_greeter_ensure_shared_data_dir_finish (greeter, result);
154 if (!dir)
155 {
156 status_notify ("%s READ-SHARED-DATA ERROR=NO_SHARED_DIR", greeter_id);
157 return;
158 }
159
160 path = g_build_filename (dir, "data", NULL);
161 if (g_file_get_contents (path, &contents, NULL, &error))
162 status_notify ("%s READ-SHARED-DATA DATA=%s", greeter_id, contents);
163 else
164 status_notify ("%s READ-SHARED-DATA ERROR=%s", greeter_id, error->message);
165 g_free (path);
166 g_free (contents);
167 g_clear_error (&error);
168}
169
170static void
106request_cb (const gchar *name, GHashTable *params)171request_cb (const gchar *name, GHashTable *params)
107{172{
108 if (!name)173 if (!name)
@@ -133,10 +198,7 @@
133 lightdm_greeter_cancel_authentication (greeter);198 lightdm_greeter_cancel_authentication (greeter);
134199
135 else if (strcmp (name, "START-SESSION") == 0)200 else if (strcmp (name, "START-SESSION") == 0)
136 {201 lightdm_greeter_start_session (greeter, g_hash_table_lookup (params, "SESSION"), NULL, start_session_finished, NULL);
137 if (!lightdm_greeter_start_session_sync (greeter, g_hash_table_lookup (params, "SESSION"), NULL))
138 status_notify ("%s SESSION-FAILED", greeter_id);
139 }
140202
141 else if (strcmp (name, "LOG-DEFAULT-SESSION") == 0)203 else if (strcmp (name, "LOG-DEFAULT-SESSION") == 0)
142 status_notify ("%s LOG-DEFAULT-SESSION SESSION=%s", greeter_id, lightdm_greeter_get_default_session_hint (greeter));204 status_notify ("%s LOG-DEFAULT-SESSION SESSION=%s", greeter_id, lightdm_greeter_get_default_session_hint (greeter));
@@ -146,56 +208,12 @@
146208
147 else if (strcmp (name, "WRITE-SHARED-DATA") == 0)209 else if (strcmp (name, "WRITE-SHARED-DATA") == 0)
148 {210 {
149 gchar *dir;211 const gchar *data = g_hash_table_lookup (params, "DATA");
150212 lightdm_greeter_ensure_shared_data_dir (greeter, g_hash_table_lookup (params, "USERNAME"), NULL, write_shared_data_finished, g_strdup (data));
151 dir = lightdm_greeter_ensure_shared_data_dir_sync (greeter, g_hash_table_lookup (params, "USERNAME"));
152 if (dir)
153 {
154 gchar *path;
155 FILE *f;
156
157 g_printerr ("dir='%s'\n", dir);
158
159 path = g_build_filename (dir, "data", NULL);
160 if (!(f = fopen (path, "w")) || fprintf (f, "%s", (const gchar *) g_hash_table_lookup (params, "DATA")) < 0)
161 status_notify ("%s WRITE-SHARED-DATA ERROR=%s", greeter_id, strerror (errno));
162 else
163 status_notify ("%s WRITE-SHARED-DATA RESULT=TRUE", greeter_id);
164
165 if (f)
166 fclose (f);
167 g_free (path);
168 g_free (dir);
169 }
170 else
171 status_notify ("%s WRITE-SHARED-DATA ERROR=NO_SHARED_DIR", greeter_id);
172 }213 }
173214
174 else if (strcmp (name, "READ-SHARED-DATA") == 0)215 else if (strcmp (name, "READ-SHARED-DATA") == 0)
175 {216 lightdm_greeter_ensure_shared_data_dir (greeter, g_hash_table_lookup (params, "USERNAME"), NULL, read_shared_data_finished, NULL);
176 gchar *dir;
177
178 dir = lightdm_greeter_ensure_shared_data_dir_sync (greeter, g_hash_table_lookup (params, "USERNAME"));
179 if (dir)
180 {
181 gchar *path;
182 gchar *contents = NULL;
183 GError *error = NULL;
184
185 g_printerr ("dir='%s'\n", dir);
186
187 path = g_build_filename (dir, "data", NULL);
188 if (g_file_get_contents (path, &contents, NULL, &error))
189 status_notify ("%s READ-SHARED-DATA DATA=%s", greeter_id, contents);
190 else
191 status_notify ("%s READ-SHARED-DATA ERROR=%s", greeter_id, error->message);
192 g_free (path);
193 g_free (contents);
194 g_clear_error (&error);
195 }
196 else
197 status_notify ("%s READ-SHARED-DATA ERROR=NO_SHARED_DIR", greeter_id);
198 }
199217
200 else if (strcmp (name, "WATCH-USER") == 0)218 else if (strcmp (name, "WATCH-USER") == 0)
201 {219 {
@@ -350,6 +368,25 @@
350 status_notify ("%s USER-REMOVED USERNAME=%s", greeter_id, lightdm_user_get_name (user));368 status_notify ("%s USER-REMOVED USERNAME=%s", greeter_id, lightdm_user_get_name (user));
351}369}
352370
371static void
372connect_finished (GObject *object, GAsyncResult *result, gpointer data)
373{
374 LightDMGreeter *greeter = LIGHTDM_GREETER (object);
375 GError *error = NULL;
376
377 if (!lightdm_greeter_connect_finish (greeter, result, &error))
378 {
379 status_notify ("%s FAIL-CONNECT-DAEMON", greeter_id);
380 exit_code = EXIT_FAILURE;
381 g_main_loop_quit (loop);
382 return;
383 }
384
385 status_notify ("%s CONNECTED-TO-DAEMON", greeter_id);
386
387 notify_hints (greeter);
388}
389
353int390int
354main (int argc, char **argv)391main (int argc, char **argv)
355{392{
@@ -444,17 +481,9 @@
444 }481 }
445482
446 status_notify ("%s CONNECT-TO-DAEMON", greeter_id);483 status_notify ("%s CONNECT-TO-DAEMON", greeter_id);
447 if (!lightdm_greeter_connect_sync (greeter, NULL))484 lightdm_greeter_connect (greeter, NULL, connect_finished, NULL);
448 {
449 status_notify ("%s FAIL-CONNECT-DAEMON", greeter_id);
450 return EXIT_FAILURE;
451 }
452
453 status_notify ("%s CONNECTED-TO-DAEMON", greeter_id);
454
455 notify_hints (greeter);
456485
457 g_main_loop_run (loop);486 g_main_loop_run (loop);
458487
459 return EXIT_SUCCESS;488 return exit_code;
460}489}

Subscribers

People subscribed via source and target branches