5309
|
1 /**
|
|
2 * @file user.c User functions
|
|
3 *
|
|
4 * gaim
|
|
5 *
|
|
6 * Copyright (C) 2003 Christian Hammond <chipx86@gnupdate.org>
|
|
7 *
|
|
8 * This program is free software; you can redistribute it and/or modify
|
|
9 * it under the terms of the GNU General Public License as published by
|
|
10 * the Free Software Foundation; either version 2 of the License, or
|
|
11 * (at your option) any later version.
|
|
12 *
|
|
13 * This program is distributed in the hope that it will be useful,
|
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
16 * GNU General Public License for more details.
|
|
17 *
|
|
18 * You should have received a copy of the GNU General Public License
|
|
19 * along with this program; if not, write to the Free Software
|
|
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
21 */
|
|
22 #include "msn.h"
|
|
23 #include "user.h"
|
|
24
|
|
25 MsnUser *
|
|
26 msn_user_new(MsnSession *session, const char *passport, const char *name)
|
|
27 {
|
|
28 MsnUser *user;
|
|
29
|
|
30 user = msn_users_find_with_passport(session->users, passport);
|
|
31
|
|
32 if (user != NULL) {
|
|
33 if (name != NULL)
|
|
34 msn_user_set_name(user, name);
|
|
35
|
|
36 msn_user_ref(user);
|
|
37
|
|
38 return user;
|
|
39 }
|
|
40
|
|
41 user = g_new0(MsnUser, 1);
|
|
42
|
|
43 user->session = session;
|
|
44
|
|
45 if (name != NULL)
|
|
46 msn_user_set_name(user, name);
|
|
47
|
|
48 msn_user_set_passport(user, passport);
|
|
49 msn_user_set_group_id(user, -1);
|
|
50
|
|
51 msn_users_add(session->users, user);
|
|
52
|
|
53 msn_user_ref(user);
|
|
54
|
|
55 return user;
|
|
56 }
|
|
57
|
|
58 void
|
|
59 msn_user_destroy(MsnUser *user)
|
|
60 {
|
|
61 g_return_if_fail(user != NULL);
|
|
62
|
|
63 if (user->ref_count > 0) {
|
|
64 msn_user_unref(user);
|
|
65
|
|
66 return;
|
|
67 }
|
|
68
|
|
69 if (user->session != NULL && user->session->users != NULL)
|
|
70 msn_users_remove(user->session->users, user);
|
|
71
|
|
72 if (user->passport != NULL)
|
|
73 g_free(user->passport);
|
|
74
|
|
75 if (user->name != NULL)
|
|
76 g_free(user->name);
|
|
77
|
|
78 g_free(user);
|
|
79 }
|
|
80
|
|
81 MsnUser *
|
|
82 msn_user_ref(MsnUser *user)
|
|
83 {
|
|
84 g_return_val_if_fail(user != NULL, NULL);
|
|
85
|
|
86 user->ref_count++;
|
|
87
|
|
88 return user;
|
|
89 }
|
|
90
|
|
91 MsnUser *
|
|
92 msn_user_unref(MsnUser *user)
|
|
93 {
|
|
94 g_return_val_if_fail(user != NULL, NULL);
|
|
95
|
|
96 if (user->ref_count <= 0)
|
|
97 return NULL;
|
|
98
|
|
99 user->ref_count--;
|
|
100
|
|
101 if (user->ref_count == 0) {
|
|
102 msn_user_destroy(user);
|
|
103
|
|
104 return NULL;
|
|
105 }
|
|
106
|
|
107 return user;
|
|
108 }
|
|
109
|
|
110 void
|
|
111 msn_user_set_passport(MsnUser *user, const char *passport)
|
|
112 {
|
|
113 g_return_if_fail(user != NULL);
|
|
114
|
|
115 if (user->passport != NULL)
|
|
116 g_free(user->passport);
|
|
117
|
|
118 user->passport = g_strdup(passport);
|
|
119 }
|
|
120
|
|
121 void
|
|
122 msn_user_set_name(MsnUser *user, const char *name)
|
|
123 {
|
|
124 g_return_if_fail(user != NULL);
|
|
125
|
|
126 if (user->name != NULL)
|
|
127 g_free(user->name);
|
|
128
|
|
129 user->name = g_strdup(name);
|
|
130 }
|
|
131
|
|
132 void
|
|
133 msn_user_set_group_id(MsnUser *user, int id)
|
|
134 {
|
|
135 g_return_if_fail(user != NULL);
|
|
136
|
|
137 user->group_id = id;
|
|
138 }
|
|
139
|
|
140 const char *
|
|
141 msn_user_get_passport(const MsnUser *user)
|
|
142 {
|
|
143 g_return_val_if_fail(user != NULL, NULL);
|
|
144
|
|
145 return user->passport;
|
|
146 }
|
|
147
|
|
148 const char *
|
|
149 msn_user_get_name(const MsnUser *user)
|
|
150 {
|
|
151 g_return_val_if_fail(user != NULL, NULL);
|
|
152
|
|
153 return user->name;
|
|
154 }
|
|
155
|
|
156 int
|
|
157 msn_user_get_group_id(const MsnUser *user)
|
|
158 {
|
|
159 g_return_val_if_fail(user != NULL, -1);
|
|
160
|
|
161 return user->group_id;
|
|
162 }
|
|
163
|
|
164 MsnUsers *
|
|
165 msn_users_new(void)
|
|
166 {
|
|
167 MsnUsers *users = g_new0(MsnUsers, 1);
|
|
168
|
|
169 return users;
|
|
170 }
|
|
171
|
|
172 void
|
|
173 msn_users_destroy(MsnUsers *users)
|
|
174 {
|
|
175 g_return_if_fail(users != NULL);
|
|
176
|
|
177 while (users->users != NULL)
|
|
178 msn_user_destroy(users->users->data);
|
|
179
|
|
180 /* See if we've leaked anybody. */
|
|
181 while (users->users != NULL) {
|
|
182 gaim_debug(GAIM_DEBUG_WARNING, "msn",
|
|
183 "Leaking user %s\n",
|
|
184 msn_user_get_passport(users->users->data));
|
|
185 }
|
|
186
|
|
187 g_free(users);
|
|
188 }
|
|
189
|
|
190 void
|
|
191 msn_users_add(MsnUsers *users, MsnUser *user)
|
|
192 {
|
|
193 g_return_if_fail(users != NULL);
|
|
194 g_return_if_fail(user != NULL);
|
|
195
|
|
196 users->users = g_list_append(users->users, user);
|
|
197 }
|
|
198
|
|
199 void
|
|
200 msn_users_remove(MsnUsers *users, MsnUser *user)
|
|
201 {
|
|
202 g_return_if_fail(users != NULL);
|
|
203 g_return_if_fail(user != NULL);
|
|
204
|
|
205 users->users = g_list_remove(users->users, user);
|
|
206 }
|
|
207
|
|
208 MsnUser *
|
|
209 msn_users_find_with_passport(MsnUsers *users, const char *passport)
|
|
210 {
|
|
211 GList *l;
|
|
212
|
|
213 g_return_val_if_fail(users != NULL, NULL);
|
|
214 g_return_val_if_fail(passport != NULL, NULL);
|
|
215
|
|
216 for (l = users->users; l != NULL; l = l->next) {
|
|
217 MsnUser *user = (MsnUser *)l->data;
|
|
218
|
|
219 if (user->passport != NULL &&
|
|
220 !g_ascii_strcasecmp(passport, user->passport)) {
|
|
221
|
|
222 return user;
|
|
223 }
|
|
224 }
|
|
225
|
|
226 return NULL;
|
|
227 }
|