Mercurial > pidgin
comparison libpurple/protocols/msn/contact.c @ 20439:bee467c81570
A bunch of MSNP14 stuff:
Don't store the group id on the group blist node.
Fix & tidy up payload length detection for commands (errors can have payloads too)
Avoid a crash when connecting to a new account with no contact list
Tidy up addressbook parsing slightly
Fix crashes when buddy list sync issues are detected
Fix initial email notifications, Fixes #1293
Plug a few memory leaks
Detect OIM authentication failures correctly
NOTE: I have disabled dynamic address book retrieval, instead we now
receive the whole address book. This is because the blist sync stuff is
still very wonky.
author | Stu Tomlinson <stu@nosnilmot.com> |
---|---|
date | Sun, 27 May 2007 17:00:06 +0000 |
parents | 703fc3437ab5 |
children | 5ecaa00090d7 |
comparison
equal
deleted
inserted
replaced
20438:0d67ac110e2b | 20439:bee467c81570 |
---|---|
171 purple_debug_misc("MSNCL","LastChangeNode0 %s\n",LastChangeStr); | 171 purple_debug_misc("MSNCL","LastChangeNode0 %s\n",LastChangeStr); |
172 purple_account_set_string(session->account, "CLLastChange",LastChangeStr); | 172 purple_account_set_string(session->account, "CLLastChange",LastChangeStr); |
173 purple_debug_misc("MSNCL","LastChangeNode %s\n",LastChangeStr); | 173 purple_debug_misc("MSNCL","LastChangeNode %s\n",LastChangeStr); |
174 | 174 |
175 memberships =xmlnode_get_child(service,"Memberships"); | 175 memberships =xmlnode_get_child(service,"Memberships"); |
176 if (memberships == NULL) { | |
177 xmlnode_free(node); | |
178 return; | |
179 } | |
176 purple_debug_misc("MSNCL","memberships{%p},name:%s\n",memberships,memberships->name); | 180 purple_debug_misc("MSNCL","memberships{%p},name:%s\n",memberships,memberships->name); |
177 for(membershipnode = xmlnode_get_child(memberships, "Membership"); membershipnode; | 181 for(membershipnode = xmlnode_get_child(memberships, "Membership"); membershipnode; |
178 membershipnode = xmlnode_get_next_twin(membershipnode)){ | 182 membershipnode = xmlnode_get_next_twin(membershipnode)){ |
179 xmlnode *roleNode; | 183 xmlnode *roleNode; |
180 char *role; | 184 char *role; |
242 /*free the read buffer*/ | 246 /*free the read buffer*/ |
243 msn_soap_free_read_buf(soapconn); | 247 msn_soap_free_read_buf(soapconn); |
244 | 248 |
245 abLastChange = purple_account_get_string(session->account, "ablastChange", NULL); | 249 abLastChange = purple_account_get_string(session->account, "ablastChange", NULL); |
246 dynamicItemLastChange = purple_account_get_string(session->account, "dynamicItemLastChange", NULL); | 250 dynamicItemLastChange = purple_account_get_string(session->account, "dynamicItemLastChange", NULL); |
251 | |
252 #ifdef MSN_PARTIAL_ADDRESSBOOK | |
253 /* XXX: this should be enabled when we can correctly do partial | |
254 syncs with the server. Currently we need to retrieve the whole | |
255 list to detect sync issues */ | |
247 msn_get_address_book(contact, abLastChange, dynamicItemLastChange); | 256 msn_get_address_book(contact, abLastChange, dynamicItemLastChange); |
257 #else | |
258 msn_get_address_book(contact, NULL, NULL); | |
259 #endif | |
248 } | 260 } |
249 | 261 |
250 static void | 262 static void |
251 msn_get_contact_written_cb(gpointer data, gint source, PurpleInputCondition cond) | 263 msn_get_contact_written_cb(gpointer data, gint source, PurpleInputCondition cond) |
252 { | 264 { |
281 msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init); | 293 msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init); |
282 g_free(update_str); | 294 g_free(update_str); |
283 g_free(body); | 295 g_free(body); |
284 } | 296 } |
285 | 297 |
286 static gboolean | 298 static void |
287 msn_parse_addressbook(MsnContact * contact) | 299 msn_parse_addressbook_groups(MsnContact *contact, xmlnode *node) |
288 { | 300 { |
289 MsnSession * session; | 301 MsnSession *session = contact->session; |
290 xmlnode * node,*body,*response,*result; | 302 xmlnode *group; |
291 xmlnode *groups,*group,*groupname,*groupId,*groupInfo; | 303 |
292 xmlnode *contacts,*contactNode,*contactId,*contactInfo,*contactType,*passportName,*displayName,*groupIds,*guid; | 304 for(group = xmlnode_get_child(node, "Group"); group; |
293 xmlnode *abNode; | |
294 char *group_name,*group_id; | |
295 | |
296 session = contact->session; | |
297 purple_debug_misc("xml","parse addressbook:{%s}\nsize:%d\n",contact->soapconn->body,contact->soapconn->body_len); | |
298 node = xmlnode_from_str(contact->soapconn->body, contact->soapconn->body_len); | |
299 | |
300 if(node == NULL){ | |
301 purple_debug_misc("xml","parse from str err!\n"); | |
302 return FALSE; | |
303 } | |
304 purple_debug_misc("xml","node{%p},name:%s,child:%s,last:%s\n",node,node->name,node->child->name,node->lastchild->name); | |
305 body = xmlnode_get_child(node,"Body"); | |
306 purple_debug_misc("xml","body{%p},name:%s\n",body,body->name); | |
307 response = xmlnode_get_child(body,"ABFindAllResponse"); | |
308 | |
309 if (response == NULL) { | |
310 return FALSE; | |
311 } | |
312 | |
313 purple_debug_misc("xml","response{%p},name:%s\n",response,response->name); | |
314 result =xmlnode_get_child(response,"ABFindAllResult"); | |
315 if(result == NULL){ | |
316 purple_debug_misc("MSNAB","receive no address book update\n"); | |
317 return TRUE; | |
318 } | |
319 purple_debug_misc("xml","result{%p},name:%s\n",result,result->name); | |
320 | |
321 /*Process Group List*/ | |
322 groups =xmlnode_get_child(result,"groups"); | |
323 for(group = xmlnode_get_child(groups, "Group"); group; | |
324 group = xmlnode_get_next_twin(group)){ | 305 group = xmlnode_get_next_twin(group)){ |
306 xmlnode *groupId, *groupInfo, *groupname; | |
307 char *group_id, *group_name; | |
308 | |
325 groupId = xmlnode_get_child(group,"groupId"); | 309 groupId = xmlnode_get_child(group,"groupId"); |
326 group_id = xmlnode_get_data(groupId); | 310 group_id = xmlnode_get_data(groupId); |
327 groupInfo = xmlnode_get_child(group,"groupInfo"); | 311 groupInfo = xmlnode_get_child(group,"groupInfo"); |
328 groupname = xmlnode_get_child(groupInfo,"name"); | 312 groupname = xmlnode_get_child(groupInfo,"name"); |
329 group_name = xmlnode_get_data(groupname); | 313 group_name = xmlnode_get_data(groupname); |
336 } | 320 } |
337 | 321 |
338 purple_debug_misc("MsnAB","group_id:%s name:%s\n",group_id,group_name); | 322 purple_debug_misc("MsnAB","group_id:%s name:%s\n",group_id,group_name); |
339 if ((purple_find_group(group_name)) == NULL){ | 323 if ((purple_find_group(group_name)) == NULL){ |
340 PurpleGroup *g = purple_group_new(group_name); | 324 PurpleGroup *g = purple_group_new(group_name); |
341 purple_blist_node_set_string(&(g->node),"groupId",group_id); | |
342 purple_blist_add_group(g, NULL); | 325 purple_blist_add_group(g, NULL); |
343 } | 326 } |
344 g_free(group_id); | 327 g_free(group_id); |
345 g_free(group_name); | 328 g_free(group_name); |
346 } | 329 } |
347 /*add a default No group to set up the no group Membership*/ | 330 } |
348 group_id = g_strdup(MSN_INDIVIDUALS_GROUP_ID); | 331 |
349 group_name = g_strdup(MSN_INDIVIDUALS_GROUP_NAME); | 332 static void |
350 msn_group_new(session->userlist,group_id , group_name); | 333 msn_parse_addressbook_contacts(MsnContact *contact, xmlnode *node) |
351 if (group_id != NULL){ | 334 { |
352 purple_debug_misc("MsnAB","group_id:%s name:%s,value:%d\n",group_id,group_name,*group_name=='\0'); | 335 MsnSession *session = contact->session; |
353 if ((purple_find_group(group_name)) == NULL){ | 336 xmlnode *contactNode; |
354 PurpleGroup *g = purple_group_new(group_name); | 337 |
355 purple_blist_add_group(g, NULL); | 338 for(contactNode = xmlnode_get_child(node, "Contact"); contactNode; |
356 } | |
357 } | |
358 g_free(group_name); | |
359 g_free(group_id); | |
360 | |
361 /*add a default No group to set up the no group Membership*/ | |
362 group_id = g_strdup(MSN_NON_IM_GROUP_ID); | |
363 group_name = g_strdup(MSN_NON_IM_GROUP_NAME); | |
364 msn_group_new(session->userlist,group_id , group_name); | |
365 if (group_id != NULL){ | |
366 purple_debug_misc("MsnAB","group_id:%s name:%s,value:%d\n",group_id,group_name,*group_name=='\0'); | |
367 if ((purple_find_group(group_name)) == NULL){ | |
368 PurpleGroup *g = purple_group_new(group_name); | |
369 purple_blist_add_group(g, NULL); | |
370 } | |
371 } | |
372 g_free(group_name); | |
373 g_free(group_id); | |
374 | |
375 /*Process contact List*/ | |
376 purple_debug_info("MSNAB","process contact list...\n"); | |
377 contacts =xmlnode_get_child(result,"contacts"); | |
378 for(contactNode = xmlnode_get_child(contacts, "Contact"); contactNode; | |
379 contactNode = xmlnode_get_next_twin(contactNode)){ | 339 contactNode = xmlnode_get_next_twin(contactNode)){ |
340 xmlnode *contactId,*contactInfo,*contactType,*passportName,*displayName,*guid; | |
341 xmlnode *groupIds; | |
380 MsnUser *user; | 342 MsnUser *user; |
381 char *passport,*Name,*uid,*type; | 343 char *passport,*Name,*uid,*type; |
382 | 344 |
383 passport = NULL; | 345 passport = NULL; |
384 | 346 |
442 | 404 |
443 displayName = xmlnode_get_child(contactInfo,"displayName"); | 405 displayName = xmlnode_get_child(contactInfo,"displayName"); |
444 if(displayName == NULL){ | 406 if(displayName == NULL){ |
445 Name = g_strdup(passport); | 407 Name = g_strdup(passport); |
446 }else{ | 408 }else{ |
447 Name =xmlnode_get_data(displayName); | 409 Name =xmlnode_get_data(displayName); |
448 } | 410 } |
449 | 411 |
450 purple_debug_misc("MsnAB","passport:{%s} uid:{%s} display:{%s}\n", | 412 purple_debug_misc("MsnAB","passport:{%s} uid:{%s} display:{%s}\n", |
451 passport,uid,Name); | 413 passport,uid,Name); |
452 | 414 |
453 user = msn_userlist_find_add_user(session->userlist, passport,Name); | 415 user = msn_userlist_find_add_user(session->userlist, passport,Name); |
454 msn_user_set_uid(user,uid); | 416 msn_user_set_uid(user,uid); |
455 msn_user_set_type(user,msn_get_user_type(type)); | 417 msn_user_set_type(user,msn_get_user_type(type)); |
456 user->list_op |= MSN_LIST_FL_OP; | |
457 g_free(Name); | 418 g_free(Name); |
458 g_free(passport); | 419 g_free(passport); |
459 g_free(uid); | 420 g_free(uid); |
460 g_free(type); | 421 g_free(type); |
461 | 422 |
462 purple_debug_misc("MsnAB","parse guid...\n"); | 423 purple_debug_misc("MsnAB","parse guid...\n"); |
463 groupIds = xmlnode_get_child(contactInfo,"groupIds"); | 424 groupIds = xmlnode_get_child(contactInfo,"groupIds"); |
464 if(groupIds){ | 425 if(groupIds){ |
465 for(guid = xmlnode_get_child(groupIds, "guid");guid; | 426 for(guid = xmlnode_get_child(groupIds, "guid");guid; |
466 guid = xmlnode_get_next_twin(guid)){ | 427 guid = xmlnode_get_next_twin(guid)){ |
428 char *group_id; | |
467 group_id = xmlnode_get_data(guid); | 429 group_id = xmlnode_get_data(guid); |
468 msn_user_add_group_id(user,group_id); | 430 msn_user_add_group_id(user,group_id); |
469 purple_debug_misc("MsnAB","guid:%s\n",group_id); | 431 purple_debug_misc("MsnAB","guid:%s\n",group_id); |
470 g_free(group_id); | 432 g_free(group_id); |
471 } | 433 } |
472 }else{ | 434 }else{ |
473 /*not in any group,Then set default group*/ | 435 /*not in any group,Then set default group*/ |
474 group_id = g_strdup(MSN_INDIVIDUALS_GROUP_ID); | 436 msn_user_add_group_id(user, MSN_INDIVIDUALS_GROUP_ID); |
475 msn_user_add_group_id(user,group_id); | |
476 g_free(group_id); | |
477 } | 437 } |
438 | |
439 msn_got_lst_user(session, user, MSN_LIST_FL_OP, NULL); | |
440 } | |
441 } | |
442 | |
443 static gboolean | |
444 msn_parse_addressbook(MsnContact * contact) | |
445 { | |
446 MsnSession * session; | |
447 xmlnode * node,*body,*response,*result; | |
448 xmlnode *groups; | |
449 xmlnode *contacts; | |
450 xmlnode *abNode; | |
451 | |
452 session = contact->session; | |
453 purple_debug_misc("xml","parse addressbook:{%s}\nsize:%d\n",contact->soapconn->body,contact->soapconn->body_len); | |
454 node = xmlnode_from_str(contact->soapconn->body, contact->soapconn->body_len); | |
455 | |
456 if(node == NULL){ | |
457 purple_debug_misc("xml","parse from str err!\n"); | |
458 return FALSE; | |
459 } | |
460 purple_debug_misc("xml","node{%p},name:%s,child:%s,last:%s\n",node,node->name,node->child->name,node->lastchild->name); | |
461 body = xmlnode_get_child(node,"Body"); | |
462 purple_debug_misc("xml","body{%p},name:%s\n",body,body->name); | |
463 response = xmlnode_get_child(body,"ABFindAllResponse"); | |
464 | |
465 if (response == NULL) { | |
466 return FALSE; | |
467 } | |
468 | |
469 purple_debug_misc("xml","response{%p},name:%s\n",response,response->name); | |
470 result =xmlnode_get_child(response,"ABFindAllResult"); | |
471 if(result == NULL){ | |
472 purple_debug_misc("MSNAB","receive no address book update\n"); | |
473 return TRUE; | |
474 } | |
475 purple_debug_misc("xml","result{%p},name:%s\n",result,result->name); | |
476 | |
477 /*Process Group List*/ | |
478 groups = xmlnode_get_child(result,"groups"); | |
479 if (groups != NULL) { | |
480 msn_parse_addressbook_groups(contact, groups); | |
481 } | |
482 | |
483 /*add a default No group to set up the no group Membership*/ | |
484 msn_group_new(session->userlist, MSN_INDIVIDUALS_GROUP_ID, | |
485 MSN_INDIVIDUALS_GROUP_NAME); | |
486 purple_debug_misc("MsnAB","group_id:%s name:%s\n", | |
487 MSN_INDIVIDUALS_GROUP_ID, MSN_INDIVIDUALS_GROUP_NAME); | |
488 if ((purple_find_group(MSN_INDIVIDUALS_GROUP_NAME)) == NULL){ | |
489 PurpleGroup *g = purple_group_new(MSN_INDIVIDUALS_GROUP_NAME); | |
490 purple_blist_add_group(g, NULL); | |
491 } | |
492 | |
493 /*add a default No group to set up the no group Membership*/ | |
494 msn_group_new(session->userlist, MSN_NON_IM_GROUP_ID, MSN_NON_IM_GROUP_NAME); | |
495 purple_debug_misc("MsnAB","group_id:%s name:%s\n", MSN_NON_IM_GROUP_ID, MSN_NON_IM_GROUP_NAME); | |
496 if ((purple_find_group(MSN_NON_IM_GROUP_NAME)) == NULL){ | |
497 PurpleGroup *g = purple_group_new(MSN_NON_IM_GROUP_NAME); | |
498 purple_blist_add_group(g, NULL); | |
499 } | |
500 | |
501 /*Process contact List*/ | |
502 purple_debug_info("MSNAB","process contact list...\n"); | |
503 contacts =xmlnode_get_child(result,"contacts"); | |
504 if (contacts != NULL) { | |
505 msn_parse_addressbook_contacts(contact, contacts); | |
478 } | 506 } |
479 | 507 |
480 abNode =xmlnode_get_child(result,"ab"); | 508 abNode =xmlnode_get_child(result,"ab"); |
481 if(abNode != NULL){ | 509 if(abNode != NULL){ |
482 xmlnode *LastChangeNode, *DynamicItemLastChangedNode; | 510 xmlnode *LastChangeNode, *DynamicItemLastChangedNode; |