Mercurial > pidgin
comparison libpurple/protocols/msn/contact.c @ 20479:6a8463be5b23
Improve MSN_SOAP_DEBUG and workaround a Win32 bug which would case Pidgin to consume insane amounts of memory when printing a large string to the Debug Window.
author | Carlos Silva <typ0@pidgin.im> |
---|---|
date | Wed, 08 Aug 2007 23:01:44 +0000 |
parents | 9a2a4a0c0003 |
children | eb93710aec4d |
comparison
equal
deleted
inserted
replaced
20478:c1c4468207fa | 20479:6a8463be5b23 |
---|---|
179 static void | 179 static void |
180 msn_parse_contact_list(MsnContact * contact) | 180 msn_parse_contact_list(MsnContact * contact) |
181 { | 181 { |
182 MsnSession * session; | 182 MsnSession * session; |
183 int list_op = 0; | 183 int list_op = 0; |
184 char * passport, *debugdata, *typedata; | 184 char * passport, *typedata; |
185 xmlnode *fault, *faultstringnode, *faultdetail, *errorcode; | 185 xmlnode *fault, *faultstringnode, *faultdetail, *errorcode; |
186 xmlnode *node, *body, *response, *result, *services; | 186 xmlnode *node, *body, *response, *result, *services; |
187 xmlnode *service, *memberships, *info, *handle, *handletype; | 187 xmlnode *service, *memberships, *info, *handle, *handletype; |
188 xmlnode *LastChangeNode; | 188 xmlnode *LastChangeNode; |
189 xmlnode *membershipnode, *members, *member, *passportNode; | 189 xmlnode *membershipnode, *members, *member, *passportNode; |
190 char *LastChangeStr; | 190 char *LastChangeStr; |
191 | 191 |
192 purple_debug_info("::","msn_parse_contact_list()\n"); | |
193 | |
194 session = contact->session; | 192 session = contact->session; |
195 node = xmlnode_from_str(contact->soapconn->body, contact->soapconn->body_len); | 193 node = xmlnode_from_str(contact->soapconn->body, contact->soapconn->body_len); |
196 | 194 |
197 if (node == NULL) { | 195 if (node == NULL) { |
198 purple_debug_error("MSNCL","Unable to parse SOAP data!\n"); | 196 purple_debug_error("MSNCL","Unable to parse SOAP data!\n"); |
199 return; | 197 return; |
200 } | 198 } |
201 | 199 |
202 #ifdef MSN_SOAP_DEBUG | 200 purple_debug_misc("MSNCL","Parsing contact list with size %d\n", contact->soapconn->body_len); |
203 debugdata = xmlnode_to_formatted_str(node, NULL); | 201 |
204 purple_debug_info("MSNCL","Received contact list, parsing:\n%s", debugdata); | 202 purple_debug_misc("MSNCL","Root node @ %p: Name: '%s', child: '%s', lastchild: '%s'\n",node,node->name,node->child->name,node->lastchild->name); |
205 g_free(debugdata); | |
206 #endif | |
207 | |
208 | |
209 purple_debug_info("MSNCL","Root node @ %p: Name: '%s', child: '%s', lastchild: '%s'\n",node,node->name,node->child->name,node->lastchild->name); | |
210 body = xmlnode_get_child(node,"Body"); | 203 body = xmlnode_get_child(node,"Body"); |
211 | 204 |
212 if (body == NULL) { | 205 if (body == NULL) { |
213 purple_debug_warning("MSNCL", "Failed to parse contact list Body node\n"); | 206 purple_debug_warning("MSNCL", "Failed to parse contact list Body node\n"); |
214 xmlnode_free(node); | 207 xmlnode_free(node); |
219 /* Did we receive a <Fault> ? */ | 212 /* Did we receive a <Fault> ? */ |
220 if ( (fault = xmlnode_get_child(body, "Fault")) != NULL) { | 213 if ( (fault = xmlnode_get_child(body, "Fault")) != NULL) { |
221 purple_debug_info("MSNCL","Fault received from SOAP server!\n"); | 214 purple_debug_info("MSNCL","Fault received from SOAP server!\n"); |
222 | 215 |
223 if ( (faultstringnode = xmlnode_get_child(fault, "faultstring")) != NULL ) { | 216 if ( (faultstringnode = xmlnode_get_child(fault, "faultstring")) != NULL ) { |
224 gchar * faultstring = xmlnode_get_data(faultstring); | 217 gchar * faultstring = xmlnode_get_data(faultstringnode); |
225 purple_debug_info("MSNCL","Faultstring: %s\n", faultstring); | 218 purple_debug_info("MSNCL","Faultstring: %s\n", faultstring); |
226 g_free(faultstring); | 219 g_free(faultstring); |
227 } | 220 } |
228 if ( (faultdetail = xmlnode_get_child(fault, "detail")) != NULL ) { | 221 if ( (faultdetail = xmlnode_get_child(fault, "detail")) != NULL ) { |
229 purple_debug_info("MSNCL","detail @ %p, name: %s\n",faultdetail, faultdetail->name); | 222 purple_debug_info("MSNCL","detail @ %p, name: %s\n",faultdetail, faultdetail->name); |
390 MsnContact *contact; | 383 MsnContact *contact; |
391 MsnSession *session; | 384 MsnSession *session; |
392 const char *abLastChange; | 385 const char *abLastChange; |
393 const char *dynamicItemLastChange; | 386 const char *dynamicItemLastChange; |
394 | 387 |
395 purple_debug_info("::","msn_get_contact_list_cb()\n"); | 388 purple_debug_misc("MSNCL","Got the contact list!\n"); |
396 | 389 |
397 contact = soapconn->parent; | 390 contact = soapconn->parent; |
398 g_return_if_fail(contact != NULL); | 391 g_return_if_fail(contact != NULL); |
399 session = soapconn->session; | 392 session = soapconn->session; |
400 g_return_if_fail(session != NULL); | 393 g_return_if_fail(session != NULL); |
401 | 394 |
402 #ifdef MSN_SOAP_DEBUG | |
403 purple_debug_info("MSNCL", "SOAP server reply: \n%s\n", soapconn->read_buf); | |
404 #endif | |
405 msn_parse_contact_list(contact); | 395 msn_parse_contact_list(contact); |
406 /*free the read buffer*/ | 396 /*free the read buffer*/ |
407 msn_soap_free_read_buf(soapconn); | 397 msn_soap_free_read_buf(soapconn); |
408 | 398 |
409 abLastChange = purple_account_get_string(session->account, "ablastChange", NULL); | 399 abLastChange = purple_account_get_string(session->account, "ablastChange", NULL); |
423 static void | 413 static void |
424 msn_get_contact_written_cb(gpointer data, gint source, PurpleInputCondition cond) | 414 msn_get_contact_written_cb(gpointer data, gint source, PurpleInputCondition cond) |
425 { | 415 { |
426 MsnSoapConn * soapconn = data; | 416 MsnSoapConn * soapconn = data; |
427 | 417 |
428 purple_debug_info("MSNP14","finish contact written\n"); | 418 purple_debug_misc("MSNCL","Sent SOAP request for the contact list.\n"); |
429 soapconn->read_cb = msn_get_contact_list_cb; | 419 soapconn->read_cb = msn_get_contact_list_cb; |
430 // msn_soap_read_cb(data,source,cond); | 420 // msn_soap_read_cb(data,source,cond); |
431 } | 421 } |
432 | 422 |
433 /*SOAP get contact list*/ | 423 /*SOAP get contact list*/ |
436 { | 426 { |
437 MsnSoapReq *soap_request; | 427 MsnSoapReq *soap_request; |
438 char *body = NULL; | 428 char *body = NULL; |
439 char * update_str; | 429 char * update_str; |
440 | 430 |
441 purple_debug_info("::","msn_get_contact_list()\n"); | 431 purple_debug_misc("MSNCL","Getting Contact List.\n"); |
442 | |
443 purple_debug_info("MSNP14","Getting Contact List.\n"); | |
444 if ( update_time != NULL ) { | 432 if ( update_time != NULL ) { |
445 purple_debug_info("MSNCL","last update time:{%s}\n",update_time); | 433 purple_debug_info("MSNCL","Last update time: %s\n",update_time); |
446 update_str = g_strdup_printf(MSN_GET_CONTACT_UPDATE_XML,update_time); | 434 update_str = g_strdup_printf(MSN_GET_CONTACT_UPDATE_XML,update_time); |
447 } else { | 435 } else { |
448 update_str = g_strdup(""); | 436 update_str = g_strdup(""); |
449 } | 437 } |
450 body = g_strdup_printf(MSN_GET_CONTACT_TEMPLATE, update_str); | 438 body = g_strdup_printf(MSN_GET_CONTACT_TEMPLATE, update_str); |
463 msn_parse_addressbook_groups(MsnContact *contact, xmlnode *node) | 451 msn_parse_addressbook_groups(MsnContact *contact, xmlnode *node) |
464 { | 452 { |
465 MsnSession *session = contact->session; | 453 MsnSession *session = contact->session; |
466 xmlnode *group; | 454 xmlnode *group; |
467 | 455 |
468 purple_debug_info("::","msn_parse_addressbook_groups()\n"); | 456 purple_debug_info("MsnAb","msn_parse_addressbook_groups()\n"); |
469 | 457 |
470 for(group = xmlnode_get_child(node, "Group"); group; | 458 for(group = xmlnode_get_child(node, "Group"); group; |
471 group = xmlnode_get_next_twin(group)){ | 459 group = xmlnode_get_next_twin(group)){ |
472 xmlnode *groupId, *groupInfo, *groupname; | 460 xmlnode *groupId, *groupInfo, *groupname; |
473 char *group_id, *group_name; | 461 char *group_id, *group_name; |
622 xmlnode * node,*body,*response,*result; | 610 xmlnode * node,*body,*response,*result; |
623 xmlnode *groups; | 611 xmlnode *groups; |
624 xmlnode *contacts; | 612 xmlnode *contacts; |
625 xmlnode *abNode; | 613 xmlnode *abNode; |
626 xmlnode *fault, *faultstringnode, *faultdetail, *errorcode; | 614 xmlnode *fault, *faultstringnode, *faultdetail, *errorcode; |
627 gchar *printabledata; | |
628 | 615 |
629 session = contact->session; | 616 session = contact->session; |
630 | 617 |
631 | 618 |
632 | 619 |
633 node = xmlnode_from_str(contact->soapconn->body, contact->soapconn->body_len); | 620 node = xmlnode_from_str(contact->soapconn->body, contact->soapconn->body_len); |
634 if ( node == NULL ) { | 621 if ( node == NULL ) { |
635 purple_debug_error("MSN AddressBook","Error parsing received Address Book with size %d:\n \"%s\"\n", contact->soapconn->body_len, contact->soapconn->body); | 622 purple_debug_error("MSN AddressBook","Error parsing Address Book with size %d\n", contact->soapconn->body_len); |
636 return FALSE; | 623 return FALSE; |
637 } | 624 } |
638 | 625 |
639 printabledata = xmlnode_to_formatted_str(node, NULL); | 626 purple_debug_misc("MSN AddressBook", "Parsing Address Book with size %d\n", contact->soapconn->body_len); |
640 purple_debug_misc("MSN AddressBook","Received Address Book with size %d:\n %s\n", contact->soapconn->body_len, (char *) printabledata); | |
641 g_free(printabledata); | |
642 | 627 |
643 purple_debug_misc("MSN AddressBook","node{%p},name:%s,child:%s,last:%s\n",node,node->name,node->child->name,node->lastchild->name); | 628 purple_debug_misc("MSN AddressBook","node{%p},name:%s,child:%s,last:%s\n",node,node->name,node->child->name,node->lastchild->name); |
644 | 629 |
645 body = xmlnode_get_child(node,"Body"); | 630 body = xmlnode_get_child(node,"Body"); |
646 purple_debug_misc("MSN AddressBook","body{%p},name:%s\n",body,body->name); | 631 purple_debug_misc("MSN AddressBook","body{%p},name:%s\n",body,body->name); |
647 | 632 |
648 if ( (fault = xmlnode_get_child(body, "Fault")) != NULL) { | 633 if ( (fault = xmlnode_get_child(body, "Fault")) != NULL) { |
649 purple_debug_info("MSN AddressBook","Fault received from SOAP server!\n"); | 634 purple_debug_info("MSN AddressBook","Fault received from SOAP server!\n"); |
650 | 635 |
651 if ( (faultstringnode = xmlnode_get_child(fault, "faultstring")) != NULL ) { | 636 if ( (faultstringnode = xmlnode_get_child(fault, "faultstring")) != NULL ) { |
652 gchar *faultstring = xmlnode_get_data(faultstring); | 637 gchar *faultstring = xmlnode_get_data(faultstringnode); |
653 purple_debug_info("MSN AddressBook","Faultstring: %s\n", faultstring); | 638 purple_debug_info("MSN AddressBook","Faultstring: %s\n", faultstring); |
654 g_free(faultstring); | 639 g_free(faultstring); |
655 } | 640 } |
656 if ( (faultdetail = xmlnode_get_child(fault, "detail")) != NULL ) { | 641 if ( (faultdetail = xmlnode_get_child(fault, "detail")) != NULL ) { |
657 purple_debug_info("MSN AddressBook","detail @ %p, name: %s\n",faultdetail, faultdetail->name); | 642 purple_debug_info("MSN AddressBook","detail @ %p, name: %s\n",faultdetail, faultdetail->name); |
752 contact = soapconn->parent; | 737 contact = soapconn->parent; |
753 g_return_if_fail(contact != NULL); | 738 g_return_if_fail(contact != NULL); |
754 session = soapconn->session; | 739 session = soapconn->session; |
755 g_return_if_fail(session != NULL); | 740 g_return_if_fail(session != NULL); |
756 | 741 |
757 // purple_debug_misc("msn", "soap contact server Reply: {%s}\n", soapconn->read_buf); | 742 purple_debug_misc("MSN AddressBook", "Got the Address Book!\n"); |
743 | |
758 if ( msn_parse_addressbook(contact) ) { | 744 if ( msn_parse_addressbook(contact) ) { |
759 msn_soap_free_read_buf(soapconn); | 745 msn_soap_free_read_buf(soapconn); |
760 | 746 |
761 msn_send_privacy(session->account->gc); | 747 msn_send_privacy(session->account->gc); |
762 msn_notification_dump_contact(session); | 748 msn_notification_dump_contact(session); |
779 static void | 765 static void |
780 msn_address_written_cb(gpointer data, gint source, PurpleInputCondition cond) | 766 msn_address_written_cb(gpointer data, gint source, PurpleInputCondition cond) |
781 { | 767 { |
782 MsnSoapConn * soapconn = data; | 768 MsnSoapConn * soapconn = data; |
783 | 769 |
784 purple_debug_info("MSNP14","finish contact written\n"); | 770 purple_debug_misc("MSN AddressBook","Sent SOAP request for the Address Book.\n"); |
785 soapconn->read_cb = msn_get_address_cb; | 771 soapconn->read_cb = msn_get_address_cb; |
786 } | 772 } |
787 | 773 |
788 /*get the address book*/ | 774 /*get the address book*/ |
789 void | 775 void |
791 { | 777 { |
792 MsnSoapReq *soap_request; | 778 MsnSoapReq *soap_request; |
793 char *body = NULL; | 779 char *body = NULL; |
794 char *ab_update_str,*update_str; | 780 char *ab_update_str,*update_str; |
795 | 781 |
796 purple_debug_info("::","msn_get_address_book()\n"); | 782 purple_debug_misc("MSN AddressBook","Getting Address Book\n"); |
797 | 783 |
798 /*build SOAP and POST it*/ | 784 /*build SOAP and POST it*/ |
799 if ( LastChanged != NULL ) { | 785 if ( LastChanged != NULL ) { |
800 ab_update_str = g_strdup_printf(MSN_GET_ADDRESS_UPDATE_XML,LastChanged); | 786 ab_update_str = g_strdup_printf(MSN_GET_ADDRESS_UPDATE_XML,LastChanged); |
801 } else { | 787 } else { |
844 MsnSoapReq *soap_request; | 830 MsnSoapReq *soap_request; |
845 char *body = NULL; | 831 char *body = NULL; |
846 char *contact_xml = NULL; | 832 char *contact_xml = NULL; |
847 char *soap_action; | 833 char *soap_action; |
848 | 834 |
849 purple_debug_info("::","msn_add_contact()\n"); | 835 purple_debug_info("MSNCL","msn_add_contact()\n"); |
850 contact_xml = g_strdup_printf(MSN_CONTACT_XML,passport); | 836 contact_xml = g_strdup_printf(MSN_CONTACT_XML,passport); |
851 if ( groupId == NULL ) { | 837 if ( groupId == NULL ) { |
852 body = g_strdup_printf(MSN_ADD_CONTACT_TEMPLATE,contact_xml); | 838 body = g_strdup_printf(MSN_ADD_CONTACT_TEMPLATE,contact_xml); |
853 g_free(contact_xml); | 839 g_free(contact_xml); |
854 /*build SOAP and POST it*/ | 840 /*build SOAP and POST it*/ |