Mercurial > pidgin
annotate src/protocols/msn/userlist.c @ 13788:ef95bcc62330
[gaim-migrate @ 16200]
Reverting the tab close button code from Epiphany. It clearly isn't working properly either, though I thought it was before. Perhaps the Ubuntu folks changed the icon again? Anyway, clearly this code isn't any better, so, out it goes.
It's sounding like the Ubuntu folks might revert the change and then figure out how to fix these things for real for the next release.
committer: Tailor Script <tailor@pidgin.im>
| author | Richard Laager <rlaager@wiktel.com> |
|---|---|
| date | Mon, 29 May 2006 17:11:53 +0000 |
| parents | ea77ce998dc7 |
| children | 6c3c8d0d389f |
| 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 */ | |
| 13448 | 395 /* Umm, what? This might fix bug #1385130 */ |
| 396 serv_got_alias(gc, passport, store); | |
| 9193 | 397 } |
| 398 | |
| 399 if (list_op & MSN_LIST_AL_OP) | |
| 400 { | |
| 401 /* These are users who are allowed to see our status. */ | |
|
13692
ea77ce998dc7
[gaim-migrate @ 16095]
Richard Laager <rlaager@wiktel.com>
parents:
13448
diff
changeset
|
402 gaim_privacy_deny_remove(account, passport, TRUE); |
| 9193 | 403 gaim_privacy_permit_add(account, passport, TRUE); |
| 404 } | |
| 405 | |
| 406 if (list_op & MSN_LIST_BL_OP) | |
| 407 { | |
| 408 /* These are users who are not allowed to see our status. */ | |
|
13692
ea77ce998dc7
[gaim-migrate @ 16095]
Richard Laager <rlaager@wiktel.com>
parents:
13448
diff
changeset
|
409 gaim_privacy_permit_remove(account, passport, TRUE); |
| 9193 | 410 gaim_privacy_deny_add(account, passport, TRUE); |
| 411 } | |
| 412 | |
| 413 if (list_op & MSN_LIST_RL_OP) | |
| 414 { | |
|
12318
e346a085bb4f
[gaim-migrate @ 14622]
Richard Laager <rlaager@wiktel.com>
parents:
11638
diff
changeset
|
415 /* These are users who have us on their buddy list. */ |
| 9193 | 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(); |
| 13125 | 440 |
| 441 /* buddy_icon_window is the number of allowed simultaneous buddy icon requests. | |
| 442 * XXX With smarter rate limiting code, we could allow more at once... 5 was the limit set when | |
| 443 * we weren't retrieiving any more than 5 per MSN session. */ | |
| 444 userlist->buddy_icon_window = 1; | |
| 9193 | 445 |
| 446 return userlist; | |
| 447 } | |
| 448 | |
| 449 void | |
| 450 msn_userlist_destroy(MsnUserList *userlist) | |
| 451 { | |
| 452 GList *l; | |
| 453 | |
| 454 for (l = userlist->users; l != NULL; l = l->next) | |
| 455 { | |
| 456 msn_user_destroy(l->data); | |
| 457 } | |
| 458 | |
| 459 g_list_free(userlist->users); | |
| 460 | |
| 461 for (l = userlist->groups; l != NULL; l = l->next) | |
| 462 { | |
| 463 msn_group_destroy(l->data); | |
| 464 } | |
| 465 | |
| 466 g_list_free(userlist->groups); | |
| 9895 | 467 |
| 468 g_queue_free(userlist->buddy_icon_requests); | |
| 13125 | 469 |
| 470 if (userlist->buddy_icon_request_timer) | |
| 471 gaim_timeout_remove(userlist->buddy_icon_request_timer); | |
| 472 | |
| 9857 | 473 g_free(userlist); |
| 9193 | 474 } |
| 475 | |
| 476 void | |
| 477 msn_userlist_add_user(MsnUserList *userlist, MsnUser *user) | |
| 478 { | |
| 479 userlist->users = g_list_append(userlist->users, user); | |
| 480 } | |
| 481 | |
| 482 void | |
| 483 msn_userlist_remove_user(MsnUserList *userlist, MsnUser *user) | |
| 484 { | |
| 485 userlist->users = g_list_remove(userlist->users, user); | |
| 486 } | |
| 487 | |
| 488 MsnUser * | |
| 489 msn_userlist_find_user(MsnUserList *userlist, const char *passport) | |
| 490 { | |
| 491 GList *l; | |
| 492 | |
| 493 g_return_val_if_fail(passport != NULL, NULL); | |
| 494 | |
| 495 for (l = userlist->users; l != NULL; l = l->next) | |
| 496 { | |
| 497 MsnUser *user = (MsnUser *)l->data; | |
| 498 | |
| 499 g_return_val_if_fail(user->passport != NULL, NULL); | |
| 500 | |
| 501 if (!strcmp(passport, user->passport)) | |
| 502 return user; | |
| 503 } | |
| 504 | |
| 505 return NULL; | |
| 506 } | |
| 507 | |
| 508 void | |
| 509 msn_userlist_add_group(MsnUserList *userlist, MsnGroup *group) | |
| 510 { | |
| 511 userlist->groups = g_list_append(userlist->groups, group); | |
| 512 } | |
| 513 | |
| 514 void | |
| 515 msn_userlist_remove_group(MsnUserList *userlist, MsnGroup *group) | |
| 516 { | |
| 517 userlist->groups = g_list_remove(userlist->groups, group); | |
| 518 } | |
| 519 | |
| 520 MsnGroup * | |
| 521 msn_userlist_find_group_with_id(MsnUserList *userlist, int id) | |
| 522 { | |
| 523 GList *l; | |
| 524 | |
| 525 g_return_val_if_fail(userlist != NULL, NULL); | |
| 526 g_return_val_if_fail(id >= 0, NULL); | |
| 527 | |
| 528 for (l = userlist->groups; l != NULL; l = l->next) | |
| 529 { | |
| 530 MsnGroup *group = l->data; | |
| 531 | |
| 532 if (group->id == id) | |
| 533 return group; | |
| 534 } | |
| 535 | |
| 536 return NULL; | |
| 537 } | |
| 538 | |
| 539 MsnGroup * | |
| 540 msn_userlist_find_group_with_name(MsnUserList *userlist, const char *name) | |
| 541 { | |
| 542 GList *l; | |
| 543 | |
| 544 g_return_val_if_fail(userlist != NULL, NULL); | |
| 545 g_return_val_if_fail(name != NULL, NULL); | |
| 546 | |
| 547 for (l = userlist->groups; l != NULL; l = l->next) | |
| 548 { | |
| 549 MsnGroup *group = l->data; | |
| 550 | |
| 551 if ((group->name != NULL) && !g_ascii_strcasecmp(name, group->name)) | |
| 552 return group; | |
| 553 } | |
| 554 | |
| 555 return NULL; | |
| 556 } | |
| 557 | |
| 558 int | |
| 559 msn_userlist_find_group_id(MsnUserList *userlist, const char *group_name) | |
| 560 { | |
| 561 MsnGroup *group; | |
|
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
562 |
| 9193 | 563 group = msn_userlist_find_group_with_name(userlist, group_name); |
| 564 | |
| 565 if (group != NULL) | |
| 566 return msn_group_get_id(group); | |
| 567 else | |
| 568 return -1; | |
| 569 } | |
| 570 | |
| 571 const char * | |
| 572 msn_userlist_find_group_name(MsnUserList *userlist, int group_id) | |
| 573 { | |
| 574 MsnGroup *group; | |
|
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
575 |
| 9193 | 576 group = msn_userlist_find_group_with_id(userlist, group_id); |
| 577 | |
| 578 if (group != NULL) | |
| 579 return msn_group_get_name(group); | |
| 580 else | |
| 581 return NULL; | |
| 582 } | |
| 583 | |
| 584 void | |
| 585 msn_userlist_rename_group_id(MsnUserList *userlist, int group_id, | |
| 586 const char *new_name) | |
| 587 { | |
| 588 MsnGroup *group; | |
| 589 | |
| 590 group = msn_userlist_find_group_with_id(userlist, group_id); | |
| 591 | |
| 592 if (group != NULL) | |
| 593 msn_group_set_name(group, new_name); | |
| 594 } | |
| 595 | |
| 596 void | |
| 597 msn_userlist_remove_group_id(MsnUserList *userlist, int group_id) | |
| 598 { | |
| 599 MsnGroup *group; | |
| 600 | |
| 601 group = msn_userlist_find_group_with_id(userlist, group_id); | |
| 602 | |
| 603 if (group != NULL) | |
| 10533 | 604 { |
| 9193 | 605 msn_userlist_remove_group(userlist, group); |
| 10533 | 606 msn_group_destroy(group); |
| 607 } | |
| 9193 | 608 } |
| 609 | |
| 610 void | |
| 611 msn_userlist_rem_buddy(MsnUserList *userlist, | |
| 612 const char *who, int list_id, const char *group_name) | |
| 613 { | |
| 614 MsnUser *user; | |
| 615 int group_id; | |
| 616 const char *list; | |
| 617 | |
| 618 user = msn_userlist_find_user(userlist, who); | |
| 619 group_id = -1; | |
| 620 | |
| 621 if (group_name != NULL) | |
| 622 { | |
| 623 group_id = msn_userlist_find_group_id(userlist, group_name); | |
| 624 | |
| 625 if (group_id < 0) | |
| 626 { | |
| 627 /* Whoa, there is no such group. */ | |
| 628 gaim_debug_error("msn", "Group doesn't exist: %s\n", group_name); | |
| 629 return; | |
| 630 } | |
| 631 } | |
| 632 | |
| 633 /* First we're going to check if not there. */ | |
| 634 if (!(user_is_there(user, list_id, group_id))) | |
| 635 { | |
| 636 list = lists[list_id]; | |
| 637 gaim_debug_error("msn", "User '%s' is not there: %s\n", | |
| 638 who, list); | |
| 639 return; | |
| 640 } | |
| 641 | |
| 642 /* Then request the rem to the server. */ | |
| 643 list = lists[list_id]; | |
| 644 | |
| 645 msn_notification_rem_buddy(userlist->session->notification, list, who, group_id); | |
| 646 } | |
| 647 | |
| 648 void | |
| 649 msn_userlist_add_buddy(MsnUserList *userlist, | |
| 650 const char *who, int list_id, | |
| 651 const char *group_name) | |
| 652 { | |
| 653 MsnUser *user; | |
| 654 int group_id; | |
| 655 const char *list; | |
| 656 const char *store_name; | |
|
9194
364aa73323b5
[gaim-migrate @ 9989]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
657 |
| 9193 | 658 group_id = -1; |
| 659 | |
|
11057
e9eeacd1a8d0
[gaim-migrate @ 13009]
Richard Laager <rlaager@wiktel.com>
parents:
11039
diff
changeset
|
660 if (!gaim_email_is_valid(who)) |
|
e9eeacd1a8d0
[gaim-migrate @ 13009]
Richard Laager <rlaager@wiktel.com>
parents:
11039
diff
changeset
|
661 { |
| 11638 | 662 /* only notify the user about problems adding to the friends list |
| 663 * maybe we should do something else for other lists, but it probably | |
| 664 * won't cause too many problems if we just ignore it */ | |
| 665 if (list_id == MSN_LIST_FL) | |
| 666 { | |
| 667 char *str = g_strdup_printf(_("Unable to add \"%s\"."), who); | |
| 668 gaim_notify_error(NULL, NULL, str, | |
| 669 _("The screen name specified is invalid.")); | |
| 670 g_free(str); | |
| 671 } | |
| 672 | |
|
11057
e9eeacd1a8d0
[gaim-migrate @ 13009]
Richard Laager <rlaager@wiktel.com>
parents:
11039
diff
changeset
|
673 return; |
|
e9eeacd1a8d0
[gaim-migrate @ 13009]
Richard Laager <rlaager@wiktel.com>
parents:
11039
diff
changeset
|
674 } |
|
e9eeacd1a8d0
[gaim-migrate @ 13009]
Richard Laager <rlaager@wiktel.com>
parents:
11039
diff
changeset
|
675 |
| 9193 | 676 if (group_name != NULL) |
| 677 { | |
| 678 group_id = msn_userlist_find_group_id(userlist, group_name); | |
| 679 | |
| 680 if (group_id < 0) | |
| 681 { | |
| 682 /* Whoa, we must add that group first. */ | |
| 683 msn_request_add_group(userlist, who, NULL, group_name); | |
| 684 return; | |
| 685 } | |
| 686 } | |
| 687 | |
| 688 user = msn_userlist_find_user(userlist, who); | |
| 689 | |
|
9194
364aa73323b5
[gaim-migrate @ 9989]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
690 /* First we're going to check if it's already there. */ |
| 9193 | 691 if (user_is_there(user, list_id, group_id)) |
| 692 { | |
| 693 list = lists[list_id]; | |
|
9194
364aa73323b5
[gaim-migrate @ 9989]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
694 gaim_debug_error("msn", "User '%s' is already there: %s\n", who, list); |
| 9193 | 695 return; |
| 696 } | |
| 697 | |
| 698 store_name = (user != NULL) ? get_store_name(user) : who; | |
| 699 | |
| 700 /* Then request the add to the server. */ | |
| 701 list = lists[list_id]; | |
| 702 | |
| 703 msn_notification_add_buddy(userlist->session->notification, list, who, | |
| 704 store_name, group_id); | |
| 705 } | |
| 706 | |
| 707 void | |
| 708 msn_userlist_move_buddy(MsnUserList *userlist, const char *who, | |
| 709 const char *old_group_name, const char *new_group_name) | |
| 710 { | |
| 711 int new_group_id; | |
| 712 | |
| 713 new_group_id = msn_userlist_find_group_id(userlist, new_group_name); | |
| 714 | |
| 715 if (new_group_id < 0) | |
| 716 { | |
| 717 msn_request_add_group(userlist, who, old_group_name, new_group_name); | |
| 718 return; | |
| 719 } | |
| 720 | |
| 10568 | 721 msn_userlist_add_buddy(userlist, who, MSN_LIST_FL, new_group_name); |
| 9193 | 722 msn_userlist_rem_buddy(userlist, who, MSN_LIST_FL, old_group_name); |
| 723 } |
