2
* Copyright 2013 Canonical Ltd.
5
* Charles Kerr <charles.kerr@canonical.com>
7
* This program is free software: you can redistribute it and/or modify it
8
* under the terms of the GNU General Public License version 3, as published
9
* by the Free Software Foundation.
11
* This program is distributed in the hope that it will be useful, but
12
* WITHOUT ANY WARRANTY; without even the implied warranties of
13
* MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
14
* PURPOSE. See the GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License along
17
* with this program. If not, see <http://www.gnu.org/licenses/>.
24
struct _IndicatorSessionGuestDbusPriv
26
GCancellable * cancellable;
28
Login1Manager * login1_manager;
29
Login1Seat * login1_seat;
30
DisplayManagerSeat * dm_seat;
32
gboolean guest_is_active;
33
gboolean guest_is_logged_in;
34
gboolean guest_is_allowed;
37
typedef IndicatorSessionGuestDbusPriv priv_t;
39
G_DEFINE_TYPE (IndicatorSessionGuestDbus,
40
indicator_session_guest_dbus,
41
INDICATOR_TYPE_SESSION_GUEST)
48
set_guest_is_allowed_flag (IndicatorSessionGuestDbus * self, gboolean b)
50
priv_t * p = self->priv;
52
if (p->guest_is_allowed != b)
54
p->guest_is_allowed = b;
56
indicator_session_guest_notify_allowed (INDICATOR_SESSION_GUEST (self));
61
set_guest_is_logged_in_flag (IndicatorSessionGuestDbus * self, gboolean b)
63
priv_t * p = self->priv;
65
if (p->guest_is_logged_in != b)
67
p->guest_is_logged_in = b;
69
indicator_session_guest_notify_logged_in (INDICATOR_SESSION_GUEST (self));
74
set_guest_is_active_flag (IndicatorSessionGuestDbus * self, gboolean b)
76
priv_t * p = self->priv;
78
if (p->guest_is_active != b)
80
p->guest_is_active = b;
82
indicator_session_guest_notify_active (INDICATOR_SESSION_GUEST(self));
90
/* walk the sessions to see if guest is logged in or active */
92
on_login1_manager_session_list_ready (GObject * o,
101
login1_manager_call_list_sessions_finish (LOGIN1_MANAGER(o),
107
if (!g_error_matches (err, G_IO_ERROR, G_IO_ERROR_CANCELLED))
108
g_warning ("%s: %s", G_STRFUNC, err->message);
114
const gchar * const current_seat_id = g_getenv ("XDG_SEAT");
115
const gchar * const current_session_id = g_getenv ("XDG_SESSION_ID");
116
gboolean is_logged_in = FALSE;
117
gboolean is_active = FALSE;
118
const gchar * session_id = NULL;
120
const gchar * user_name = NULL;
121
const gchar * seat_id = NULL;
124
g_variant_iter_init (&iter, sessions);
125
while (g_variant_iter_loop (&iter, "(&su&s&so)", &session_id,
131
gboolean is_current_session;
134
is_current_session = !g_strcmp0 (current_seat_id, seat_id)
135
&& !g_strcmp0 (current_session_id, session_id);
137
is_guest = g_str_has_prefix (user_name, "guest-")
144
is_active = is_current_session;
148
set_guest_is_logged_in_flag (gself, is_logged_in);
149
set_guest_is_active_flag (gself, is_active);
151
g_variant_unref (sessions);
156
update_session_list (IndicatorSessionGuestDbus * self)
158
priv_t * p = self->priv;
160
if (p->login1_manager != NULL)
162
login1_manager_call_list_sessions (p->login1_manager,
164
on_login1_manager_session_list_ready,
170
set_login1_manager (IndicatorSessionGuestDbus * self,
171
Login1Manager * login1_manager)
173
priv_t * p = self->priv;
175
if (p->login1_manager != NULL)
177
g_signal_handlers_disconnect_by_data (p->login1_manager, self);
179
g_clear_object (&p->login1_manager);
182
if (login1_manager != NULL)
184
p->login1_manager = g_object_ref (login1_manager);
186
g_signal_connect_swapped (login1_manager, "session-new",
187
G_CALLBACK(update_session_list), self);
188
g_signal_connect_swapped (login1_manager, "session-removed",
189
G_CALLBACK(update_session_list), self);
190
update_session_list (self);
195
set_login1_seat (IndicatorSessionGuestDbus * self,
196
Login1Seat * login1_seat)
198
priv_t * p = self->priv;
200
if (p->login1_seat != NULL)
202
g_signal_handlers_disconnect_by_data (p->login1_seat, self);
203
g_clear_object (&p->login1_seat);
206
if (login1_seat != NULL)
208
p->login1_seat = g_object_ref (login1_seat);
210
g_signal_connect_swapped (login1_seat, "notify::active-session",
211
G_CALLBACK(update_session_list), self);
212
update_session_list (self);
221
on_switch_to_guest_done (GObject * o,
223
gpointer unused G_GNUC_UNUSED)
228
display_manager_seat_call_switch_to_guest_finish (DISPLAY_MANAGER_SEAT(o),
233
if (!g_error_matches (err, G_IO_ERROR, G_IO_ERROR_CANCELLED))
234
g_warning ("%s %s: %s", G_STRLOC, G_STRFUNC, err->message);
241
my_switch_to_guest (IndicatorSessionGuest * guest)
243
IndicatorSessionGuestDbus * self = INDICATOR_SESSION_GUEST_DBUS(guest);
245
g_return_if_fail (self != NULL);
246
g_return_if_fail (self->priv->dm_seat != NULL);
248
display_manager_seat_call_switch_to_guest (self->priv->dm_seat,
250
self->priv->cancellable,
251
on_switch_to_guest_done,
256
on_notify_has_guest_account (DisplayManagerSeat * dm_seat,
257
GParamSpec * pspec G_GNUC_UNUSED,
258
IndicatorSessionGuestDbus * self)
260
gboolean guest_exists = display_manager_seat_get_has_guest_account (dm_seat);
261
set_guest_is_allowed_flag (self, guest_exists);
265
set_display_manager_seat (IndicatorSessionGuestDbus * self,
266
DisplayManagerSeat * dm_seat)
268
priv_t * p = self->priv;
270
if (p->dm_seat != NULL)
272
g_signal_handlers_disconnect_by_data (p->dm_seat, self);
274
g_clear_object (&p->dm_seat);
279
p->dm_seat = g_object_ref (dm_seat);
281
g_signal_connect (dm_seat, "notify::has-guest-account",
282
G_CALLBACK(on_notify_has_guest_account), self);
283
on_notify_has_guest_account (dm_seat, NULL, self);
288
**** IndiatorSessionGuest Virtual Functions
292
my_is_allowed (IndicatorSessionGuest * self)
294
g_return_val_if_fail (INDICATOR_IS_SESSION_GUEST_DBUS(self), FALSE);
296
return INDICATOR_SESSION_GUEST_DBUS(self)->priv->guest_is_allowed;
300
my_is_logged_in (IndicatorSessionGuest * self)
302
g_return_val_if_fail (INDICATOR_IS_SESSION_GUEST_DBUS(self), FALSE);
304
return INDICATOR_SESSION_GUEST_DBUS(self)->priv->guest_is_logged_in;
308
my_is_active (IndicatorSessionGuest * self)
310
g_return_val_if_fail (INDICATOR_IS_SESSION_GUEST_DBUS(self), FALSE);
312
return INDICATOR_SESSION_GUEST_DBUS(self)->priv->guest_is_active;
316
**** GObject Virtual Functions
320
my_dispose (GObject * o)
322
IndicatorSessionGuestDbus * self = INDICATOR_SESSION_GUEST_DBUS (o);
324
if (self->priv->cancellable != NULL)
326
g_cancellable_cancel (self->priv->cancellable);
327
g_clear_object (&self->priv->cancellable);
330
set_login1_seat (self, NULL);
331
set_login1_manager (self, NULL);
332
set_display_manager_seat (self, NULL);
334
G_OBJECT_CLASS (indicator_session_guest_dbus_parent_class)->dispose (o);
342
indicator_session_guest_dbus_class_init (IndicatorSessionGuestDbusClass * klass)
344
GObjectClass * object_class;
345
IndicatorSessionGuestClass * guest_class;
347
object_class = G_OBJECT_CLASS (klass);
348
object_class->dispose = my_dispose;
350
guest_class = INDICATOR_SESSION_GUEST_CLASS (klass);
351
guest_class->is_allowed = my_is_allowed;
352
guest_class->is_logged_in = my_is_logged_in;
353
guest_class->is_active = my_is_active;
354
guest_class->switch_to_guest = my_switch_to_guest;
356
g_type_class_add_private (klass, sizeof (IndicatorSessionGuestDbusPriv));
360
indicator_session_guest_dbus_init (IndicatorSessionGuestDbus * self)
364
p = G_TYPE_INSTANCE_GET_PRIVATE (self,
365
INDICATOR_TYPE_SESSION_GUEST_DBUS,
366
IndicatorSessionGuestDbusPriv);
367
p->cancellable = g_cancellable_new ();
375
IndicatorSessionGuest *
376
indicator_session_guest_dbus_new (void)
378
gpointer o = g_object_new (INDICATOR_TYPE_SESSION_GUEST_DBUS, NULL);
380
return INDICATOR_SESSION_GUEST (o);
384
indicator_session_guest_dbus_set_proxies (IndicatorSessionGuestDbus * self,
385
Login1Manager * login1_manager,
386
Login1Seat * login1_seat,
387
DisplayManagerSeat * dm_seat)
389
g_return_if_fail (INDICATOR_IS_SESSION_GUEST_DBUS(self));
391
set_login1_manager (self, login1_manager);
392
set_login1_seat (self, login1_seat);
393
set_display_manager_seat (self, dm_seat);