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