~unity8-desktop-session-team/indicator-session/indicator-session-using-upstart

« back to all changes in this revision

Viewing changes to src/backend-dbus/users.c

  • Committer: Charles Kerr
  • Date: 2013-06-25 16:16:34 UTC
  • mto: This revision was merged to the branch mainline in revision 399.
  • Revision ID: charles.kerr@canonical.com-20130625161634-ht9ef3n5s63rnmmr
in IndicatorSessionUsers, use the uid as the user's key. Users.ActivateUser is now green.

Show diffs side-by-side

added added

removed removed

Lines of Context:
53
53
****
54
54
***/
55
55
 
56
 
static const gchar *
57
 
get_public_key_for_uid (guint uid)
58
 
{
59
 
  static char buf[16];
60
 
  g_snprintf (buf, sizeof(buf), "%u", uid);
61
 
  return buf;
62
 
}
63
 
 
64
56
static void
65
57
emit_user_added (IndicatorSessionUsersDbus * self, guint uid)
66
58
{
67
 
  const gchar * const public_key = get_public_key_for_uid (uid);
68
 
  indicator_session_users_added (INDICATOR_SESSION_USERS(self), public_key);
 
59
  indicator_session_users_added (INDICATOR_SESSION_USERS(self), uid);
69
60
}
70
61
 
71
62
static void
72
63
emit_user_changed (IndicatorSessionUsersDbus * self, guint uid)
73
64
{
74
 
  const gchar * const public_key = get_public_key_for_uid (uid);
75
 
  indicator_session_users_changed (INDICATOR_SESSION_USERS(self), public_key);
 
65
  indicator_session_users_changed (INDICATOR_SESSION_USERS(self), uid);
76
66
}
77
67
 
78
68
static void
79
69
emit_user_removed (IndicatorSessionUsersDbus * self, guint uid)
80
70
{
81
 
  const gchar * const public_key = get_public_key_for_uid (uid);
82
 
  indicator_session_users_removed (INDICATOR_SESSION_USERS(self), public_key);
 
71
  indicator_session_users_removed (INDICATOR_SESSION_USERS(self), uid);
83
72
}
84
73
 
85
74
/***
124
113
set_logins (IndicatorSessionUsersDbus * self, GHashTable * logins)
125
114
{
126
115
  GHashTable * old_logins = self->priv->logins;
127
 
  gpointer key;
 
116
  gpointer uid;
128
117
  GHashTableIter iter;
129
118
 
130
119
  self->priv->logins = logins;
131
120
 
132
121
  /* fire 'user changed' event for users who logged out */
133
122
  g_hash_table_iter_init (&iter, old_logins);
134
 
  while ((g_hash_table_iter_next (&iter, &key, NULL)))
135
 
    if (!g_hash_table_contains (logins, key))
136
 
      emit_user_changed (self, GPOINTER_TO_INT(key));
 
123
  while ((g_hash_table_iter_next (&iter, &uid, NULL)))
 
124
    if (!g_hash_table_contains (logins, uid))
 
125
      emit_user_changed (self, GPOINTER_TO_UINT(uid));
137
126
 
138
127
  /* fire 'user changed' event for users who logged in */
139
128
  g_hash_table_iter_init (&iter, logins);
140
 
  while ((g_hash_table_iter_next (&iter, &key, NULL)))
141
 
    if (!g_hash_table_contains (old_logins, key))
142
 
      emit_user_changed (self, GPOINTER_TO_INT(key));
 
129
  while ((g_hash_table_iter_next (&iter, &uid, NULL)))
 
130
    if (!g_hash_table_contains (old_logins, uid))
 
131
      emit_user_changed (self, GPOINTER_TO_UINT(uid));
143
132
 
144
133
  g_hash_table_destroy (old_logins);
145
134
}
205
194
  return g_hash_table_lookup (p->uid_to_account, GUINT_TO_POINTER(uid));
206
195
}
207
196
 
208
 
static AccountsUser *
209
 
get_user_for_public_key (IndicatorSessionUsersDbus * self, const char * public_key)
210
 
{
211
 
  return get_user_for_uid (self, g_ascii_strtoull (public_key, NULL, 10));
212
 
}
213
 
 
214
197
/***
215
198
****  User Account Tracking
216
199
***/
520
503
 
521
504
/* switch to (or create) a session for the specified user */
522
505
static void
523
 
my_activate_user (IndicatorSessionUsers * users, const char * public_key)
 
506
my_activate_user (IndicatorSessionUsers * users, guint uid)
524
507
{
525
508
  IndicatorSessionUsersDbus * self = INDICATOR_SESSION_USERS_DBUS(users);
526
509
  priv_t * p = self->priv;
527
510
  AccountsUser * au;
528
511
  const char * username;
529
512
 
530
 
  au = get_user_for_public_key (self, public_key);
 
513
  au = get_user_for_uid (self, uid);
531
514
  username = au ? accounts_user_get_user_name (au) : NULL;
532
515
 
533
516
  if (!username)
534
517
    {
535
 
      g_warning ("%s %s can't find user for '%s'", G_STRLOC, G_STRFUNC, public_key);
 
518
      g_warning ("%s %s can't find user '%u'", G_STRLOC, G_STRFUNC, uid);
536
519
    }
537
520
  else
538
521
    {
556
539
  return INDICATOR_SESSION_USERS_DBUS(users)->priv->is_live;
557
540
}
558
541
 
559
 
/* get a list of public keys for the users that we know about */
560
 
static GStrv
561
 
my_get_keys (IndicatorSessionUsers * users)
 
542
/* get a list of our user ids */
 
543
static GList *
 
544
my_get_uids (IndicatorSessionUsers * users)
562
545
{
563
 
  int i;
564
546
  priv_t * p;
565
 
  gchar ** keys;
 
547
  GList * uids;
566
548
  GHashTableIter iter;
567
549
  gpointer uid;
568
550
  gpointer user;
569
 
  GHashTable * h;
570
551
 
571
552
  g_return_val_if_fail (INDICATOR_IS_SESSION_USERS_DBUS(users), NULL);
572
553
  p = INDICATOR_SESSION_USERS_DBUS (users)->priv;
573
554
 
574
 
  i = 0;
575
 
  h = p->uid_to_account;
576
 
  keys = g_new (gchar*, g_hash_table_size(h)+1);
577
 
  g_hash_table_iter_init (&iter, h);
 
555
  uids = NULL;
 
556
  g_hash_table_iter_init (&iter, p->uid_to_account);
578
557
  while (g_hash_table_iter_next (&iter, &uid, &user))
579
558
    if (!accounts_user_get_system_account (user))
580
 
      keys[i++] = g_strdup (get_public_key_for_uid ((guint)uid));
581
 
  keys[i] = NULL;
 
559
      uids = g_list_prepend (uids, uid);
582
560
 
583
 
  return keys;
 
561
  return uids;
584
562
}
585
563
 
586
564
/* build a new struct populated with info on the specified user */
587
565
static IndicatorSessionUser *
588
 
my_get_user (IndicatorSessionUsers * users, const gchar * public_key)
 
566
my_get_user (IndicatorSessionUsers * users, guint uid)
589
567
{
590
568
  IndicatorSessionUsersDbus * self = INDICATOR_SESSION_USERS_DBUS (users);
591
569
  priv_t * p = self->priv;
593
571
  AccountsUser * au;
594
572
 
595
573
  ret = NULL;
596
 
  au = get_user_for_public_key (self, public_key);
597
 
 
 
574
  au = get_user_for_uid (self, uid);
598
575
  if (au && !accounts_user_get_system_account(au))
599
576
    {
600
 
      const guint uid = accounts_user_get_uid (au);
 
577
      g_assert (uid == accounts_user_get_uid (au));
601
578
 
602
579
      ret = g_new0 (IndicatorSessionUser, 1);
603
580
      ret->uid = uid;
662
639
 
663
640
  users_class = INDICATOR_SESSION_USERS_CLASS (klass);
664
641
  users_class->is_live_session = my_is_live_session;
665
 
  users_class->get_keys = my_get_keys;
 
642
  users_class->get_uids = my_get_uids;
666
643
  users_class->get_user = my_get_user;
667
644
  users_class->activate_user = my_activate_user;
668
645