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;