Mercurial > pidgin.yaz
annotate src/protocols/msn/userlist.c @ 10583:a4c6f8deac96
[gaim-migrate @ 11985]
Fix for adding MSN buddies to your buddy list, then not being notified
that they added you to their list, resulting in them not seeing your status
because they don't get added to either the allow or the block list. This bug
existed for a while, but only recently did reporters with enough clue to
describe how to reproduce it appear.
committer: Tailor Script <tailor@pidgin.im>
author | Stu Tomlinson <stu@nosnilmot.com> |
---|---|
date | Wed, 09 Feb 2005 14:20:05 +0000 |
parents | fed2a7c2471d |
children | d83f745c997b |
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; | |
10225 | 76 char *msg, *escaped; |
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 { |
10225 | 84 escaped = g_markup_escape_text(friendly, -1); |
9210
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
85 msg = g_strdup_printf( |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
86 _("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
|
87 "buddy list."), |
10225 | 88 passport, escaped, |
9210
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
89 gaim_account_get_username(gc->account)); |
10225 | 90 g_free(escaped); |
9210
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 else |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
93 { |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
94 msg = g_strdup_printf( |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
95 _("The user %s wants to add %s to his or " |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
96 "her buddy list."), |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
97 passport, gaim_account_get_username(gc->account)); |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
98 } |
9193 | 99 |
9976 | 100 gaim_request_action(gc, NULL, msg, NULL, |
9948 | 101 GAIM_DEFAULT_ACTION_NONE, pa, 2, |
9193 | 102 _("Authorize"), G_CALLBACK(msn_accept_add_cb), |
103 _("Deny"), G_CALLBACK(msn_cancel_add_cb)); | |
104 | |
105 g_free(msg); | |
106 } | |
107 | |
108 /************************************************************************** | |
109 * Utility functions | |
110 **************************************************************************/ | |
111 | |
112 static gboolean | |
113 user_is_in_group(MsnUser *user, int group_id) | |
114 { | |
115 if (user == NULL) | |
116 return FALSE; | |
117 | |
118 if (group_id < 0) | |
119 return FALSE; | |
120 | |
121 if (g_list_find(user->group_ids, GINT_TO_POINTER(group_id))) | |
122 return TRUE; | |
123 | |
124 return FALSE; | |
125 } | |
126 | |
127 static gboolean | |
128 user_is_there(MsnUser *user, int list_id, int group_id) | |
129 { | |
130 int list_op; | |
131 | |
132 if (user == NULL) | |
133 return FALSE; | |
134 | |
135 list_op = 1 << list_id; | |
136 | |
137 if (!(user->list_op & list_op)) | |
138 return FALSE; | |
139 | |
140 if (list_id == MSN_LIST_FL) | |
141 { | |
142 if (group_id >= 0) | |
143 return user_is_in_group(user, group_id); | |
144 } | |
145 | |
146 return TRUE; | |
147 } | |
148 | |
149 static const char* | |
150 get_store_name(MsnUser *user) | |
151 { | |
152 const char *store_name; | |
153 | |
154 g_return_val_if_fail(user != NULL, NULL); | |
155 | |
10533 | 156 store_name = msn_user_get_store_name(user); |
157 | |
158 if (store_name != NULL) | |
159 store_name = gaim_url_encode(store_name); | |
160 else | |
161 store_name = msn_user_get_passport(user); | |
9193 | 162 |
10533 | 163 /* this might be a bit of a hack, but it should prevent notification server |
164 * disconnections for people who have buddies with insane friendly names | |
165 * who added you to their buddy list from being disconnected. Stu. */ | |
166 /* Shx: What? Isn't the store_name obtained from the server, and hence it's | |
167 * below the BUDDY_ALIAS_MAXLEN ? */ | |
168 /* Stu: yeah, that's why it's a bit of a hack, as you pointed out, we're | |
169 * probably decoding the incoming store_name wrong, or something. bleh. */ | |
170 | |
171 if (strlen(store_name) > BUDDY_ALIAS_MAXLEN) | |
172 store_name = msn_user_get_passport(user); | |
173 | |
174 return store_name; | |
9193 | 175 } |
176 | |
177 static void | |
178 msn_request_add_group(MsnUserList *userlist, const char *who, | |
179 const char *old_group_name, const char *new_group_name) | |
180 { | |
181 MsnCmdProc *cmdproc; | |
182 MsnTransaction *trans; | |
9218 | 183 MsnMoveBuddy *data; |
9193 | 184 |
185 cmdproc = userlist->session->notification->cmdproc; | |
9218 | 186 data = g_new0(MsnMoveBuddy, 1); |
9193 | 187 |
188 data->who = g_strdup(who); | |
189 | |
190 if (old_group_name) | |
191 data->old_group_name = g_strdup(old_group_name); | |
192 | |
10225 | 193 trans = msn_transaction_new(cmdproc, "ADG", "%s %d", |
9193 | 194 gaim_url_encode(new_group_name), |
195 0); | |
196 | |
197 msn_transaction_set_data(trans, data); | |
198 | |
199 msn_cmdproc_send_trans(cmdproc, trans); | |
200 } | |
201 | |
202 /************************************************************************** | |
203 * Server functions | |
204 **************************************************************************/ | |
205 | |
206 MsnListId | |
207 msn_get_list_id(const char *list) | |
208 { | |
209 if (list[0] == 'F') | |
210 return MSN_LIST_FL; | |
211 else if (list[0] == 'A') | |
212 return MSN_LIST_AL; | |
213 else if (list[0] == 'B') | |
214 return MSN_LIST_BL; | |
215 else if (list[0] == 'R') | |
216 return MSN_LIST_RL; | |
217 | |
218 return -1; | |
219 } | |
220 | |
221 void | |
222 msn_got_add_user(MsnSession *session, MsnUser *user, | |
223 MsnListId list_id, int group_id) | |
224 { | |
225 GaimAccount *account; | |
226 const char *passport; | |
227 const char *friendly; | |
228 | |
229 account = session->account; | |
230 | |
231 passport = msn_user_get_passport(user); | |
232 friendly = msn_user_get_friendly_name(user); | |
9197
ec417d2f9666
[gaim-migrate @ 9992]
Christian Hammond <chipx86@chipx86.com>
parents:
9196
diff
changeset
|
233 |
9193 | 234 if (list_id == MSN_LIST_FL) |
235 { | |
9861 | 236 GaimConnection *gc; |
237 | |
238 gc = gaim_account_get_connection(account); | |
9193 | 239 |
240 serv_got_alias(gc, passport, friendly); | |
241 | |
242 if (group_id >= 0) | |
243 { | |
244 msn_user_add_group_id(user, group_id); | |
245 return; | |
246 } | |
247 else | |
248 { | |
249 /* session->sync->fl_users_count++; */ | |
250 } | |
251 } | |
252 else if (list_id == MSN_LIST_AL) | |
253 { | |
254 gaim_privacy_permit_add(account, passport, TRUE); | |
255 } | |
256 else if (list_id == MSN_LIST_BL) | |
257 { | |
258 gaim_privacy_deny_add(account, passport, TRUE); | |
259 } | |
260 else if (list_id == MSN_LIST_RL) | |
261 { | |
9861 | 262 GaimConnection *gc; |
263 | |
264 gc = gaim_account_get_connection(account); | |
9193 | 265 |
266 gaim_debug_info("msn", | |
267 "%s has added you to his or her contact list.\n", | |
268 passport); | |
269 | |
10583 | 270 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
|
271 { |
9193 | 272 got_new_entry(gc, passport, friendly); |
9223
f46154d6de2b
[gaim-migrate @ 10019]
Christian Hammond <chipx86@chipx86.com>
parents:
9218
diff
changeset
|
273 } |
9193 | 274 } |
275 | |
276 user->list_op |= (1 << list_id); | |
277 /* gaim_user_add_list_id (user, list_id); */ | |
278 } | |
279 | |
280 void | |
281 msn_got_rem_user(MsnSession *session, MsnUser *user, | |
282 MsnListId list_id, int group_id) | |
283 { | |
284 GaimAccount *account; | |
285 const char *passport; | |
286 | |
287 account = session->account; | |
288 | |
289 passport = msn_user_get_passport(user); | |
290 | |
291 if (list_id == MSN_LIST_FL) | |
292 { | |
293 /* TODO: When is the user totally removed? */ | |
294 if (group_id >= 0) | |
295 { | |
296 msn_user_remove_group_id(user, group_id); | |
297 return; | |
298 } | |
299 else | |
300 { | |
301 /* session->sync->fl_users_count--; */ | |
302 } | |
303 } | |
304 else if (list_id == MSN_LIST_AL) | |
305 { | |
306 gaim_privacy_permit_remove(account, passport, TRUE); | |
307 } | |
308 else if (list_id == MSN_LIST_BL) | |
309 { | |
310 gaim_privacy_deny_remove(account, passport, TRUE); | |
311 } | |
312 else if (list_id == MSN_LIST_RL) | |
313 { | |
314 gaim_debug_info("msn", | |
315 "%s has removed you from his or her contact list.\n", | |
316 passport); | |
317 } | |
318 | |
319 user->list_op &= ~(1 << list_id); | |
320 /* gaim_user_remove_list_id (user, list_id); */ | |
321 | |
322 if (user->list_op == 0) | |
323 { | |
324 gaim_debug_info("msn", "Buddy '%s' shall be deleted?.\n", | |
325 passport); | |
326 | |
327 } | |
328 } | |
329 | |
330 void | |
331 msn_got_lst_user(MsnSession *session, MsnUser *user, | |
332 int list_op, GSList *group_ids) | |
333 { | |
334 GaimConnection *gc; | |
335 GaimAccount *account; | |
336 const char *passport; | |
337 const char *store; | |
338 | |
339 account = session->account; | |
340 gc = gaim_account_get_connection(account); | |
341 | |
342 passport = msn_user_get_passport(user); | |
9211
74c81f56b0a5
[gaim-migrate @ 10006]
Christian Hammond <chipx86@chipx86.com>
parents:
9210
diff
changeset
|
343 store = msn_user_get_store_name(user); |
9193 | 344 |
345 if (list_op & MSN_LIST_FL_OP) | |
346 { | |
347 GSList *c; | |
348 for (c = group_ids; c != NULL; c = g_slist_next(c)) | |
349 { | |
350 int group_id; | |
351 group_id = GPOINTER_TO_INT(c->data); | |
352 msn_user_add_group_id(user, group_id); | |
353 } | |
354 | |
355 /* FIXME: It might be a real alias */ | |
356 /* serv_got_alias(gc, passport, store); */ | |
357 } | |
358 | |
359 if (list_op & MSN_LIST_AL_OP) | |
360 { | |
361 /* These are users who are allowed to see our status. */ | |
362 | |
363 if (g_slist_find_custom(account->deny, passport, | |
364 (GCompareFunc)strcmp)) | |
365 { | |
366 gaim_privacy_deny_remove(gc->account, passport, TRUE); | |
367 } | |
368 | |
369 gaim_privacy_permit_add(account, passport, TRUE); | |
370 } | |
371 | |
372 if (list_op & MSN_LIST_BL_OP) | |
373 { | |
374 /* These are users who are not allowed to see our status. */ | |
375 | |
376 if (g_slist_find_custom(account->permit, passport, | |
377 (GCompareFunc)strcmp)) | |
378 { | |
379 gaim_privacy_permit_remove(gc->account, passport, TRUE); | |
380 } | |
381 | |
382 gaim_privacy_deny_add(account, passport, TRUE); | |
383 } | |
384 | |
385 if (list_op & MSN_LIST_RL_OP) | |
386 { | |
387 /* These are users who have us on their contact list. */ | |
388 /* TODO: what does store name is when this happens? */ | |
389 | |
10583 | 390 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
|
391 { |
9193 | 392 got_new_entry(gc, passport, store); |
9225
554ef91db2dd
[gaim-migrate @ 10021]
Christian Hammond <chipx86@chipx86.com>
parents:
9223
diff
changeset
|
393 } |
9193 | 394 } |
395 | |
396 user->list_op = list_op; | |
397 } | |
398 | |
399 /************************************************************************** | |
400 * UserList functions | |
401 **************************************************************************/ | |
402 | |
403 MsnUserList* | |
404 msn_userlist_new(MsnSession *session) | |
405 { | |
406 MsnUserList *userlist; | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
407 |
9193 | 408 userlist = g_new0(MsnUserList, 1); |
409 | |
410 userlist->session = session; | |
9860 | 411 userlist->buddy_icon_requests = g_queue_new(); |
412 userlist->buddy_icon_window = 5; | |
9193 | 413 |
414 return userlist; | |
415 } | |
416 | |
417 void | |
418 msn_userlist_destroy(MsnUserList *userlist) | |
419 { | |
420 GList *l; | |
421 | |
422 for (l = userlist->users; l != NULL; l = l->next) | |
423 { | |
424 msn_user_destroy(l->data); | |
425 } | |
426 | |
427 g_list_free(userlist->users); | |
428 | |
429 for (l = userlist->groups; l != NULL; l = l->next) | |
430 { | |
431 msn_group_destroy(l->data); | |
432 } | |
433 | |
434 g_list_free(userlist->groups); | |
9895 | 435 |
436 g_queue_free(userlist->buddy_icon_requests); | |
9857 | 437 g_free(userlist); |
9193 | 438 } |
439 | |
440 void | |
441 msn_userlist_add_user(MsnUserList *userlist, MsnUser *user) | |
442 { | |
443 userlist->users = g_list_append(userlist->users, user); | |
444 } | |
445 | |
446 void | |
447 msn_userlist_remove_user(MsnUserList *userlist, MsnUser *user) | |
448 { | |
449 userlist->users = g_list_remove(userlist->users, user); | |
450 } | |
451 | |
452 MsnUser * | |
453 msn_userlist_find_user(MsnUserList *userlist, const char *passport) | |
454 { | |
455 GList *l; | |
456 | |
457 g_return_val_if_fail(passport != NULL, NULL); | |
458 | |
459 for (l = userlist->users; l != NULL; l = l->next) | |
460 { | |
461 MsnUser *user = (MsnUser *)l->data; | |
462 | |
463 g_return_val_if_fail(user->passport != NULL, NULL); | |
464 | |
465 if (!strcmp(passport, user->passport)) | |
466 return user; | |
467 } | |
468 | |
469 return NULL; | |
470 } | |
471 | |
472 void | |
473 msn_userlist_add_group(MsnUserList *userlist, MsnGroup *group) | |
474 { | |
475 userlist->groups = g_list_append(userlist->groups, group); | |
476 } | |
477 | |
478 void | |
479 msn_userlist_remove_group(MsnUserList *userlist, MsnGroup *group) | |
480 { | |
481 userlist->groups = g_list_remove(userlist->groups, group); | |
482 } | |
483 | |
484 MsnGroup * | |
485 msn_userlist_find_group_with_id(MsnUserList *userlist, int id) | |
486 { | |
487 GList *l; | |
488 | |
489 g_return_val_if_fail(userlist != NULL, NULL); | |
490 g_return_val_if_fail(id >= 0, NULL); | |
491 | |
492 for (l = userlist->groups; l != NULL; l = l->next) | |
493 { | |
494 MsnGroup *group = l->data; | |
495 | |
496 if (group->id == id) | |
497 return group; | |
498 } | |
499 | |
500 return NULL; | |
501 } | |
502 | |
503 MsnGroup * | |
504 msn_userlist_find_group_with_name(MsnUserList *userlist, const char *name) | |
505 { | |
506 GList *l; | |
507 | |
508 g_return_val_if_fail(userlist != NULL, NULL); | |
509 g_return_val_if_fail(name != NULL, NULL); | |
510 | |
511 for (l = userlist->groups; l != NULL; l = l->next) | |
512 { | |
513 MsnGroup *group = l->data; | |
514 | |
515 if ((group->name != NULL) && !g_ascii_strcasecmp(name, group->name)) | |
516 return group; | |
517 } | |
518 | |
519 return NULL; | |
520 } | |
521 | |
522 int | |
523 msn_userlist_find_group_id(MsnUserList *userlist, const char *group_name) | |
524 { | |
525 MsnGroup *group; | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
526 |
9193 | 527 group = msn_userlist_find_group_with_name(userlist, group_name); |
528 | |
529 if (group != NULL) | |
530 return msn_group_get_id(group); | |
531 else | |
532 return -1; | |
533 } | |
534 | |
535 const char * | |
536 msn_userlist_find_group_name(MsnUserList *userlist, int group_id) | |
537 { | |
538 MsnGroup *group; | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
539 |
9193 | 540 group = msn_userlist_find_group_with_id(userlist, group_id); |
541 | |
542 if (group != NULL) | |
543 return msn_group_get_name(group); | |
544 else | |
545 return NULL; | |
546 } | |
547 | |
548 void | |
549 msn_userlist_rename_group_id(MsnUserList *userlist, int group_id, | |
550 const char *new_name) | |
551 { | |
552 MsnGroup *group; | |
553 | |
554 group = msn_userlist_find_group_with_id(userlist, group_id); | |
555 | |
556 if (group != NULL) | |
557 msn_group_set_name(group, new_name); | |
558 } | |
559 | |
560 void | |
561 msn_userlist_remove_group_id(MsnUserList *userlist, int group_id) | |
562 { | |
563 MsnGroup *group; | |
564 | |
565 group = msn_userlist_find_group_with_id(userlist, group_id); | |
566 | |
567 if (group != NULL) | |
10533 | 568 { |
9193 | 569 msn_userlist_remove_group(userlist, group); |
10533 | 570 msn_group_destroy(group); |
571 } | |
9193 | 572 } |
573 | |
574 void | |
575 msn_userlist_rem_buddy(MsnUserList *userlist, | |
576 const char *who, int list_id, const char *group_name) | |
577 { | |
578 MsnUser *user; | |
579 int group_id; | |
580 const char *list; | |
581 | |
582 user = msn_userlist_find_user(userlist, who); | |
583 group_id = -1; | |
584 | |
585 if (group_name != NULL) | |
586 { | |
587 group_id = msn_userlist_find_group_id(userlist, group_name); | |
588 | |
589 if (group_id < 0) | |
590 { | |
591 /* Whoa, there is no such group. */ | |
592 gaim_debug_error("msn", "Group doesn't exist: %s\n", group_name); | |
593 return; | |
594 } | |
595 } | |
596 | |
597 /* First we're going to check if not there. */ | |
598 if (!(user_is_there(user, list_id, group_id))) | |
599 { | |
600 list = lists[list_id]; | |
601 gaim_debug_error("msn", "User '%s' is not there: %s\n", | |
602 who, list); | |
603 return; | |
604 } | |
605 | |
606 /* Then request the rem to the server. */ | |
607 list = lists[list_id]; | |
608 | |
609 msn_notification_rem_buddy(userlist->session->notification, list, who, group_id); | |
610 } | |
611 | |
612 void | |
613 msn_userlist_add_buddy(MsnUserList *userlist, | |
614 const char *who, int list_id, | |
615 const char *group_name) | |
616 { | |
617 MsnUser *user; | |
618 int group_id; | |
619 const char *list; | |
620 const char *store_name; | |
9194
364aa73323b5
[gaim-migrate @ 9989]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
621 |
9193 | 622 group_id = -1; |
623 | |
624 if (group_name != NULL) | |
625 { | |
626 group_id = msn_userlist_find_group_id(userlist, group_name); | |
627 | |
628 if (group_id < 0) | |
629 { | |
630 /* Whoa, we must add that group first. */ | |
631 msn_request_add_group(userlist, who, NULL, group_name); | |
632 return; | |
633 } | |
634 } | |
635 | |
636 user = msn_userlist_find_user(userlist, who); | |
637 | |
9194
364aa73323b5
[gaim-migrate @ 9989]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
638 /* First we're going to check if it's already there. */ |
9193 | 639 if (user_is_there(user, list_id, group_id)) |
640 { | |
641 list = lists[list_id]; | |
9194
364aa73323b5
[gaim-migrate @ 9989]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
642 gaim_debug_error("msn", "User '%s' is already there: %s\n", who, list); |
9193 | 643 return; |
644 } | |
645 | |
646 store_name = (user != NULL) ? get_store_name(user) : who; | |
647 | |
648 /* Then request the add to the server. */ | |
649 list = lists[list_id]; | |
650 | |
651 msn_notification_add_buddy(userlist->session->notification, list, who, | |
652 store_name, group_id); | |
653 } | |
654 | |
655 void | |
656 msn_userlist_move_buddy(MsnUserList *userlist, const char *who, | |
657 const char *old_group_name, const char *new_group_name) | |
658 { | |
659 int new_group_id; | |
660 | |
661 new_group_id = msn_userlist_find_group_id(userlist, new_group_name); | |
662 | |
663 if (new_group_id < 0) | |
664 { | |
665 msn_request_add_group(userlist, who, old_group_name, new_group_name); | |
666 return; | |
667 } | |
668 | |
10568 | 669 msn_userlist_add_buddy(userlist, who, MSN_LIST_FL, new_group_name); |
9193 | 670 msn_userlist_rem_buddy(userlist, who, MSN_LIST_FL, old_group_name); |
671 } |