Mercurial > pidgin
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, |