comparison libpurple/protocols/msn/contact.c @ 20671:4dd60add6a7c

Further cleanup of the msn prpl including preventing the authorization request callback from crashing if triggered after the account is disconnected. Also removal of some extraneous debuggery, there is more that needs to be removed.
author Daniel Atallah <daniel.atallah@gmail.com>
date Fri, 28 Sep 2007 01:57:55 +0000
parents 0e1bc5c51030
children 48ee7ec3426d 8e53c75bb87c
comparison
equal deleted inserted replaced
20670:6b9e964f0572 20671:4dd60add6a7c
472 MsnUser *user = NULL; 472 MsnUser *user = NULL;
473 xmlnode *typeNode, *membershipIdNode = NULL; 473 xmlnode *typeNode, *membershipIdNode = NULL;
474 gchar *type, *membershipId = NULL; 474 gchar *type, *membershipId = NULL;
475 const char *member_type = xmlnode_get_attrib(member, "type"); 475 const char *member_type = xmlnode_get_attrib(member, "type");
476 476
477 purple_debug_info("MSNCL","Member type: %s\n", member_type ? member_type : "(null)"); 477 if (!member_type) {
478 478 purple_debug_error("msn", "No Member Type specified for Member.\n");
479 if (!member_type)
480 continue; 479 continue;
480 }
481 481
482 if(!g_strcasecmp(member_type, "PassportMember") ) { 482 if(!g_strcasecmp(member_type, "PassportMember") ) {
483 passport = type = NULL; 483 passport = type = NULL;
484 if ((passportNode = xmlnode_get_child(member, "PassportName"))) 484 if ((passportNode = xmlnode_get_child(member, "PassportName")))
485 passport = xmlnode_get_data(passportNode); 485 passport = xmlnode_get_data(passportNode);
502 } 502 }
503 503
504 msn_got_lst_user(session, user, list_op, NULL); 504 msn_got_lst_user(session, user, list_op, NULL);
505 } 505 }
506 else if (!g_strcasecmp(member_type, "PhoneMember")) { 506 else if (!g_strcasecmp(member_type, "PhoneMember")) {
507 purple_debug_info("msn", "Recieved Phone Member; ignoring.\n");
507 } 508 }
508 else if (!g_strcasecmp(member_type, "EmailMember")) { 509 else if (!g_strcasecmp(member_type, "EmailMember")) {
509 xmlnode *emailNode; 510 xmlnode *emailNode;
510 passport = NULL; 511 passport = NULL;
511 512
524 g_free(membershipId); 525 g_free(membershipId);
525 } 526 }
526 } 527 }
527 528
528 msn_got_lst_user(session, user, list_op, NULL); 529 msn_got_lst_user(session, user, list_op, NULL);
530 } else {
531 purple_debug_info("msn", "Unknown Member type: %s\n", member_type);
529 } 532 }
530 } 533 }
531 } 534 }
532 g_free(typedata); /* Free 'Type' node data after processing 'Messenger' Service */ 535 g_free(typedata); /* Free 'Type' node data after processing 'Messenger' Service */
533 } 536 }
592 /* SOAP get contact list*/ 595 /* SOAP get contact list*/
593 void 596 void
594 msn_get_contact_list(MsnContact * contact, const MsnSoapPartnerScenario partner_scenario, const char *update_time) 597 msn_get_contact_list(MsnContact * contact, const MsnSoapPartnerScenario partner_scenario, const char *update_time)
595 { 598 {
596 MsnSoapReq *soap_request; 599 MsnSoapReq *soap_request;
597 gchar *body = NULL; 600 gchar *body;
598 gchar * update_str; 601 gchar *update_str = NULL;
599 const gchar *partner_scenario_str = MsnSoapPartnerScenarioText[partner_scenario]; 602 const gchar *partner_scenario_str = MsnSoapPartnerScenarioText[partner_scenario];
600 603
601 purple_debug_misc("MSNCL","Getting Contact List.\n"); 604 purple_debug_misc("MSNCL","Getting Contact List.\n");
602 605
603 if ( update_time != NULL ) { 606 if ( update_time != NULL ) {
604 purple_debug_info("MSNCL","Last update time: %s\n",update_time); 607 purple_debug_info("MSNCL","Last update time: %s\n",update_time);
605 update_str = g_strdup_printf(MSN_GET_CONTACT_UPDATE_XML,update_time); 608 update_str = g_strdup_printf(MSN_GET_CONTACT_UPDATE_XML,update_time);
606 } else { 609 }
607 update_str = g_strdup(""); 610
608 } 611 body = g_strdup_printf(MSN_GET_CONTACT_TEMPLATE, partner_scenario_str, update_str ? update_str : "");
609
610 body = g_strdup_printf(MSN_GET_CONTACT_TEMPLATE, partner_scenario_str, update_str);
611 g_free(update_str); 612 g_free(update_str);
612 613
613 soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, 614 soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
614 MSN_GET_CONTACT_POST_URL, 615 MSN_GET_CONTACT_POST_URL,
615 MSN_GET_CONTACT_SOAP_ACTION, 616 MSN_GET_CONTACT_SOAP_ACTION,
631 purple_debug_info("MsnAb","msn_parse_addressbook_groups()\n"); 632 purple_debug_info("MsnAb","msn_parse_addressbook_groups()\n");
632 633
633 for(group = xmlnode_get_child(node, "Group"); group; 634 for(group = xmlnode_get_child(node, "Group"); group;
634 group = xmlnode_get_next_twin(group)){ 635 group = xmlnode_get_next_twin(group)){
635 xmlnode *groupId, *groupInfo, *groupname; 636 xmlnode *groupId, *groupInfo, *groupname;
636 char *group_id, *group_name; 637 char *group_id = NULL, *group_name = NULL;
637 638
638 groupId = xmlnode_get_child(group,"groupId"); 639 if ((groupId = xmlnode_get_child(group, "groupId")))
639 group_id = xmlnode_get_data(groupId); 640 group_id = xmlnode_get_data(groupId);
640 groupInfo = xmlnode_get_child(group,"groupInfo"); 641 if ((groupInfo = xmlnode_get_child(group, "groupInfo")) && (groupname = xmlnode_get_child(groupInfo, "name")))
641 groupname = xmlnode_get_child(groupInfo,"name"); 642 group_name = xmlnode_get_data(groupname);
642 group_name = xmlnode_get_data(groupname);
643 643
644 msn_group_new(session->userlist, group_id, group_name); 644 msn_group_new(session->userlist, group_id, group_name);
645 645
646 if (group_id == NULL){ 646 if (group_id == NULL){
647 /* Group of ungroupped buddies */ 647 /* Group of ungroupped buddies */
648 g_free(group_name); 648 g_free(group_name);
649 continue; 649 continue;
650 } 650 }
651 651
652 purple_debug_info("MsnAB","group_id: %s, name: %s\n",group_id,group_name); 652 purple_debug_info("MsnAB","group_id: %s, name: %s\n", group_id, group_name ? group_name : "(null)");
653 if ((purple_find_group(group_name)) == NULL){ 653 if ((purple_find_group(group_name)) == NULL){
654 PurpleGroup *g = purple_group_new(group_name); 654 PurpleGroup *g = purple_group_new(group_name);
655 purple_blist_add_group(g, NULL); 655 purple_blist_add_group(g, NULL);
656 } 656 }
657 g_free(group_id); 657 g_free(group_id);
754 754
755 user = msn_userlist_find_add_user(session->userlist, passport, Name); 755 user = msn_userlist_find_add_user(session->userlist, passport, Name);
756 msn_user_set_uid(user, uid); 756 msn_user_set_uid(user, uid);
757 msn_user_set_type(user, usertype); 757 msn_user_set_type(user, usertype);
758 758
759 purple_debug_misc("MsnAB","parse guid...\n");
760 groupIds = xmlnode_get_child(contactInfo, "groupIds"); 759 groupIds = xmlnode_get_child(contactInfo, "groupIds");
761 if (groupIds) { 760 if (groupIds) {
762 for (guid = xmlnode_get_child(groupIds, "guid"); guid; 761 for (guid = xmlnode_get_child(groupIds, "guid"); guid;
763 guid = xmlnode_get_next_twin(guid)){ 762 guid = xmlnode_get_next_twin(guid)){
764 char *group_id = xmlnode_get_data(guid); 763 char *group_id = xmlnode_get_data(guid);
765 msn_user_add_group_id(user, group_id); 764 msn_user_add_group_id(user, group_id);
766 purple_debug_misc("MsnAB", "guid:%s\n", group_id ? group_id : "(null)"); 765 purple_debug_misc("MsnAB", "guid:%s\n", group_id ? group_id : "(null)");
767 g_free(group_id); 766 g_free(group_id);
768 } 767 }
769 } else { 768 } else {
769 purple_debug_info("msn", "User not in any groups, adding to default group.\n");
770 /*not in any group,Then set default group*/ 770 /*not in any group,Then set default group*/
771 msn_user_add_group_id(user, MSN_INDIVIDUALS_GROUP_ID); 771 msn_user_add_group_id(user, MSN_INDIVIDUALS_GROUP_ID);
772 } 772 }
773 773
774 msn_got_lst_user(session, user, MSN_LIST_FL_OP, NULL); 774 msn_got_lst_user(session, user, MSN_LIST_FL_OP, NULL);
781 } 781 }
782 782
783 static gboolean 783 static gboolean
784 msn_parse_addressbook(MsnContact * contact) 784 msn_parse_addressbook(MsnContact * contact)
785 { 785 {
786 MsnSession * session; 786 MsnSession *session;
787 xmlnode * node,*body,*response,*result; 787 xmlnode * node,*body,*response,*result;
788 xmlnode *groups; 788 xmlnode *groups;
789 xmlnode *contacts; 789 xmlnode *contacts;
790 xmlnode *abNode; 790 xmlnode *abNode;
791 xmlnode *fault, *faultstringnode, *faultdetail, *errorcode; 791 xmlnode *fault, *faultstringnode, *faultdetail, *errorcode;
792 792
793 session = contact->session; 793 session = contact->session;
794
795
796 794
797 node = xmlnode_from_str(contact->soapconn->body, contact->soapconn->body_len); 795 node = xmlnode_from_str(contact->soapconn->body, contact->soapconn->body_len);
798 if ( node == NULL ) { 796 if ( node == NULL ) {
799 purple_debug_error("MSN AddressBook","Error parsing Address Book with size %d\n", contact->soapconn->body_len); 797 purple_debug_error("MSN AddressBook","Error parsing Address Book with size %d\n", contact->soapconn->body_len);
800 return FALSE; 798 return FALSE;
801 } 799 }
802 800
803 purple_debug_misc("MSN AddressBook", "Parsing Address Book with size %d\n", contact->soapconn->body_len); 801 purple_debug_misc("MSN AddressBook", "Parsing Address Book with size %d\n", contact->soapconn->body_len);
804 802
805 purple_debug_misc("MSN AddressBook","node{%p},name:%s,child:%s,last:%s\n",node,node->name,node->child->name,node->lastchild->name); 803 purple_debug_misc("MSN AddressBook","node{%p},name:%s,child:%s,last:%s\n", node,
806 804 node->name ? node->name : "(null)",
805 (node->child && node->child->name) ? node->child->name : "(null)",
806 (node->lastchild && node->lastchild->name) ? node->lastchild->name : "(null)");
807
807 body = xmlnode_get_child(node,"Body"); 808 body = xmlnode_get_child(node,"Body");
808 purple_debug_misc("MSN AddressBook","body{%p},name:%s\n",body,body->name); 809 purple_debug_misc("MSN AddressBook","body{%p},name:%s\n",body,body->name);
809 810
810 /* TODO: This appears to be used in a number of places and should be de-duplicated */ 811 /* TODO: This appears to be used in a number of places and should be de-duplicated */
811 if ( (fault = xmlnode_get_child(body, "Fault")) != NULL) { 812 if ( (fault = xmlnode_get_child(body, "Fault")) != NULL) {
1399 1400
1400 void 1401 void
1401 msn_update_contact(MsnContact *contact, const char* nickname) 1402 msn_update_contact(MsnContact *contact, const char* nickname)
1402 { 1403 {
1403 MsnSoapReq *soap_request; 1404 MsnSoapReq *soap_request;
1404 gchar *body = NULL, *escaped_nickname; 1405 gchar *body, *escaped_nickname;
1406
1407 /* I'm not sure this is right, but if it isn't, the rest of this function will need to be fixed */
1408 g_return_if_fail(nickname != NULL);
1405 1409
1406 purple_debug_info("MSN CL","Update contact information with new friendly name: %s\n", nickname); 1410 purple_debug_info("MSN CL","Update contact information with new friendly name: %s\n", nickname);
1407 1411
1408 escaped_nickname = g_markup_escape_text(nickname, -1); 1412 escaped_nickname = g_markup_escape_text(nickname, -1);
1409 1413
1410 body = g_strdup_printf(MSN_CONTACT_UPDATE_TEMPLATE, escaped_nickname); 1414 body = g_strdup_printf(MSN_CONTACT_UPDATE_TEMPLATE, escaped_nickname);
1411 1415
1412 g_free(escaped_nickname); 1416 g_free(escaped_nickname);
1413 /*build SOAP and POST it*/ 1417 /*build SOAP and POST it*/
1414 soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, 1418 soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
1415 MSN_ADDRESS_BOOK_POST_URL, 1419 MSN_ADDRESS_BOOK_POST_URL,
1416 MSN_CONTACT_UPDATE_SOAP_ACTION, 1420 MSN_CONTACT_UPDATE_SOAP_ACTION,