comparison libpurple/xmlnode.c @ 23509:c4ec724b3b53

Make sure xmlnode_copy also copies the prefix and namespace_map from the source xmlnode. This should fix operations on MSN member role lists. That means blocking and unblocking should work now. And removing new buddies from the pending list too, so you shouldn't get asked to add them every time you log in.
author Elliott Sales de Andrade <qulogic@pidgin.im>
date Sat, 28 Jun 2008 06:55:30 +0000
parents feb92c44db87
children e23b447aa5ca 4152b5c1c051 2ecd716746e6
comparison
equal deleted inserted replaced
23508:3e3f5a25a135 23509:c4ec724b3b53
726 726
727 g_free(xpd); 727 g_free(xpd);
728 return ret; 728 return ret;
729 } 729 }
730 730
731 static void
732 xmlnode_copy_foreach_ns(gpointer key, gpointer value, gpointer user_data)
733 {
734 GHashTable *ret = (GHashTable *)user_data;
735 g_hash_table_insert(ret, g_strdup(key), g_strdup(value));
736 }
737
731 xmlnode * 738 xmlnode *
732 xmlnode_copy(const xmlnode *src) 739 xmlnode_copy(const xmlnode *src)
733 { 740 {
734 xmlnode *ret; 741 xmlnode *ret;
735 xmlnode *child; 742 xmlnode *child;
737 744
738 g_return_val_if_fail(src != NULL, NULL); 745 g_return_val_if_fail(src != NULL, NULL);
739 746
740 ret = new_node(src->name, src->type); 747 ret = new_node(src->name, src->type);
741 ret->xmlns = g_strdup(src->xmlns); 748 ret->xmlns = g_strdup(src->xmlns);
742 if(src->data) { 749 if (src->data) {
743 if(src->data_sz) { 750 if (src->data_sz) {
744 ret->data = g_memdup(src->data, src->data_sz); 751 ret->data = g_memdup(src->data, src->data_sz);
745 ret->data_sz = src->data_sz; 752 ret->data_sz = src->data_sz;
746 } else { 753 } else {
747 ret->data = g_strdup(src->data); 754 ret->data = g_strdup(src->data);
748 } 755 }
749 } 756 }
750 757 ret->prefix = g_strdup(src->prefix);
751 for(child = src->child; child; child = child->next) { 758 if (src->namespace_map) {
752 if(sibling) { 759 ret->namespace_map = g_hash_table_new_full(g_str_hash, g_str_equal,
760 g_free, g_free);
761 g_hash_table_foreach(src->namespace_map, xmlnode_copy_foreach_ns, ret->namespace_map);
762 }
763
764 for (child = src->child; child; child = child->next) {
765 if (sibling) {
753 sibling->next = xmlnode_copy(child); 766 sibling->next = xmlnode_copy(child);
754 sibling = sibling->next; 767 sibling = sibling->next;
755 } else { 768 } else {
756 ret->child = xmlnode_copy(child); 769 ret->child = xmlnode_copy(child);
757 sibling = ret->child; 770 sibling = ret->child;