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