comparison src/protocols/msn/session.c @ 11992:c824e39db0e7

[gaim-migrate @ 14285] - make Offline a user setable status in MSN - redo MSN status changing to query the core for the current status instead of keeping track of it itself, as recommended by Mark on patch #1336338. - bring back the buddy list synchronization by parsing the buddy list after signon committer: Tailor Script <tailor@pidgin.im>
author Stu Tomlinson <stu@nosnilmot.com>
date Sun, 06 Nov 2005 21:52:00 +0000
parents 10066662176a
children 8872789902a1
comparison
equal deleted inserted replaced
11991:94ba447a6a5c 11992:c824e39db0e7
37 session = g_new0(MsnSession, 1); 37 session = g_new0(MsnSession, 1);
38 38
39 session->account = account; 39 session->account = account;
40 session->notification = msn_notification_new(session); 40 session->notification = msn_notification_new(session);
41 session->userlist = msn_userlist_new(session); 41 session->userlist = msn_userlist_new(session);
42 session->sync_userlist = msn_userlist_new(session);
43 42
44 session->user = msn_user_new(session->userlist, 43 session->user = msn_user_new(session->userlist,
45 gaim_account_get_username(account), NULL); 44 gaim_account_get_username(account), NULL);
46 45
47 session->protocol_ver = 9; 46 session->protocol_ver = 9;
68 67
69 while (session->slplinks != NULL) 68 while (session->slplinks != NULL)
70 msn_slplink_destroy(session->slplinks->data); 69 msn_slplink_destroy(session->slplinks->data);
71 70
72 msn_userlist_destroy(session->userlist); 71 msn_userlist_destroy(session->userlist);
73
74 if (session->sync_userlist != NULL)
75 msn_userlist_destroy(session->sync_userlist);
76 72
77 if (session->passport_info.kv != NULL) 73 if (session->passport_info.kv != NULL)
78 g_free(session->passport_info.kv); 74 g_free(session->passport_info.kv);
79 75
80 if (session->passport_info.sid != NULL) 76 if (session->passport_info.sid != NULL)
229 } 225 }
230 226
231 static void 227 static void
232 msn_session_sync_users(MsnSession *session) 228 msn_session_sync_users(MsnSession *session)
233 { 229 {
234 GList *l; 230 GaimBlistNode *gnode, *cnode, *bnode;
235 231 GaimConnection *gc = gaim_account_get_connection(session->account);
236 l = session->sync_userlist->users; 232
237 233 g_return_if_fail(gc != NULL);
238 while (l != NULL) 234
239 { 235 /* The core used to use msn_add_buddy to add all buddies before
240 MsnUser *local_user; 236 * being logged in. This no longer happens, so we manually iterate
241 237 * over the whole buddy list to identify sync issues. */
242 local_user = (MsnUser *)l->data; 238
243 239 for (gnode = gaim_get_blist()->root; gnode; gnode = gnode->next) {
244 if (local_user->passport != NULL) 240 GaimGroup *group = (GaimGroup *)gnode;
245 { 241 const char *group_name = group->name;
246 MsnUser *remote_user; 242 if(!GAIM_BLIST_NODE_IS_GROUP(gnode))
247 243 continue;
248 remote_user = msn_userlist_find_user(session->userlist, 244 for(cnode = gnode->child; cnode; cnode = cnode->next) {
249 local_user->passport); 245 if(!GAIM_BLIST_NODE_IS_CONTACT(cnode))
250 246 continue;
251 if (remote_user == NULL || 247 for(bnode = cnode->child; bnode; bnode = bnode->next) {
252 ((local_user->list_op & ( 1 << MSN_LIST_FL)) && 248 GaimBuddy *b;
253 !(remote_user->list_op & ( 1 << MSN_LIST_FL)))) 249 if(!GAIM_BLIST_NODE_IS_BUDDY(bnode))
254 { 250 continue;
255 /* The user was not on the server list */ 251 b = (GaimBuddy *)bnode;
256 msn_show_sync_issue(session, local_user->passport, NULL); 252 if(b->account == gc->account) {
257 } 253 MsnUser *remote_user;
258 else
259 {
260 GList *l;
261
262 for (l = local_user->group_ids; l != NULL; l = l->next)
263 {
264 const char *group_name;
265 int gid;
266 gboolean found = FALSE; 254 gboolean found = FALSE;
267 GList *l2; 255
268 256 remote_user = msn_userlist_find_user(session->userlist, b->name);
269 group_name = 257
270 msn_userlist_find_group_name(local_user->userlist, 258 if ((remote_user != NULL) && (remote_user->list_op & MSN_LIST_FL_OP))
271 GPOINTER_TO_INT(l->data));
272
273 gid = msn_userlist_find_group_id(remote_user->userlist,
274 group_name);
275
276 for (l2 = remote_user->group_ids; l2 != NULL; l2 = l2->next)
277 { 259 {
278 if (GPOINTER_TO_INT(l2->data) == gid) 260 int group_id;
261 GList *l;
262
263 group_id = msn_userlist_find_group_id(remote_user->userlist,
264 group_name);
265
266 for (l = remote_user->group_ids; l != NULL; l = l->next)
279 { 267 {
280 found = TRUE; 268 if (group_id == GPOINTER_TO_INT(l->data))
281 break; 269 {
270 found = TRUE;
271 break;
272 }
282 } 273 }
274
283 } 275 }
284 276
285 if (!found) 277 if (!found)
286 { 278 {
287 /* The user was not on that group on the server list */ 279 /* The user was not on the server list or not in that group
288 msn_show_sync_issue(session, local_user->passport, 280 * on the server list */
289 group_name); 281 msn_show_sync_issue(session, b->name, group_name);
290 } 282 }
291 } 283 }
292 } 284 }
293 } 285 }
294 286 }
295 l = l->next;
296 }
297
298 msn_userlist_destroy(session->sync_userlist);
299 session->sync_userlist = NULL;
300 } 287 }
301 288
302 void 289 void
303 msn_session_set_error(MsnSession *session, MsnErrorType error, 290 msn_session_set_error(MsnSession *session, MsnErrorType error,
304 const char *info) 291 const char *info)
414 msn_user_set_buddy_icon(session->user, icon); 401 msn_user_set_buddy_icon(session->user, icon);
415 g_free(icon); 402 g_free(icon);
416 403
417 session->logged_in = TRUE; 404 session->logged_in = TRUE;
418 405
419 msn_change_status(session, session->state == 0 ? MSN_ONLINE : session->state); 406 msn_change_status(session);
420 407
421 gaim_connection_set_state(gc, GAIM_CONNECTED); 408 gaim_connection_set_state(gc, GAIM_CONNECTED);
422 409
423 /* Sync users */ 410 /* Sync users */
424 msn_session_sync_users(session); 411 msn_session_sync_users(session);