~lightdm-team/lightdm/trunk

« back to all changes in this revision

Viewing changes to liblightdm-gobject/session.c

  • Committer: Robert Ancell
  • Date: 2012-08-29 21:27:02 UTC
  • mfrom: (1535.1.10 lightdm-remote-session)
  • Revision ID: robert.ancell@canonical.com-20120829212702-nlp22x6srcu0c6jj
Add remote sessions

Show diffs side-by-side

added added

removed removed

Lines of Context:
33
33
#define GET_PRIVATE(obj) G_TYPE_INSTANCE_GET_PRIVATE ((obj), LIGHTDM_TYPE_SESSION, LightDMSessionPrivate)
34
34
 
35
35
static gboolean have_sessions = FALSE;
36
 
static GList *sessions = NULL;
 
36
static GList *local_sessions = NULL;
 
37
static GList *remote_sessions = NULL;
37
38
 
38
39
static gint 
39
40
compare_session (gconstpointer a, gconstpointer b)
99
100
    if (!priv->comment)
100
101
        priv->comment = g_strdup ("");
101
102
 
102
 
    sessions = g_list_insert_sorted (sessions, session, compare_session);
103
 
 
104
103
    g_free (domain);
105
104
 
106
105
    return session;
107
106
}
108
107
 
109
 
static void
110
 
update_sessions (void)
 
108
static GList *
 
109
load_sessions (const gchar *sessions_dir)
111
110
{
112
111
    GDir *directory;
113
 
    gboolean result;
 
112
    GList *sessions = NULL;
114
113
    GError *error = NULL;
115
114
 
116
 
    GKeyFile *config_key_file = NULL;
117
 
    gchar *config_path = NULL;
118
 
    gchar *xsessions_dir = g_strdup (XSESSIONS_DIR);
119
 
 
120
 
    if (have_sessions)
121
 
        return;
122
 
 
123
 
    config_path = g_build_filename (CONFIG_DIR, "lightdm.conf", NULL);
124
 
    config_key_file = g_key_file_new ();
125
 
    result = g_key_file_load_from_file (config_key_file, config_path, G_KEY_FILE_NONE, &error);
126
 
    if (error)
127
 
        g_warning ("Failed to open configuration file: %s", error->message);
128
 
    g_clear_error (&error);
129
 
    if (result)
130
 
    {
131
 
        gchar *xd_value = g_key_file_get_string (config_key_file, "LightDM", "xsessions-directory", NULL);
132
 
        if (xd_value)
133
 
        {
134
 
            g_free (xsessions_dir);
135
 
            xsessions_dir = xd_value;
136
 
        }
137
 
    }
138
 
    g_key_file_free (config_key_file);
139
 
    g_free (config_path);
140
 
    
141
 
    directory = g_dir_open (xsessions_dir, 0, &error);
 
115
    directory = g_dir_open (sessions_dir, 0, &error);
142
116
    if (error)
143
117
        g_warning ("Failed to open sessions directory: %s", error->message);
144
118
    g_clear_error (&error);
145
119
    if (!directory)
146
 
    {
147
 
        g_free (xsessions_dir);
148
 
        return;
149
 
    }
 
120
        return NULL;
150
121
 
151
122
    while (TRUE)
152
123
    {
162
133
        if (!g_str_has_suffix (filename, ".desktop"))
163
134
            continue;
164
135
 
165
 
        path = g_build_filename (xsessions_dir, filename, NULL);
 
136
        path = g_build_filename (sessions_dir, filename, NULL);
166
137
 
167
138
        key_file = g_key_file_new ();
168
139
        result = g_key_file_load_from_file (key_file, path, G_KEY_FILE_NONE, &error);
178
149
            key = g_strndup (filename, strlen (filename) - strlen (".desktop"));
179
150
            session = load_session (key_file, key);
180
151
            if (session)
 
152
            {
181
153
                g_debug ("Loaded session %s (%s, %s)", path, GET_PRIVATE (session)->name, GET_PRIVATE (session)->comment);
 
154
                sessions = g_list_insert_sorted (sessions, session, compare_session);
 
155
            }
182
156
            else
183
157
                g_debug ("Ignoring session %s", path);
184
158
            g_free (key);
189
163
    }
190
164
 
191
165
    g_dir_close (directory);
 
166
  
 
167
    return sessions;
 
168
}
 
169
 
 
170
static void
 
171
update_sessions (void)
 
172
{
 
173
    GKeyFile *config_key_file = NULL;
 
174
    gchar *config_path = NULL;
 
175
    gchar *xsessions_dir;
 
176
    gchar *remote_sessions_dir;
 
177
    gboolean result;
 
178
    GError *error = NULL;
 
179
 
 
180
    if (have_sessions)
 
181
        return;
 
182
 
 
183
    xsessions_dir = g_strdup (XSESSIONS_DIR);
 
184
    remote_sessions_dir = g_strdup (REMOTE_SESSIONS_DIR);
 
185
 
 
186
    /* Use session directory from configuration */
 
187
    /* FIXME: This should be sent in the greeter connection */
 
188
    config_path = g_build_filename (CONFIG_DIR, "lightdm.conf", NULL);
 
189
    config_key_file = g_key_file_new ();
 
190
    result = g_key_file_load_from_file (config_key_file, config_path, G_KEY_FILE_NONE, &error);
 
191
    if (error)
 
192
        g_warning ("Failed to open configuration file: %s", error->message);
 
193
    g_clear_error (&error);
 
194
    if (result)
 
195
    {
 
196
        gchar *value;
 
197
      
 
198
        value = g_key_file_get_string (config_key_file, "LightDM", "xsessions-directory", NULL);
 
199
        if (value)
 
200
        {
 
201
            g_free (xsessions_dir);
 
202
            xsessions_dir = value;
 
203
        }
 
204
 
 
205
        value = g_key_file_get_string (config_key_file, "LightDM", "remote-sessions-directory", NULL);
 
206
        if (value)
 
207
        {
 
208
            g_free (remote_sessions_dir);
 
209
            remote_sessions_dir = value;
 
210
        }
 
211
    }
 
212
    g_key_file_free (config_key_file);
 
213
    g_free (config_path);
 
214
 
 
215
    local_sessions = load_sessions (xsessions_dir);
 
216
    remote_sessions = load_sessions (remote_sessions_dir);
 
217
 
192
218
    g_free (xsessions_dir);
 
219
    g_free (remote_sessions_dir);
193
220
 
194
221
    have_sessions = TRUE;
195
222
}
205
232
lightdm_get_sessions (void)
206
233
{
207
234
    update_sessions ();
208
 
    return sessions;
 
235
    return local_sessions;
 
236
}
 
237
 
 
238
/**
 
239
 * lightdm_get_remote_sessions:
 
240
 *
 
241
 * Get the available remote sessions.
 
242
 *
 
243
 * Return value: (element-type LightDMSession) (transfer none): A list of #LightDMSession
 
244
 **/
 
245
GList *
 
246
lightdm_get_remote_sessions (void)
 
247
{
 
248
    update_sessions ();
 
249
    return remote_sessions;
209
250
}
210
251
 
211
252
/**