Mercurial > pidgin
changeset 19755:cd067497cbe0
Fix the bug reported to the devel mailing list by Georgi Kirilov.
The bug is that, when displaying the results of a form-based
user search in XMPP, the server had to sent down the contents of
each item in the same order as the columns.
We now no longer make that assumption and instead make sure that
the value we add to each row is in the correct spot in the column.
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Wed, 12 Sep 2007 07:13:57 +0000 |
parents | ab87820e95b6 |
children | 8f8421bda08d |
files | libpurple/protocols/jabber/buddy.c |
diffstat | 1 files changed, 31 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/libpurple/protocols/jabber/buddy.c Wed Sep 12 01:43:10 2007 +0000 +++ b/libpurple/protocols/jabber/buddy.c Wed Sep 12 07:13:57 2007 +0000 @@ -2147,36 +2147,58 @@ results = purple_notify_searchresults_new(); if((x = xmlnode_get_child_with_namespace(query, "x", "jabber:x:data"))) { xmlnode *reported; + GSList *column_vars = NULL; + purple_debug_info("jabber", "new-skool\n"); + if((reported = xmlnode_get_child(x, "reported"))) { xmlnode *field = xmlnode_get_child(reported, "field"); while(field) { - /* XXX keep track of this order, use it below */ const char *var = xmlnode_get_attrib(field, "var"); const char *label = xmlnode_get_attrib(field, "label"); if(var) { column = purple_notify_searchresults_column_new(label ? label : var); purple_notify_searchresults_column_add(results, column); + column_vars = g_slist_append(column_vars, (char *)var); } field = xmlnode_get_next_twin(field); } } + item = xmlnode_get_child(x, "item"); while(item) { GList *row = NULL; - field = xmlnode_get_child(item, "field"); - while(field) { - xmlnode *valuenode = xmlnode_get_child(field, "value"); - if(valuenode) { - char *value = xmlnode_get_data(valuenode); - row = g_list_append(row, value); + GSList *l; + xmlnode *valuenode; + const char *var; + + for (l = column_vars; l != NULL; l = l->next) { + /* + * Build a row containing the strings that correspond + * to each column of the search results. + */ + for (field = xmlnode_get_child(item, "field"); + field != NULL; + field = xmlnode_get_next_twin(field)) + { + if ((var = xmlnode_get_attrib(field, "var")) && + !strcmp(var, l->data) && + (valuenode = xmlnode_get_child(field, "value"))) + { + char *value = xmlnode_get_data(valuenode); + row = g_list_append(row, value); + break; + } } - field = xmlnode_get_next_twin(field); + if (field == NULL) + /* No data for this column */ + row = g_list_append(row, NULL); } purple_notify_searchresults_row_add(results, row); - item = xmlnode_get_next_twin(item); } + + g_slist_free(column_vars); } else { /* old skool */ purple_debug_info("jabber", "old-skool\n");