Mercurial > pidgin
annotate src/protocols/msn/userlist.c @ 11638:3a05b53a589e
[gaim-migrate @ 13914]
Some bits'n'pieces:
A bunch of memory leak fixes
Fix newly created accounts to connect in the currently active global
status
Fix the modify account dialog to only show relevant user options etc.
Update sametime to use some more of the new status stuff, it still
needs more love though.
Some s/online/available/ for consistency across prpls
Fix a racyness in disconnecting connections that want to die (fixes
the Yahoo crash when signing on somewhere else)
Sorry if I caused any conflicts!
committer: Tailor Script <tailor@pidgin.im>
author | Stu Tomlinson <stu@nosnilmot.com> |
---|---|
date | Mon, 10 Oct 2005 17:59:48 +0000 |
parents | 45d54425dc65 |
children | e346a085bb4f |
rev | line source |
---|---|
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
1 /** |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
2 * @file userlist.c MSN user list support |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
3 * |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
4 * gaim |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
5 * |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
6 * Gaim is the legal property of its developers, whose names are too numerous |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
7 * to list here. Please refer to the COPYRIGHT file distributed with this |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
8 * source distribution. |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
9 * |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
10 * This program is free software; you can redistribute it and/or modify |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
11 * it under the terms of the GNU General Public License as published by |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
12 * the Free Software Foundation; either version 2 of the License, or |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
13 * (at your option) any later version. |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
14 * |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
15 * This program is distributed in the hope that it will be useful, |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
18 * GNU General Public License for more details. |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
19 * |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
20 * You should have received a copy of the GNU General Public License |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
21 * along with this program; if not, write to the Free Software |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
23 */ |
9193 | 24 #include "msn.h" |
25 #include "userlist.h" | |
26 | |
27 const char *lists[] = { "FL", "AL", "BL", "RL" }; | |
28 | |
29 typedef struct | |
30 { | |
31 GaimConnection *gc; | |
32 char *who; | |
33 | |
34 } MsnPermitAdd; | |
35 | |
36 /************************************************************************** | |
37 * Callbacks | |
38 **************************************************************************/ | |
39 static void | |
40 msn_accept_add_cb(MsnPermitAdd *pa) | |
41 { | |
42 if (g_list_find(gaim_connections_get_all(), pa->gc) != NULL) | |
43 { | |
44 MsnSession *session = pa->gc->proto_data; | |
45 MsnUserList *userlist = session->userlist; | |
46 | |
47 msn_userlist_add_buddy(userlist, pa->who, MSN_LIST_AL, NULL); | |
48 | |
49 /* TODO: This ask for the alias, right? */ | |
50 gaim_account_notify_added(pa->gc->account, NULL, pa->who, NULL, NULL); | |
51 } | |
52 | |
53 g_free(pa->who); | |
54 g_free(pa); | |
55 } | |
56 | |
57 static void | |
58 msn_cancel_add_cb(MsnPermitAdd *pa) | |
59 { | |
60 if (g_list_find(gaim_connections_get_all(), pa->gc) != NULL) | |
61 { | |
62 MsnSession *session = pa->gc->proto_data; | |
63 MsnUserList *userlist = session->userlist; | |
64 | |
65 msn_userlist_add_buddy(userlist, pa->who, MSN_LIST_BL, NULL); | |
66 } | |
67 | |
68 g_free(pa->who); | |
69 g_free(pa); | |
70 } | |
71 | |
72 static void | |
9976 | 73 got_new_entry(GaimConnection *gc, const char *passport, const char *friendly) |
9193 | 74 { |
75 MsnPermitAdd *pa; | |
10774 | 76 char *msg; |
9193 | 77 |
78 pa = g_new0(MsnPermitAdd, 1); | |
79 pa->who = g_strdup(passport); | |
80 pa->gc = gc; | |
81 | |
9210
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
82 if (friendly != NULL) |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
83 { |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
84 msg = g_strdup_printf( |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
85 _("The user %s (%s) wants to add %s to his or her " |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
86 "buddy list."), |
10774 | 87 passport, friendly, |
9210
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
88 gaim_account_get_username(gc->account)); |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
89 } |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
90 else |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
91 { |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
92 msg = g_strdup_printf( |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
93 _("The user %s wants to add %s to his or " |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
94 "her buddy list."), |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
95 passport, gaim_account_get_username(gc->account)); |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
96 } |
9193 | 97 |
9976 | 98 gaim_request_action(gc, NULL, msg, NULL, |
9948 | 99 GAIM_DEFAULT_ACTION_NONE, pa, 2, |
9193 | 100 _("Authorize"), G_CALLBACK(msn_accept_add_cb), |
101 _("Deny"), G_CALLBACK(msn_cancel_add_cb)); | |
102 | |
103 g_free(msg); | |
104 } | |
105 | |
106 /************************************************************************** | |
107 * Utility functions | |
108 **************************************************************************/ | |
109 | |
110 static gboolean | |
111 user_is_in_group(MsnUser *user, int group_id) | |
112 { | |
113 if (user == NULL) | |
114 return FALSE; | |
115 | |
116 if (group_id < 0) | |
117 return FALSE; | |
118 | |
119 if (g_list_find(user->group_ids, GINT_TO_POINTER(group_id))) | |
120 return TRUE; | |
121 | |
122 return FALSE; | |
123 } | |
124 | |
125 static gboolean | |
126 user_is_there(MsnUser *user, int list_id, int group_id) | |
127 { | |
128 int list_op; | |
129 | |
130 if (user == NULL) | |
131 return FALSE; | |
132 | |
133 list_op = 1 << list_id; | |
134 | |
135 if (!(user->list_op & list_op)) | |
136 return FALSE; | |
137 | |
138 if (list_id == MSN_LIST_FL) | |
139 { | |
140 if (group_id >= 0) | |
141 return user_is_in_group(user, group_id); | |
142 } | |
143 | |
144 return TRUE; | |
145 } | |
146 | |
147 static const char* | |
148 get_store_name(MsnUser *user) | |
149 { | |
150 const char *store_name; | |
151 | |
152 g_return_val_if_fail(user != NULL, NULL); | |
153 | |
10533 | 154 store_name = msn_user_get_store_name(user); |
155 | |
156 if (store_name != NULL) | |
157 store_name = gaim_url_encode(store_name); | |
158 else | |
159 store_name = msn_user_get_passport(user); | |
9193 | 160 |
10533 | 161 /* this might be a bit of a hack, but it should prevent notification server |
162 * disconnections for people who have buddies with insane friendly names | |
163 * who added you to their buddy list from being disconnected. Stu. */ | |
164 /* Shx: What? Isn't the store_name obtained from the server, and hence it's | |
165 * below the BUDDY_ALIAS_MAXLEN ? */ | |
166 /* Stu: yeah, that's why it's a bit of a hack, as you pointed out, we're | |
167 * probably decoding the incoming store_name wrong, or something. bleh. */ | |
168 | |
169 if (strlen(store_name) > BUDDY_ALIAS_MAXLEN) | |
170 store_name = msn_user_get_passport(user); | |
171 | |
172 return store_name; | |
9193 | 173 } |
174 | |
175 static void | |
176 msn_request_add_group(MsnUserList *userlist, const char *who, | |
177 const char *old_group_name, const char *new_group_name) | |
178 { | |
179 MsnCmdProc *cmdproc; | |
180 MsnTransaction *trans; | |
9218 | 181 MsnMoveBuddy *data; |
9193 | 182 |
183 cmdproc = userlist->session->notification->cmdproc; | |
9218 | 184 data = g_new0(MsnMoveBuddy, 1); |
9193 | 185 |
186 data->who = g_strdup(who); | |
187 | |
188 if (old_group_name) | |
189 data->old_group_name = g_strdup(old_group_name); | |
190 | |
10225 | 191 trans = msn_transaction_new(cmdproc, "ADG", "%s %d", |
9193 | 192 gaim_url_encode(new_group_name), |
193 0); | |
194 | |
195 msn_transaction_set_data(trans, data); | |
196 | |
197 msn_cmdproc_send_trans(cmdproc, trans); | |
198 } | |
199 | |
200 /************************************************************************** | |
201 * Server functions | |
202 **************************************************************************/ | |
203 | |
204 MsnListId | |
205 msn_get_list_id(const char *list) | |
206 { | |
207 if (list[0] == 'F') | |
208 return MSN_LIST_FL; | |
209 else if (list[0] == 'A') | |
210 return MSN_LIST_AL; | |
211 else if (list[0] == 'B') | |
212 return MSN_LIST_BL; | |
213 else if (list[0] == 'R') | |
214 return MSN_LIST_RL; | |
215 | |
216 return -1; | |
217 } | |
218 | |
219 void | |
220 msn_got_add_user(MsnSession *session, MsnUser *user, | |
221 MsnListId list_id, int group_id) | |
222 { | |
223 GaimAccount *account; | |
224 const char *passport; | |
225 const char *friendly; | |
226 | |
227 account = session->account; | |
228 | |
229 passport = msn_user_get_passport(user); | |
230 friendly = msn_user_get_friendly_name(user); | |
9197
ec417d2f9666
[gaim-migrate @ 9992]
Christian Hammond <chipx86@chipx86.com>
parents:
9196
diff
changeset
|
231 |
9193 | 232 if (list_id == MSN_LIST_FL) |
233 { | |
9861 | 234 GaimConnection *gc; |
235 | |
236 gc = gaim_account_get_connection(account); | |
9193 | 237 |
238 serv_got_alias(gc, passport, friendly); | |
239 | |
240 if (group_id >= 0) | |
241 { | |
242 msn_user_add_group_id(user, group_id); | |
243 } | |
244 else | |
245 { | |
246 /* session->sync->fl_users_count++; */ | |
247 } | |
248 } | |
249 else if (list_id == MSN_LIST_AL) | |
250 { | |
251 gaim_privacy_permit_add(account, passport, TRUE); | |
252 } | |
253 else if (list_id == MSN_LIST_BL) | |
254 { | |
255 gaim_privacy_deny_add(account, passport, TRUE); | |
256 } | |
257 else if (list_id == MSN_LIST_RL) | |
258 { | |
9861 | 259 GaimConnection *gc; |
11039
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
260 GaimConversation *convo; |
9861 | 261 |
262 gc = gaim_account_get_connection(account); | |
9193 | 263 |
264 gaim_debug_info("msn", | |
265 "%s has added you to his or her contact list.\n", | |
266 passport); | |
267 | |
11338 | 268 convo = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, passport, account); |
11039
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
269 if (convo) { |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
270 GaimBuddy *buddy; |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
271 char *msg; |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
272 |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
273 buddy = gaim_find_buddy(account, passport); |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
274 msg = g_strdup_printf( |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
275 _("%s has added you to his or her contact list."), |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
276 buddy ? gaim_buddy_get_contact_alias(buddy) : passport); |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
277 gaim_conv_im_write(GAIM_CONV_IM(convo), passport, msg, |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
278 GAIM_MESSAGE_SYSTEM, time(NULL)); |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
279 g_free(msg); |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
280 } |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
281 |
10583 | 282 if (!(user->list_op & (MSN_LIST_AL_OP | MSN_LIST_BL_OP))) |
9223
f46154d6de2b
[gaim-migrate @ 10019]
Christian Hammond <chipx86@chipx86.com>
parents:
9218
diff
changeset
|
283 { |
9193 | 284 got_new_entry(gc, passport, friendly); |
9223
f46154d6de2b
[gaim-migrate @ 10019]
Christian Hammond <chipx86@chipx86.com>
parents:
9218
diff
changeset
|
285 } |
9193 | 286 } |
287 | |
288 user->list_op |= (1 << list_id); | |
289 /* gaim_user_add_list_id (user, list_id); */ | |
290 } | |
291 | |
292 void | |
293 msn_got_rem_user(MsnSession *session, MsnUser *user, | |
294 MsnListId list_id, int group_id) | |
295 { | |
296 GaimAccount *account; | |
297 const char *passport; | |
298 | |
299 account = session->account; | |
300 | |
301 passport = msn_user_get_passport(user); | |
302 | |
303 if (list_id == MSN_LIST_FL) | |
304 { | |
305 /* TODO: When is the user totally removed? */ | |
306 if (group_id >= 0) | |
307 { | |
308 msn_user_remove_group_id(user, group_id); | |
309 return; | |
310 } | |
311 else | |
312 { | |
313 /* session->sync->fl_users_count--; */ | |
314 } | |
315 } | |
316 else if (list_id == MSN_LIST_AL) | |
317 { | |
318 gaim_privacy_permit_remove(account, passport, TRUE); | |
319 } | |
320 else if (list_id == MSN_LIST_BL) | |
321 { | |
322 gaim_privacy_deny_remove(account, passport, TRUE); | |
323 } | |
324 else if (list_id == MSN_LIST_RL) | |
325 { | |
11039
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
326 GaimConversation *convo; |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
327 |
9193 | 328 gaim_debug_info("msn", |
329 "%s has removed you from his or her contact list.\n", | |
330 passport); | |
11039
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
331 |
11338 | 332 convo = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, passport, account); |
11039
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
333 if (convo) { |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
334 GaimBuddy *buddy; |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
335 char *msg; |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
336 |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
337 buddy = gaim_find_buddy(account, passport); |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
338 msg = g_strdup_printf( |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
339 _("%s has removed you from his or her contact list."), |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
340 buddy ? gaim_buddy_get_contact_alias(buddy) : passport); |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
341 gaim_conv_im_write(GAIM_CONV_IM(convo), passport, msg, |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
342 GAIM_MESSAGE_SYSTEM, time(NULL)); |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
343 g_free(msg); |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
344 } |
9193 | 345 } |
346 | |
347 user->list_op &= ~(1 << list_id); | |
348 /* gaim_user_remove_list_id (user, list_id); */ | |
349 | |
350 if (user->list_op == 0) | |
351 { | |
352 gaim_debug_info("msn", "Buddy '%s' shall be deleted?.\n", | |
353 passport); | |
354 | |
355 } | |
356 } | |
357 | |
358 void | |
359 msn_got_lst_user(MsnSession *session, MsnUser *user, | |
360 int list_op, GSList *group_ids) | |
361 { | |
362 GaimConnection *gc; | |
363 GaimAccount *account; | |
364 const char *passport; | |
365 const char *store; | |
366 | |
367 account = session->account; | |
368 gc = gaim_account_get_connection(account); | |
369 | |
370 passport = msn_user_get_passport(user); | |
9211
74c81f56b0a5
[gaim-migrate @ 10006]
Christian Hammond <chipx86@chipx86.com>
parents:
9210
diff
changeset
|
371 store = msn_user_get_store_name(user); |
9193 | 372 |
373 if (list_op & MSN_LIST_FL_OP) | |
374 { | |
375 GSList *c; | |
376 for (c = group_ids; c != NULL; c = g_slist_next(c)) | |
377 { | |
378 int group_id; | |
379 group_id = GPOINTER_TO_INT(c->data); | |
380 msn_user_add_group_id(user, group_id); | |
381 } | |
382 | |
383 /* FIXME: It might be a real alias */ | |
384 /* serv_got_alias(gc, passport, store); */ | |
385 } | |
386 | |
387 if (list_op & MSN_LIST_AL_OP) | |
388 { | |
389 /* These are users who are allowed to see our status. */ | |
390 | |
391 if (g_slist_find_custom(account->deny, passport, | |
392 (GCompareFunc)strcmp)) | |
393 { | |
394 gaim_privacy_deny_remove(gc->account, passport, TRUE); | |
395 } | |
396 | |
397 gaim_privacy_permit_add(account, passport, TRUE); | |
398 } | |
399 | |
400 if (list_op & MSN_LIST_BL_OP) | |
401 { | |
402 /* These are users who are not allowed to see our status. */ | |
403 | |
404 if (g_slist_find_custom(account->permit, passport, | |
405 (GCompareFunc)strcmp)) | |
406 { | |
407 gaim_privacy_permit_remove(gc->account, passport, TRUE); | |
408 } | |
409 | |
410 gaim_privacy_deny_add(account, passport, TRUE); | |
411 } | |
412 | |
413 if (list_op & MSN_LIST_RL_OP) | |
414 { | |
415 /* These are users who have us on their contact list. */ | |
416 /* TODO: what does store name is when this happens? */ | |
417 | |
10583 | 418 if (!(list_op & (MSN_LIST_AL_OP | MSN_LIST_BL_OP))) |
9225
554ef91db2dd
[gaim-migrate @ 10021]
Christian Hammond <chipx86@chipx86.com>
parents:
9223
diff
changeset
|
419 { |
9193 | 420 got_new_entry(gc, passport, store); |
9225
554ef91db2dd
[gaim-migrate @ 10021]
Christian Hammond <chipx86@chipx86.com>
parents:
9223
diff
changeset
|
421 } |
9193 | 422 } |
423 | |
424 user->list_op = list_op; | |
425 } | |
426 | |
427 /************************************************************************** | |
428 * UserList functions | |
429 **************************************************************************/ | |
430 | |
431 MsnUserList* | |
432 msn_userlist_new(MsnSession *session) | |
433 { | |
434 MsnUserList *userlist; | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
435 |
9193 | 436 userlist = g_new0(MsnUserList, 1); |
437 | |
438 userlist->session = session; | |
9860 | 439 userlist->buddy_icon_requests = g_queue_new(); |
440 userlist->buddy_icon_window = 5; | |
9193 | 441 |
442 return userlist; | |
443 } | |
444 | |
445 void | |
446 msn_userlist_destroy(MsnUserList *userlist) | |
447 { | |
448 GList *l; | |
449 | |
450 for (l = userlist->users; l != NULL; l = l->next) | |
451 { | |
452 msn_user_destroy(l->data); | |
453 } | |
454 | |
455 g_list_free(userlist->users); | |
456 | |
457 for (l = userlist->groups; l != NULL; l = l->next) | |
458 { | |
459 msn_group_destroy(l->data); | |
460 } | |
461 | |
462 g_list_free(userlist->groups); | |
9895 | 463 |
464 g_queue_free(userlist->buddy_icon_requests); | |
9857 | 465 g_free(userlist); |
9193 | 466 } |
467 | |
468 void | |
469 msn_userlist_add_user(MsnUserList *userlist, MsnUser *user) | |
470 { | |
471 userlist->users = g_list_append(userlist->users, user); | |
472 } | |
473 | |
474 void | |
475 msn_userlist_remove_user(MsnUserList *userlist, MsnUser *user) | |
476 { | |
477 userlist->users = g_list_remove(userlist->users, user); | |
478 } | |
479 | |
480 MsnUser * | |
481 msn_userlist_find_user(MsnUserList *userlist, const char *passport) | |
482 { | |
483 GList *l; | |
484 | |
485 g_return_val_if_fail(passport != NULL, NULL); | |
486 | |
487 for (l = userlist->users; l != NULL; l = l->next) | |
488 { | |
489 MsnUser *user = (MsnUser *)l->data; | |
490 | |
491 g_return_val_if_fail(user->passport != NULL, NULL); | |
492 | |
493 if (!strcmp(passport, user->passport)) | |
494 return user; | |
495 } | |
496 | |
497 return NULL; | |
498 } | |
499 | |
500 void | |
501 msn_userlist_add_group(MsnUserList *userlist, MsnGroup *group) | |
502 { | |
503 userlist->groups = g_list_append(userlist->groups, group); | |
504 } | |
505 | |
506 void | |
507 msn_userlist_remove_group(MsnUserList *userlist, MsnGroup *group) | |
508 { | |
509 userlist->groups = g_list_remove(userlist->groups, group); | |
510 } | |
511 | |
512 MsnGroup * | |
513 msn_userlist_find_group_with_id(MsnUserList *userlist, int id) | |
514 { | |
515 GList *l; | |
516 | |
517 g_return_val_if_fail(userlist != NULL, NULL); | |
518 g_return_val_if_fail(id >= 0, NULL); | |
519 | |
520 for (l = userlist->groups; l != NULL; l = l->next) | |
521 { | |
522 MsnGroup *group = l->data; | |
523 | |
524 if (group->id == id) | |
525 return group; | |
526 } | |
527 | |
528 return NULL; | |
529 } | |
530 | |
531 MsnGroup * | |
532 msn_userlist_find_group_with_name(MsnUserList *userlist, const char *name) | |
533 { | |
534 GList *l; | |
535 | |
536 g_return_val_if_fail(userlist != NULL, NULL); | |
537 g_return_val_if_fail(name != NULL, NULL); | |
538 | |
539 for (l = userlist->groups; l != NULL; l = l->next) | |
540 { | |
541 MsnGroup *group = l->data; | |
542 | |
543 if ((group->name != NULL) && !g_ascii_strcasecmp(name, group->name)) | |
544 return group; | |
545 } | |
546 | |
547 return NULL; | |
548 } | |
549 | |
550 int | |
551 msn_userlist_find_group_id(MsnUserList *userlist, const char *group_name) | |
552 { | |
553 MsnGroup *group; | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
554 |
9193 | 555 group = msn_userlist_find_group_with_name(userlist, group_name); |
556 | |
557 if (group != NULL) | |
558 return msn_group_get_id(group); | |
559 else | |
560 return -1; | |
561 } | |
562 | |
563 const char * | |
564 msn_userlist_find_group_name(MsnUserList *userlist, int group_id) | |
565 { | |
566 MsnGroup *group; | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
567 |
9193 | 568 group = msn_userlist_find_group_with_id(userlist, group_id); |
569 | |
570 if (group != NULL) | |
571 return msn_group_get_name(group); | |
572 else | |
573 return NULL; | |
574 } | |
575 | |
576 void | |
577 msn_userlist_rename_group_id(MsnUserList *userlist, int group_id, | |
578 const char *new_name) | |
579 { | |
580 MsnGroup *group; | |
581 | |
582 group = msn_userlist_find_group_with_id(userlist, group_id); | |
583 | |
584 if (group != NULL) | |
585 msn_group_set_name(group, new_name); | |
586 } | |
587 | |
588 void | |
589 msn_userlist_remove_group_id(MsnUserList *userlist, int group_id) | |
590 { | |
591 MsnGroup *group; | |
592 | |
593 group = msn_userlist_find_group_with_id(userlist, group_id); | |
594 | |
595 if (group != NULL) | |
10533 | 596 { |
9193 | 597 msn_userlist_remove_group(userlist, group); |
10533 | 598 msn_group_destroy(group); |
599 } | |
9193 | 600 } |
601 | |
602 void | |
603 msn_userlist_rem_buddy(MsnUserList *userlist, | |
604 const char *who, int list_id, const char *group_name) | |
605 { | |
606 MsnUser *user; | |
607 int group_id; | |
608 const char *list; | |
609 | |
610 user = msn_userlist_find_user(userlist, who); | |
611 group_id = -1; | |
612 | |
613 if (group_name != NULL) | |
614 { | |
615 group_id = msn_userlist_find_group_id(userlist, group_name); | |
616 | |
617 if (group_id < 0) | |
618 { | |
619 /* Whoa, there is no such group. */ | |
620 gaim_debug_error("msn", "Group doesn't exist: %s\n", group_name); | |
621 return; | |
622 } | |
623 } | |
624 | |
625 /* First we're going to check if not there. */ | |
626 if (!(user_is_there(user, list_id, group_id))) | |
627 { | |
628 list = lists[list_id]; | |
629 gaim_debug_error("msn", "User '%s' is not there: %s\n", | |
630 who, list); | |
631 return; | |
632 } | |
633 | |
634 /* Then request the rem to the server. */ | |
635 list = lists[list_id]; | |
636 | |
637 msn_notification_rem_buddy(userlist->session->notification, list, who, group_id); | |
638 } | |
639 | |
640 void | |
641 msn_userlist_add_buddy(MsnUserList *userlist, | |
642 const char *who, int list_id, | |
643 const char *group_name) | |
644 { | |
645 MsnUser *user; | |
646 int group_id; | |
647 const char *list; | |
648 const char *store_name; | |
9194
364aa73323b5
[gaim-migrate @ 9989]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
649 |
9193 | 650 group_id = -1; |
651 | |
11057
e9eeacd1a8d0
[gaim-migrate @ 13009]
Richard Laager <rlaager@wiktel.com>
parents:
11039
diff
changeset
|
652 if (!gaim_email_is_valid(who)) |
e9eeacd1a8d0
[gaim-migrate @ 13009]
Richard Laager <rlaager@wiktel.com>
parents:
11039
diff
changeset
|
653 { |
11638 | 654 /* only notify the user about problems adding to the friends list |
655 * maybe we should do something else for other lists, but it probably | |
656 * won't cause too many problems if we just ignore it */ | |
657 if (list_id == MSN_LIST_FL) | |
658 { | |
659 char *str = g_strdup_printf(_("Unable to add \"%s\"."), who); | |
660 gaim_notify_error(NULL, NULL, str, | |
661 _("The screen name specified is invalid.")); | |
662 g_free(str); | |
663 } | |
664 | |
11057
e9eeacd1a8d0
[gaim-migrate @ 13009]
Richard Laager <rlaager@wiktel.com>
parents:
11039
diff
changeset
|
665 return; |
e9eeacd1a8d0
[gaim-migrate @ 13009]
Richard Laager <rlaager@wiktel.com>
parents:
11039
diff
changeset
|
666 } |
e9eeacd1a8d0
[gaim-migrate @ 13009]
Richard Laager <rlaager@wiktel.com>
parents:
11039
diff
changeset
|
667 |
9193 | 668 if (group_name != NULL) |
669 { | |
670 group_id = msn_userlist_find_group_id(userlist, group_name); | |
671 | |
672 if (group_id < 0) | |
673 { | |
674 /* Whoa, we must add that group first. */ | |
675 msn_request_add_group(userlist, who, NULL, group_name); | |
676 return; | |
677 } | |
678 } | |
679 | |
680 user = msn_userlist_find_user(userlist, who); | |
681 | |
9194
364aa73323b5
[gaim-migrate @ 9989]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
682 /* First we're going to check if it's already there. */ |
9193 | 683 if (user_is_there(user, list_id, group_id)) |
684 { | |
685 list = lists[list_id]; | |
9194
364aa73323b5
[gaim-migrate @ 9989]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
686 gaim_debug_error("msn", "User '%s' is already there: %s\n", who, list); |
9193 | 687 return; |
688 } | |
689 | |
690 store_name = (user != NULL) ? get_store_name(user) : who; | |
691 | |
692 /* Then request the add to the server. */ | |
693 list = lists[list_id]; | |
694 | |
695 msn_notification_add_buddy(userlist->session->notification, list, who, | |
696 store_name, group_id); | |
697 } | |
698 | |
699 void | |
700 msn_userlist_move_buddy(MsnUserList *userlist, const char *who, | |
701 const char *old_group_name, const char *new_group_name) | |
702 { | |
703 int new_group_id; | |
704 | |
705 new_group_id = msn_userlist_find_group_id(userlist, new_group_name); | |
706 | |
707 if (new_group_id < 0) | |
708 { | |
709 msn_request_add_group(userlist, who, old_group_name, new_group_name); | |
710 return; | |
711 } | |
712 | |
10568 | 713 msn_userlist_add_buddy(userlist, who, MSN_LIST_FL, new_group_name); |
9193 | 714 msn_userlist_rem_buddy(userlist, who, MSN_LIST_FL, old_group_name); |
715 } |