Mercurial > pidgin
annotate src/protocols/msn/userlist.c @ 9772:5f7c81eeebd2
[gaim-migrate @ 10640]
Another ft patch from Dave West. This one makes transfers appear in the
ft dialog earlier. I'm a bit concerned that transfers might not be
removed correctly when canceled early on. Or that they won't show up
with the right status between the time they're initiated and the time
the file actually begins being transferred.
committer: Tailor Script <tailor@pidgin.im>
| author | Mark Doliner <mark@kingant.net> |
|---|---|
| date | Wed, 18 Aug 2004 04:22:31 +0000 |
| parents | 554ef91db2dd |
| children | d326dd512662 |
| 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 | |
| 73 got_new_entry(GaimConnection *gc, const char *passport, | |
| 74 const char *friendly) | |
| 75 { | |
| 76 MsnPermitAdd *pa; | |
| 77 char *msg; | |
| 78 | |
| 79 pa = g_new0(MsnPermitAdd, 1); | |
| 80 pa->who = g_strdup(passport); | |
| 81 pa->gc = gc; | |
| 82 | |
|
9210
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
83 if (friendly != NULL) |
|
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
84 { |
|
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."), |
|
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
88 passport, friendly, |
|
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
89 gaim_account_get_username(gc->account)); |
|
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
90 } |
|
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
91 else |
|
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
92 { |
|
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
93 msg = g_strdup_printf( |
|
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
94 _("The user %s wants to add %s to his or " |
|
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
95 "her buddy list."), |
|
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
96 passport, gaim_account_get_username(gc->account)); |
|
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
97 } |
| 9193 | 98 |
| 99 gaim_request_action(gc, NULL, msg, NULL, 0, pa, 2, | |
| 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 | |
| 154 if ((store_name = msn_user_get_store_name(user)) != NULL) | |
| 155 return gaim_url_encode(store_name); | |
| 156 | |
| 157 return msn_user_get_passport(user); | |
| 158 } | |
| 159 | |
| 160 static void | |
| 161 msn_request_add_group(MsnUserList *userlist, const char *who, | |
| 162 const char *old_group_name, const char *new_group_name) | |
| 163 { | |
| 164 MsnCmdProc *cmdproc; | |
| 165 MsnTransaction *trans; | |
| 9218 | 166 MsnMoveBuddy *data; |
| 9193 | 167 |
| 168 cmdproc = userlist->session->notification->cmdproc; | |
| 9218 | 169 data = g_new0(MsnMoveBuddy, 1); |
| 9193 | 170 |
| 171 data->who = g_strdup(who); | |
| 172 | |
| 173 if (old_group_name) | |
| 174 data->old_group_name = g_strdup(old_group_name); | |
| 175 | |
| 176 trans = msn_transaction_new("ADG", "%s %d", | |
| 177 gaim_url_encode(new_group_name), | |
| 178 0); | |
| 179 | |
| 180 msn_transaction_set_data(trans, data); | |
| 181 | |
| 182 msn_cmdproc_send_trans(cmdproc, trans); | |
| 183 } | |
| 184 | |
| 185 /************************************************************************** | |
| 186 * Server functions | |
| 187 **************************************************************************/ | |
| 188 | |
| 189 MsnListId | |
| 190 msn_get_list_id(const char *list) | |
| 191 { | |
| 192 if (list[0] == 'F') | |
| 193 return MSN_LIST_FL; | |
| 194 else if (list[0] == 'A') | |
| 195 return MSN_LIST_AL; | |
| 196 else if (list[0] == 'B') | |
| 197 return MSN_LIST_BL; | |
| 198 else if (list[0] == 'R') | |
| 199 return MSN_LIST_RL; | |
| 200 | |
| 201 return -1; | |
| 202 } | |
| 203 | |
| 204 void | |
| 205 msn_got_add_user(MsnSession *session, MsnUser *user, | |
| 206 MsnListId list_id, int group_id) | |
| 207 { | |
| 208 GaimAccount *account; | |
| 209 const char *passport; | |
| 210 const char *friendly; | |
| 211 | |
| 212 account = session->account; | |
| 213 | |
| 214 passport = msn_user_get_passport(user); | |
| 215 friendly = msn_user_get_friendly_name(user); | |
|
9197
ec417d2f9666
[gaim-migrate @ 9992]
Christian Hammond <chipx86@chipx86.com>
parents:
9196
diff
changeset
|
216 |
| 9193 | 217 if (list_id == MSN_LIST_FL) |
| 218 { | |
| 219 GaimConnection *gc = gaim_account_get_connection(account); | |
| 220 | |
| 221 serv_got_alias(gc, passport, friendly); | |
| 222 | |
| 223 if (group_id >= 0) | |
| 224 { | |
| 225 msn_user_add_group_id(user, group_id); | |
| 226 return; | |
| 227 } | |
| 228 else | |
| 229 { | |
| 230 /* session->sync->fl_users_count++; */ | |
| 231 } | |
| 232 } | |
| 233 else if (list_id == MSN_LIST_AL) | |
| 234 { | |
| 235 gaim_privacy_permit_add(account, passport, TRUE); | |
| 236 } | |
| 237 else if (list_id == MSN_LIST_BL) | |
| 238 { | |
| 239 gaim_privacy_deny_add(account, passport, TRUE); | |
| 240 } | |
| 241 else if (list_id == MSN_LIST_RL) | |
| 242 { | |
| 243 GaimConnection *gc = gaim_account_get_connection(account); | |
| 244 | |
| 245 gaim_debug_info("msn", | |
| 246 "%s has added you to his or her contact list.\n", | |
| 247 passport); | |
| 248 | |
|
9225
554ef91db2dd
[gaim-migrate @ 10021]
Christian Hammond <chipx86@chipx86.com>
parents:
9223
diff
changeset
|
249 #if 0 |
|
554ef91db2dd
[gaim-migrate @ 10021]
Christian Hammond <chipx86@chipx86.com>
parents:
9223
diff
changeset
|
250 gaim_debug_misc("msn", "User's list op = %d\n", user->list_op); |
|
554ef91db2dd
[gaim-migrate @ 10021]
Christian Hammond <chipx86@chipx86.com>
parents:
9223
diff
changeset
|
251 gaim_debug_misc("msn", "FL = %d\n", (user->list_op & MSN_LIST_FL_OP)); |
|
554ef91db2dd
[gaim-migrate @ 10021]
Christian Hammond <chipx86@chipx86.com>
parents:
9223
diff
changeset
|
252 gaim_debug_misc("msn", "AL = %d\n", (user->list_op & MSN_LIST_AL_OP)); |
|
554ef91db2dd
[gaim-migrate @ 10021]
Christian Hammond <chipx86@chipx86.com>
parents:
9223
diff
changeset
|
253 gaim_debug_misc("msn", "BL = %d\n", (user->list_op & MSN_LIST_BL_OP)); |
|
554ef91db2dd
[gaim-migrate @ 10021]
Christian Hammond <chipx86@chipx86.com>
parents:
9223
diff
changeset
|
254 gaim_debug_misc("msn", "RL = %d\n", (user->list_op & MSN_LIST_RL_OP)); |
|
554ef91db2dd
[gaim-migrate @ 10021]
Christian Hammond <chipx86@chipx86.com>
parents:
9223
diff
changeset
|
255 #endif |
|
554ef91db2dd
[gaim-migrate @ 10021]
Christian Hammond <chipx86@chipx86.com>
parents:
9223
diff
changeset
|
256 |
|
9223
f46154d6de2b
[gaim-migrate @ 10019]
Christian Hammond <chipx86@chipx86.com>
parents:
9218
diff
changeset
|
257 if (!(user->list_op & (MSN_LIST_AL_OP | MSN_LIST_BL_OP | |
|
f46154d6de2b
[gaim-migrate @ 10019]
Christian Hammond <chipx86@chipx86.com>
parents:
9218
diff
changeset
|
258 MSN_LIST_FL_OP))) |
|
f46154d6de2b
[gaim-migrate @ 10019]
Christian Hammond <chipx86@chipx86.com>
parents:
9218
diff
changeset
|
259 { |
| 9193 | 260 got_new_entry(gc, passport, friendly); |
|
9223
f46154d6de2b
[gaim-migrate @ 10019]
Christian Hammond <chipx86@chipx86.com>
parents:
9218
diff
changeset
|
261 } |
| 9193 | 262 } |
| 263 | |
| 264 user->list_op |= (1 << list_id); | |
| 265 /* gaim_user_add_list_id (user, list_id); */ | |
| 266 } | |
| 267 | |
| 268 void | |
| 269 msn_got_rem_user(MsnSession *session, MsnUser *user, | |
| 270 MsnListId list_id, int group_id) | |
| 271 { | |
| 272 GaimAccount *account; | |
| 273 const char *passport; | |
| 274 | |
| 275 account = session->account; | |
| 276 | |
| 277 passport = msn_user_get_passport(user); | |
| 278 | |
| 279 if (list_id == MSN_LIST_FL) | |
| 280 { | |
| 281 /* TODO: When is the user totally removed? */ | |
| 282 if (group_id >= 0) | |
| 283 { | |
| 284 msn_user_remove_group_id(user, group_id); | |
| 285 return; | |
| 286 } | |
| 287 else | |
| 288 { | |
| 289 /* session->sync->fl_users_count--; */ | |
| 290 } | |
| 291 } | |
| 292 else if (list_id == MSN_LIST_AL) | |
| 293 { | |
| 294 gaim_privacy_permit_remove(account, passport, TRUE); | |
| 295 } | |
| 296 else if (list_id == MSN_LIST_BL) | |
| 297 { | |
| 298 gaim_privacy_deny_remove(account, passport, TRUE); | |
| 299 } | |
| 300 else if (list_id == MSN_LIST_RL) | |
| 301 { | |
| 302 gaim_debug_info("msn", | |
| 303 "%s has removed you from his or her contact list.\n", | |
| 304 passport); | |
| 305 } | |
| 306 | |
| 307 user->list_op &= ~(1 << list_id); | |
| 308 /* gaim_user_remove_list_id (user, list_id); */ | |
| 309 | |
| 310 if (user->list_op == 0) | |
| 311 { | |
| 312 gaim_debug_info("msn", "Buddy '%s' shall be deleted?.\n", | |
| 313 passport); | |
| 314 | |
| 315 } | |
| 316 } | |
| 317 | |
| 318 void | |
| 319 msn_got_lst_user(MsnSession *session, MsnUser *user, | |
| 320 int list_op, GSList *group_ids) | |
| 321 { | |
| 322 GaimConnection *gc; | |
| 323 GaimAccount *account; | |
| 324 const char *passport; | |
| 325 const char *store; | |
| 326 | |
| 327 account = session->account; | |
| 328 gc = gaim_account_get_connection(account); | |
| 329 | |
| 330 passport = msn_user_get_passport(user); | |
|
9211
74c81f56b0a5
[gaim-migrate @ 10006]
Christian Hammond <chipx86@chipx86.com>
parents:
9210
diff
changeset
|
331 store = msn_user_get_store_name(user); |
| 9193 | 332 |
| 333 if (list_op & MSN_LIST_FL_OP) | |
| 334 { | |
| 335 GSList *c; | |
| 336 for (c = group_ids; c != NULL; c = g_slist_next(c)) | |
| 337 { | |
| 338 int group_id; | |
| 339 group_id = GPOINTER_TO_INT(c->data); | |
| 340 msn_user_add_group_id(user, group_id); | |
| 341 } | |
| 342 | |
| 343 /* FIXME: It might be a real alias */ | |
| 344 /* serv_got_alias(gc, passport, store); */ | |
| 345 } | |
| 346 | |
| 347 if (list_op & MSN_LIST_AL_OP) | |
| 348 { | |
| 349 /* These are users who are allowed to see our status. */ | |
| 350 | |
| 351 if (g_slist_find_custom(account->deny, passport, | |
| 352 (GCompareFunc)strcmp)) | |
| 353 { | |
| 354 gaim_privacy_deny_remove(gc->account, passport, TRUE); | |
| 355 } | |
| 356 | |
| 357 gaim_privacy_permit_add(account, passport, TRUE); | |
| 358 } | |
| 359 | |
| 360 if (list_op & MSN_LIST_BL_OP) | |
| 361 { | |
| 362 /* These are users who are not allowed to see our status. */ | |
| 363 | |
| 364 if (g_slist_find_custom(account->permit, passport, | |
| 365 (GCompareFunc)strcmp)) | |
| 366 { | |
| 367 gaim_privacy_permit_remove(gc->account, passport, TRUE); | |
| 368 } | |
| 369 | |
| 370 gaim_privacy_deny_add(account, passport, TRUE); | |
| 371 } | |
| 372 | |
| 373 if (list_op & MSN_LIST_RL_OP) | |
| 374 { | |
| 375 /* These are users who have us on their contact list. */ | |
| 376 /* TODO: what does store name is when this happens? */ | |
| 377 | |
|
9225
554ef91db2dd
[gaim-migrate @ 10021]
Christian Hammond <chipx86@chipx86.com>
parents:
9223
diff
changeset
|
378 if (!(list_op & (MSN_LIST_AL_OP | MSN_LIST_BL_OP | |
|
554ef91db2dd
[gaim-migrate @ 10021]
Christian Hammond <chipx86@chipx86.com>
parents:
9223
diff
changeset
|
379 MSN_LIST_FL_OP))) |
|
554ef91db2dd
[gaim-migrate @ 10021]
Christian Hammond <chipx86@chipx86.com>
parents:
9223
diff
changeset
|
380 { |
| 9193 | 381 got_new_entry(gc, passport, store); |
|
9225
554ef91db2dd
[gaim-migrate @ 10021]
Christian Hammond <chipx86@chipx86.com>
parents:
9223
diff
changeset
|
382 } |
| 9193 | 383 } |
| 384 | |
| 385 user->list_op = list_op; | |
| 386 } | |
| 387 | |
| 388 /************************************************************************** | |
| 389 * UserList functions | |
| 390 **************************************************************************/ | |
| 391 | |
| 392 MsnUserList* | |
| 393 msn_userlist_new(MsnSession *session) | |
| 394 { | |
| 395 MsnUserList *userlist; | |
|
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
396 |
| 9193 | 397 userlist = g_new0(MsnUserList, 1); |
| 398 | |
| 399 userlist->session = session; | |
| 400 | |
| 401 return userlist; | |
| 402 } | |
| 403 | |
| 404 void | |
| 405 msn_userlist_destroy(MsnUserList *userlist) | |
| 406 { | |
| 407 GList *l; | |
| 408 | |
| 409 for (l = userlist->users; l != NULL; l = l->next) | |
| 410 { | |
| 411 msn_user_destroy(l->data); | |
| 412 } | |
| 413 | |
| 414 g_list_free(userlist->users); | |
| 415 | |
| 416 for (l = userlist->groups; l != NULL; l = l->next) | |
| 417 { | |
| 418 msn_group_destroy(l->data); | |
| 419 } | |
| 420 | |
| 421 g_list_free(userlist->groups); | |
| 422 } | |
| 423 | |
| 424 void | |
| 425 msn_userlist_add_user(MsnUserList *userlist, MsnUser *user) | |
| 426 { | |
|
9225
554ef91db2dd
[gaim-migrate @ 10021]
Christian Hammond <chipx86@chipx86.com>
parents:
9223
diff
changeset
|
427 gaim_debug_misc("msn", "[%p] Adding %s (%p)\n", |
|
554ef91db2dd
[gaim-migrate @ 10021]
Christian Hammond <chipx86@chipx86.com>
parents:
9223
diff
changeset
|
428 userlist, user->passport, user); |
| 9193 | 429 userlist->users = g_list_append(userlist->users, user); |
| 430 } | |
| 431 | |
| 432 void | |
| 433 msn_userlist_remove_user(MsnUserList *userlist, MsnUser *user) | |
| 434 { | |
| 435 userlist->users = g_list_remove(userlist->users, user); | |
| 436 } | |
| 437 | |
| 438 MsnUser * | |
| 439 msn_userlist_find_user(MsnUserList *userlist, const char *passport) | |
| 440 { | |
| 441 GList *l; | |
| 442 | |
| 443 g_return_val_if_fail(passport != NULL, NULL); | |
| 444 | |
| 445 for (l = userlist->users; l != NULL; l = l->next) | |
| 446 { | |
| 447 MsnUser *user = (MsnUser *)l->data; | |
| 448 | |
| 449 g_return_val_if_fail(user->passport != NULL, NULL); | |
| 450 | |
|
9225
554ef91db2dd
[gaim-migrate @ 10021]
Christian Hammond <chipx86@chipx86.com>
parents:
9223
diff
changeset
|
451 #if 0 |
|
554ef91db2dd
[gaim-migrate @ 10021]
Christian Hammond <chipx86@chipx86.com>
parents:
9223
diff
changeset
|
452 gaim_debug_misc("msn", "[%p] Comparing '%s' and '%s' (%p)\n", |
|
554ef91db2dd
[gaim-migrate @ 10021]
Christian Hammond <chipx86@chipx86.com>
parents:
9223
diff
changeset
|
453 userlist, passport, user->passport, user); |
|
554ef91db2dd
[gaim-migrate @ 10021]
Christian Hammond <chipx86@chipx86.com>
parents:
9223
diff
changeset
|
454 #endif |
|
554ef91db2dd
[gaim-migrate @ 10021]
Christian Hammond <chipx86@chipx86.com>
parents:
9223
diff
changeset
|
455 |
| 9193 | 456 if (!strcmp(passport, user->passport)) |
| 457 return user; | |
| 458 } | |
| 459 | |
| 460 return NULL; | |
| 461 } | |
| 462 | |
| 463 void | |
| 464 msn_userlist_add_group(MsnUserList *userlist, MsnGroup *group) | |
| 465 { | |
| 466 userlist->groups = g_list_append(userlist->groups, group); | |
| 467 } | |
| 468 | |
| 469 void | |
| 470 msn_userlist_remove_group(MsnUserList *userlist, MsnGroup *group) | |
| 471 { | |
| 472 userlist->groups = g_list_remove(userlist->groups, group); | |
| 473 } | |
| 474 | |
| 475 MsnGroup * | |
| 476 msn_userlist_find_group_with_id(MsnUserList *userlist, int id) | |
| 477 { | |
| 478 GList *l; | |
| 479 | |
| 480 g_return_val_if_fail(userlist != NULL, NULL); | |
| 481 g_return_val_if_fail(id >= 0, NULL); | |
| 482 | |
| 483 for (l = userlist->groups; l != NULL; l = l->next) | |
| 484 { | |
| 485 MsnGroup *group = l->data; | |
| 486 | |
| 487 if (group->id == id) | |
| 488 return group; | |
| 489 } | |
| 490 | |
| 491 return NULL; | |
| 492 } | |
| 493 | |
| 494 MsnGroup * | |
| 495 msn_userlist_find_group_with_name(MsnUserList *userlist, const char *name) | |
| 496 { | |
| 497 GList *l; | |
| 498 | |
| 499 g_return_val_if_fail(userlist != NULL, NULL); | |
| 500 g_return_val_if_fail(name != NULL, NULL); | |
| 501 | |
| 502 for (l = userlist->groups; l != NULL; l = l->next) | |
| 503 { | |
| 504 MsnGroup *group = l->data; | |
| 505 | |
| 506 if ((group->name != NULL) && !g_ascii_strcasecmp(name, group->name)) | |
| 507 return group; | |
| 508 } | |
| 509 | |
| 510 return NULL; | |
| 511 } | |
| 512 | |
| 513 int | |
| 514 msn_userlist_find_group_id(MsnUserList *userlist, const char *group_name) | |
| 515 { | |
| 516 MsnGroup *group; | |
|
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
517 |
| 9193 | 518 group = msn_userlist_find_group_with_name(userlist, group_name); |
| 519 | |
| 520 if (group != NULL) | |
| 521 return msn_group_get_id(group); | |
| 522 else | |
| 523 return -1; | |
| 524 } | |
| 525 | |
| 526 const char * | |
| 527 msn_userlist_find_group_name(MsnUserList *userlist, int group_id) | |
| 528 { | |
| 529 MsnGroup *group; | |
|
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
530 |
| 9193 | 531 group = msn_userlist_find_group_with_id(userlist, group_id); |
| 532 | |
| 533 if (group != NULL) | |
| 534 return msn_group_get_name(group); | |
| 535 else | |
| 536 return NULL; | |
| 537 } | |
| 538 | |
| 539 void | |
| 540 msn_userlist_rename_group_id(MsnUserList *userlist, int group_id, | |
| 541 const char *new_name) | |
| 542 { | |
| 543 MsnGroup *group; | |
| 544 | |
| 545 group = msn_userlist_find_group_with_id(userlist, group_id); | |
| 546 | |
| 547 if (group != NULL) | |
| 548 msn_group_set_name(group, new_name); | |
| 549 } | |
| 550 | |
| 551 void | |
| 552 msn_userlist_remove_group_id(MsnUserList *userlist, int group_id) | |
| 553 { | |
| 554 MsnGroup *group; | |
| 555 | |
| 556 group = msn_userlist_find_group_with_id(userlist, group_id); | |
| 557 | |
| 558 if (group != NULL) | |
| 559 msn_userlist_remove_group(userlist, group); | |
| 560 } | |
| 561 | |
| 562 void | |
| 563 msn_userlist_rem_buddy(MsnUserList *userlist, | |
| 564 const char *who, int list_id, const char *group_name) | |
| 565 { | |
| 566 MsnUser *user; | |
| 567 int group_id; | |
| 568 const char *list; | |
| 569 | |
| 570 user = msn_userlist_find_user(userlist, who); | |
| 571 group_id = -1; | |
| 572 | |
| 573 if (group_name != NULL) | |
| 574 { | |
| 575 group_id = msn_userlist_find_group_id(userlist, group_name); | |
| 576 | |
| 577 if (group_id < 0) | |
| 578 { | |
| 579 /* Whoa, there is no such group. */ | |
| 580 gaim_debug_error("msn", "Group doesn't exist: %s\n", group_name); | |
| 581 return; | |
| 582 } | |
| 583 } | |
| 584 | |
| 585 /* First we're going to check if not there. */ | |
| 586 if (!(user_is_there(user, list_id, group_id))) | |
| 587 { | |
| 588 list = lists[list_id]; | |
| 589 gaim_debug_error("msn", "User '%s' is not there: %s\n", | |
| 590 who, list); | |
| 591 return; | |
| 592 } | |
| 593 | |
| 594 /* Then request the rem to the server. */ | |
| 595 list = lists[list_id]; | |
| 596 | |
| 597 msn_notification_rem_buddy(userlist->session->notification, list, who, group_id); | |
| 598 } | |
| 599 | |
| 600 void | |
| 601 msn_userlist_add_buddy(MsnUserList *userlist, | |
| 602 const char *who, int list_id, | |
| 603 const char *group_name) | |
| 604 { | |
| 605 MsnUser *user; | |
| 606 int group_id; | |
| 607 const char *list; | |
| 608 const char *store_name; | |
|
9194
364aa73323b5
[gaim-migrate @ 9989]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
609 |
| 9193 | 610 group_id = -1; |
| 611 | |
| 612 if (group_name != NULL) | |
| 613 { | |
| 614 group_id = msn_userlist_find_group_id(userlist, group_name); | |
| 615 | |
| 616 if (group_id < 0) | |
| 617 { | |
| 618 /* Whoa, we must add that group first. */ | |
| 619 msn_request_add_group(userlist, who, NULL, group_name); | |
| 620 return; | |
| 621 } | |
| 622 } | |
| 623 | |
| 624 user = msn_userlist_find_user(userlist, who); | |
| 625 | |
|
9194
364aa73323b5
[gaim-migrate @ 9989]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
626 /* First we're going to check if it's already there. */ |
| 9193 | 627 if (user_is_there(user, list_id, group_id)) |
| 628 { | |
| 629 list = lists[list_id]; | |
|
9195
d5487fdec696
[gaim-migrate @ 9990]
Christian Hammond <chipx86@chipx86.com>
parents:
9194
diff
changeset
|
630 #if 0 |
|
9194
364aa73323b5
[gaim-migrate @ 9989]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
631 gaim_debug_error("msn", "User '%s' is already there: %s\n", who, list); |
|
9196
336e87c71d06
[gaim-migrate @ 9991]
Christian Hammond <chipx86@chipx86.com>
parents:
9195
diff
changeset
|
632 #endif |
| 9193 | 633 return; |
| 634 } | |
| 635 | |
| 636 store_name = (user != NULL) ? get_store_name(user) : who; | |
| 637 | |
| 638 /* Then request the add to the server. */ | |
| 639 list = lists[list_id]; | |
| 640 | |
| 641 msn_notification_add_buddy(userlist->session->notification, list, who, | |
| 642 store_name, group_id); | |
| 643 } | |
| 644 | |
| 645 void | |
| 646 msn_userlist_move_buddy(MsnUserList *userlist, const char *who, | |
| 647 const char *old_group_name, const char *new_group_name) | |
| 648 { | |
| 649 int new_group_id; | |
| 650 | |
| 651 new_group_id = msn_userlist_find_group_id(userlist, new_group_name); | |
| 652 | |
| 653 if (new_group_id < 0) | |
| 654 { | |
| 655 msn_request_add_group(userlist, who, old_group_name, new_group_name); | |
| 656 return; | |
| 657 } | |
| 658 | |
| 659 msn_userlist_rem_buddy(userlist, who, MSN_LIST_FL, old_group_name); | |
| 660 msn_userlist_add_buddy(userlist, who, MSN_LIST_FL, new_group_name); | |
| 661 } |
