[telepathy-gabble/master] store only supported fields in tp_to_xmpp so we can map to the right one
Guillaume Desmottes
guillaume.desmottes at collabora.co.uk
Wed Aug 26 09:22:06 PDT 2009
---
src/search-channel.c | 57 ++++++++++++++++++++++-------------
tests/twisted/search/extended.py | 5 +--
tests/twisted/search/unextended.py | 4 +-
3 files changed, 39 insertions(+), 27 deletions(-)
diff --git a/src/search-channel.c b/src/search-channel.c
index c4b995e..a3b7e2f 100644
--- a/src/search-channel.c
+++ b/src/search-channel.c
@@ -71,6 +71,12 @@ struct _GabbleSearchChannelPrivate
gboolean xforms;
+ /* owned tp_name (gchar *) => owned xmpp_name (gchar *)
+ * This mapping contains the fields that are supported by the server so
+ * if a tp_name can be mapped to different xmpp_name, the hash table will
+ * map to the one supported. */
+ GHashTable *tp_to_xmpp;
+
TpHandleSet *result_handles;
};
@@ -138,7 +144,6 @@ static const FieldNameMapping field_mappings[] = {
static GHashTable *xmpp_to_tp = NULL;
static GHashTable *unextended_xmpp_to_tp = NULL;
-static GHashTable *tp_to_xmpp = NULL;
static void
build_mapping_tables (void)
@@ -146,18 +151,14 @@ build_mapping_tables (void)
guint i;
g_return_if_fail (xmpp_to_tp == NULL);
- g_return_if_fail (tp_to_xmpp == NULL);
xmpp_to_tp = g_hash_table_new (g_str_hash, g_str_equal);
unextended_xmpp_to_tp = g_hash_table_new (g_str_hash, g_str_equal);
- tp_to_xmpp = g_hash_table_new (g_str_hash, g_str_equal);
for (i = 0; i < NUM_UNEXTENDED_FIELDS; i++)
{
g_hash_table_insert (xmpp_to_tp, field_mappings[i].xmpp_name,
field_mappings[i].tp_name);
- g_hash_table_insert (tp_to_xmpp, field_mappings[i].tp_name,
- field_mappings[i].xmpp_name);
}
tp_g_hash_table_update (unextended_xmpp_to_tp, xmpp_to_tp, NULL, NULL);
@@ -166,8 +167,6 @@ build_mapping_tables (void)
{
g_hash_table_insert (xmpp_to_tp, field_mappings[i].xmpp_name,
field_mappings[i].tp_name);
- g_hash_table_insert (tp_to_xmpp, field_mappings[i].tp_name,
- field_mappings[i].xmpp_name);
}
}
@@ -216,8 +215,10 @@ supported_field_discovery_failed (GabbleSearchChannel *chan,
}
static GPtrArray *
-parse_unextended_field_response (LmMessageNode *query_node,
- GError **error)
+parse_unextended_field_response (
+ GabbleSearchChannel *self,
+ LmMessageNode *query_node,
+ GError **error)
{
GPtrArray *search_keys = g_ptr_array_new ();
NodeIter i;
@@ -239,6 +240,8 @@ parse_unextended_field_response (LmMessageNode *query_node,
if (tp_name != NULL)
{
g_ptr_array_add (search_keys, tp_name);
+ g_hash_table_insert (self->priv->tp_to_xmpp, g_strdup (tp_name),
+ g_strdup (field->name));
}
else
{
@@ -254,8 +257,10 @@ parse_unextended_field_response (LmMessageNode *query_node,
}
static GPtrArray *
-parse_data_form (LmMessageNode *x_node,
- GError **error)
+parse_data_form (
+ GabbleSearchChannel *self,
+ LmMessageNode *x_node,
+ GError **error)
{
GPtrArray *search_keys = g_ptr_array_new ();
gboolean found_form_type_search = FALSE;
@@ -324,6 +329,8 @@ parse_data_form (LmMessageNode *x_node,
if (tp_name != NULL)
{
g_ptr_array_add (search_keys, tp_name);
+ g_hash_table_insert (self->priv->tp_to_xmpp, g_strdup (tp_name),
+ g_strdup (var));
}
else
{
@@ -352,12 +359,12 @@ parse_search_field_response (GabbleSearchChannel *chan,
if (x_node == NULL)
{
chan->priv->xforms = FALSE;
- search_keys = parse_unextended_field_response (query_node, &e);
+ search_keys = parse_unextended_field_response (chan, query_node, &e);
}
else
{
chan->priv->xforms = TRUE;
- search_keys = parse_data_form (x_node, &e);
+ search_keys = parse_data_form (chan, x_node, &e);
}
if (search_keys == NULL)
@@ -369,7 +376,8 @@ parse_search_field_response (GabbleSearchChannel *chan,
DEBUG ("extracted available fields");
g_ptr_array_add (search_keys, NULL);
- chan->priv->available_search_keys = (gchar **) g_ptr_array_free (search_keys, FALSE);
+ chan->priv->available_search_keys = (gchar **) g_ptr_array_free (search_keys,
+ FALSE);
supported_fields_discovered (chan);
}
@@ -918,8 +926,10 @@ validate_terms (GabbleSearchChannel *chan,
}
static void
-build_unextended_query (LmMessageNode *query,
- GHashTable *terms)
+build_unextended_query (
+ GabbleSearchChannel *self,
+ LmMessageNode *query,
+ GHashTable *terms)
{
GHashTableIter iter;
gpointer key, value;
@@ -928,7 +938,7 @@ build_unextended_query (LmMessageNode *query,
while (g_hash_table_iter_next (&iter, &key, &value))
{
- gchar *xmpp_field = g_hash_table_lookup (tp_to_xmpp, key);
+ gchar *xmpp_field = g_hash_table_lookup (self->priv->tp_to_xmpp, key);
g_assert (xmpp_field != NULL);
@@ -937,7 +947,8 @@ build_unextended_query (LmMessageNode *query,
}
static void
-build_extended_query (LmMessageNode *query,
+build_extended_query (GabbleSearchChannel *self,
+ LmMessageNode *query,
GHashTable *terms)
{
LmMessageNode *x, *field;
@@ -963,7 +974,7 @@ build_extended_query (LmMessageNode *query,
while (g_hash_table_iter_next (&iter, &key, &value))
{
- gchar *xmpp_field = g_hash_table_lookup (tp_to_xmpp, key);
+ gchar *xmpp_field = g_hash_table_lookup (self->priv->tp_to_xmpp, key);
g_assert (xmpp_field != NULL);
@@ -995,11 +1006,11 @@ do_search (GabbleSearchChannel *chan,
if (chan->priv->xforms)
{
- build_extended_query (query, terms);
+ build_extended_query (chan, query, terms);
}
else
{
- build_unextended_query (query, terms);
+ build_unextended_query (chan, query, terms);
}
DEBUG ("Sending search");
@@ -1067,6 +1078,9 @@ gabble_search_channel_constructor (GType type,
*/
base->closed = TRUE;
+ chan->priv->tp_to_xmpp = g_hash_table_new_full (g_str_hash, g_str_equal,
+ g_free, g_free);
+
request_search_fields (chan);
return obj;
@@ -1083,6 +1097,7 @@ gabble_search_channel_finalize (GObject *obj)
g_free (priv->server);
tp_handle_set_destroy (priv->result_handles);
+ g_hash_table_destroy (chan->priv->tp_to_xmpp);
if (G_OBJECT_CLASS (gabble_search_channel_parent_class)->finalize)
G_OBJECT_CLASS (gabble_search_channel_parent_class)->finalize (obj);
diff --git a/tests/twisted/search/extended.py b/tests/twisted/search/extended.py
index d6ca434..1c3b33d 100644
--- a/tests/twisted/search/extended.py
+++ b/tests/twisted/search/extended.py
@@ -121,10 +121,7 @@ def complete_search(q, bus, conn, requests, stream):
search_fields, chan, c_search, c_props = do_one_search (q, bus, conn, requests, stream,
fields, expected_search_keys, terms, results)
- # FIXME: this is currently broken because 2 fields are mapped with
- # 'x-n-family': "last" and "family"; Gabble uses the last one inserted to
- # the hash table...
- #assert ('last', 'Threepwood') in search_fields, search_fields
+ assert ('last', 'Threepwood') in search_fields, search_fields
# get results
r1 = q.expect('dbus-signal', signal='SearchResultReceived')
diff --git a/tests/twisted/search/unextended.py b/tests/twisted/search/unextended.py
index 93aab7e..b4795da 100644
--- a/tests/twisted/search/unextended.py
+++ b/tests/twisted/search/unextended.py
@@ -59,8 +59,8 @@ def complete_search(q, bus, conn, requests, stream, server):
query = iq.firstChildElement()
i = 0
for field in query.elements():
- #assert field.name == 'last', field.toXml()
- #assert field.children[0] == u'Threepwood', field.children[0]
+ assert field.name == 'last', field.toXml()
+ assert field.children[0] == u'Threepwood', field.children[0]
i += 1
assert i == 1, query
--
1.5.6.5
More information about the telepathy-commits
mailing list