]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - tests/src/test-gobject-greeter.c
Merge with trunk
[sojka/lightdm.git] / tests / src / test-gobject-greeter.c
1 /* -*- Mode: C; indent-tabs-mode: nil; tab-width: 4 -*- */
2
3 #include <stdlib.h>
4 #include <stdio.h>
5 #include <string.h>
6 #include <xcb/xcb.h>
7 #include <lightdm.h>
8
9 #include "status.h"
10
11 static LightDMGreeter *greeter;
12 static xcb_connection_t *connection = NULL;
13 static GKeyFile *config;
14
15 static void
16 show_message_cb (LightDMGreeter *greeter, const gchar *text, LightDMMessageType type)
17 {
18     status_notify ("GREETER %s SHOW-MESSAGE TEXT=\"%s\"", getenv ("DISPLAY"), text);
19 }
20
21 static void
22 show_prompt_cb (LightDMGreeter *greeter, const gchar *text, LightDMPromptType type)
23 {
24     status_notify ("GREETER %s SHOW-PROMPT TEXT=\"%s\"", getenv ("DISPLAY"), text);
25 }
26
27 static void
28 authentication_complete_cb (LightDMGreeter *greeter)
29 {
30     if (lightdm_greeter_get_authentication_user (greeter))
31         status_notify ("GREETER %s AUTHENTICATION-COMPLETE USERNAME=%s AUTHENTICATED=%s",
32                        getenv ("DISPLAY"),
33                        lightdm_greeter_get_authentication_user (greeter),
34                        lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE");
35     else
36         status_notify ("GREETER %s AUTHENTICATION-COMPLETE AUTHENTICATED=%s",
37                        getenv ("DISPLAY"),
38                        lightdm_greeter_get_is_authenticated (greeter) ? "TRUE" : "FALSE");
39 }
40
41 static void
42 signal_cb (int signum)
43 {
44     status_notify ("GREETER %s TERMINATE SIGNAL=%d", getenv ("DISPLAY"), signum);
45     exit (EXIT_SUCCESS);
46 }
47
48 static void
49 request_cb (const gchar *request)
50 {
51     gchar *r;
52   
53     r = g_strdup_printf ("GREETER %s AUTHENTICATE", getenv ("DISPLAY"));
54     if (strcmp (request, r) == 0)
55         lightdm_greeter_authenticate (greeter, NULL);
56     g_free (r);
57
58     r = g_strdup_printf ("GREETER %s AUTHENTICATE USERNAME=", getenv ("DISPLAY"));
59     if (g_str_has_prefix (request, r))
60         lightdm_greeter_authenticate (greeter, request + strlen (r));
61     g_free (r);
62
63     r = g_strdup_printf ("GREETER %s AUTHENTICATE-GUEST", getenv ("DISPLAY"));
64     if (strcmp (request, r) == 0)
65         lightdm_greeter_authenticate_as_guest (greeter);
66     g_free (r);
67
68     r = g_strdup_printf ("GREETER %s RESPOND TEXT=\"", getenv ("DISPLAY"));
69     if (g_str_has_prefix (request, r))
70     {
71         gchar *text = g_strdup (request + strlen (r));
72         text[strlen (text) - 1] = '\0';
73         lightdm_greeter_respond (greeter, text);
74         g_free (text);
75     }
76     g_free (r);
77
78     r = g_strdup_printf ("GREETER %s START-SESSION", getenv ("DISPLAY"));
79     if (strcmp (request, r) == 0)
80     {
81         if (!lightdm_greeter_start_session_sync (greeter, NULL, NULL))
82             status_notify ("GREETER %s SESSION-FAILED", getenv ("DISPLAY")); 
83     }
84     g_free (r);
85
86     r = g_strdup_printf ("GREETER %s START-SESSION SESSION=", getenv ("DISPLAY"));
87     if (g_str_has_prefix (request, r))
88     {
89         if (!lightdm_greeter_start_session_sync (greeter, request + strlen (r), NULL))
90             status_notify ("GREETER %s SESSION-FAILED", getenv ("DISPLAY")); 
91     }
92     g_free (r);
93
94     r = g_strdup_printf ("GREETER %s LOG-LAYOUT USERNAME=", getenv ("DISPLAY"));
95     if (g_str_has_prefix (request, r))
96     {
97         LightDMUser *user;
98         const gchar *username, *layout;
99
100         username = request + strlen (r);
101
102         if (g_strcmp0 (username, "%DEFAULT%") == 0) /* Grab system default layout */
103             layout = lightdm_layout_get_name (lightdm_get_layout ());
104         else
105         {
106             user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
107             layout = lightdm_user_get_layout (user);
108         }
109
110         status_notify ("GREETER %s LOG-LAYOUT USERNAME=%s LAYOUT='%s'", getenv ("DISPLAY"), username, layout ? layout : "");
111     }
112     g_free (r);
113
114     r = g_strdup_printf ("GREETER %s LOG-VARIANTS LAYOUT=", getenv ("DISPLAY"));
115     if (g_str_has_prefix (request, r))
116     {
117         GList *layouts, *iter;
118         gchar *layout_prefix;
119
120         layout_prefix = request + strlen (r);
121         layouts = lightdm_get_layouts ();
122
123         for (iter = layouts; iter; iter = iter->next)
124         {
125             LightDMLayout *layout;
126             const gchar *name;
127
128             layout = (LightDMLayout *) iter->data;
129             name = lightdm_layout_get_name (layout);
130
131             if (g_str_has_prefix (name, layout_prefix))
132                 status_notify ("GREETER %s LOG-VARIANTS LAYOUT='%s'", getenv ("DISPLAY"), name);
133         }
134     }
135     g_free (r);
136
137     r = g_strdup_printf ("GREETER %s LOG-LANGUAGE USERNAME=", getenv ("DISPLAY"));  
138     if (g_str_has_prefix (request, r))
139     {
140         LightDMUser *user;
141         const gchar *username, *language;
142
143         username = request + strlen (r);
144         user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
145         language = lightdm_user_get_language (user);
146
147         status_notify ("GREETER %s LOG-LANGUAGE USERNAME=%s LANGUAGE=%s", getenv ("DISPLAY"), username, language ? language : "");
148     }
149     g_free (r);
150 }
151
152 int
153 main (int argc, char **argv)
154 {
155     GMainLoop *main_loop;
156
157     signal (SIGINT, signal_cb);
158     signal (SIGTERM, signal_cb);
159
160     g_type_init ();
161
162     main_loop = g_main_loop_new (NULL, FALSE);
163
164     status_connect (request_cb);
165
166     status_notify ("GREETER %s START", getenv ("DISPLAY"));
167
168     config = g_key_file_new ();
169     if (g_getenv ("LIGHTDM_TEST_CONFIG"))
170         g_key_file_load_from_file (config, g_getenv ("LIGHTDM_TEST_CONFIG"), G_KEY_FILE_NONE, NULL);
171
172     if (g_key_file_has_key (config, "test-greeter-config", "return-value", NULL))
173     {
174         int return_value = g_key_file_get_integer (config, "test-greeter-config", "return-value", NULL);
175         status_notify ("GREETER %s EXIT CODE=%d", getenv ("DISPLAY"), return_value);
176         return return_value;
177     }
178
179     connection = xcb_connect (NULL, NULL);
180
181     if (xcb_connection_has_error (connection))
182     {
183         status_notify ("GREETER %s FAIL-CONNECT-XSERVER", getenv ("DISPLAY"));
184         return EXIT_FAILURE;
185     }
186
187     status_notify ("GREETER %s CONNECT-XSERVER", getenv ("DISPLAY"));
188
189     greeter = lightdm_greeter_new ();
190     g_signal_connect (greeter, "show-message", G_CALLBACK (show_message_cb), NULL);
191     g_signal_connect (greeter, "show-prompt", G_CALLBACK (show_prompt_cb), NULL);
192     g_signal_connect (greeter, "authentication-complete", G_CALLBACK (authentication_complete_cb), NULL);
193
194     status_notify ("GREETER %s CONNECT-TO-DAEMON", getenv ("DISPLAY"));
195     if (!lightdm_greeter_connect_sync (greeter, NULL))
196     {
197         status_notify ("GREETER %s FAIL-CONNECT-DAEMON", getenv ("DISPLAY"));
198         return EXIT_FAILURE;
199     }
200
201     status_notify ("GREETER %s CONNECTED-TO-DAEMON", getenv ("DISPLAY"));
202
203     if (lightdm_greeter_get_select_user_hint (greeter))
204         status_notify ("GREETER %s SELECT-USER-HINT USERNAME=%s", getenv ("DISPLAY"), lightdm_greeter_get_select_user_hint (greeter));
205     if (lightdm_greeter_get_lock_hint (greeter))
206         status_notify ("GREETER %s LOCK-HINT", getenv ("DISPLAY"));
207
208     g_main_loop_run (main_loop);
209
210     return EXIT_SUCCESS;
211 }