[Bug 20829] Implement ContactSearch (telepathy-spec 0.17.22 version)
bugzilla-daemon at freedesktop.org
bugzilla-daemon at freedesktop.org
Tue Aug 25 15:37:08 CEST 2009
http://bugs.freedesktop.org/show_bug.cgi?id=20829
--- Comment #4 from Guillaume Desmottes <guillaume.desmottes at collabora.co.uk> 2009-08-25 06:37:06 PST ---
contact search review
(In reply to comment #2)
> +static void
> +free_info (GPtrArray *info)
> +{
> + GValue v = { 0, };
> +
> + g_value_init (&v, GABBLE_ARRAY_TYPE_CONTACT_INFO_FIELD_LIST);
> + g_value_take_boxed (&v, info);
> + g_value_unset (&v);
> +}
> +
>
> Can't this be replaced with
>
> g_boxed_free (GABBLE_ARRAY_TYPE_CONTACT_INFO_FIELD_LIST, info);
Indeed. Fixed.
> I've decided that:
>
> /* Use a temporary variable because we don't want search_channel_closed_cb to
> * remove the channel from the hash table a second time
> */:
> if (self->priv->channels != NULL)
> {
> GHashTable *tmp = self->priv->channels;
>
> DEBUG ("closing channels");
> self->priv->channels = NULL;
> g_hash_table_destroy (tmp);
> }
>
> is an anti-pattern. close_all() should just call a close() method on all the
> channels, and then you don't have to do the stupid "move the hash table aside"
> dance. Plus, if you explicitly tell the channel to close you're not relying on
> owning the only reference to it, and it closing as a side-effect of being
> disposed.
Fixed.
> It'd be nice if we could delay the channel creation if we know that service
> discovery hasn't finished yet. I notice in disco.c:
>
> /* FIXME - service discovery done - signal that somehow */
>
> Maybe it's worth making that happen (a "done" signal would presumably suffice)?
> Then the server == NULL case in gabble_search_manager_create_channel could
> check whether service discovery's finished, and if it's not hook up to the
> "done" signal and return from CreateChannel when it's fired? This could be kind
> of similar to how we wait on making streamed media channels until we're sure of
> the peer's caps, except less fragile and ad-hoc.
Done.
> self->priv->status_changed_id = g_signal_connect (self->priv->conn,
> "status-changed", (GCallback) connection_status_changed_cb, obj);
>
> Can't this use gabble_signal_connect_object?
Done. (the signal wasn't ever disconnected btw...)
>
> static void
> gabble_search_manager_foreach_channel (TpChannelManager *manager,
> TpExportableChannelFunc func,
> gpointer user_data)
> {
> /* GabbleSearchManager *self = GABBLE_SEARCH_MANAGER (manager); */
> }
>
> Bzzt. Sorry, guess I left out the FIXME there.
Oups, I missed that. Fixed and tested.
> Interestingly, this can't just iterate priv->channels, because we put
> not-ready-yet channels in there too. Maybe priv->channels should be split up;
> or, we could have gabble_search_channel_is_ready ().
Indeed. I added a _is_ready ()
> What do you think about:
>
> /* - Maybe CreateChannel should be specced to raise PermissionDenied?
> * Then we could map XMPP_ERROR_FORBIDDEN to that.
> * - Should XMPP_ERROR_JID_MALFORMED be mapped to InvalidArgument?
> */
I think that make sense. I added it in the spec and fixed implementation.
> I think the answer to:
>
> /* Do we want to prefix the error string with something? */
> is no, given that Daf fixed the XMPP error-to-GError code to actually use the
> error message from the XMPP stream if there is one.
I agree.
> If there's an outstanding request for a search channel when we disconnect, the
> CreateChannel method will never terminate, because the search channel will
> never emit ready-or-not.
>
> I *think* the correct fix here is to make gabble_search_channel_close() look
> something like:
>
> if (!closed)
> emit closed;
> else if (hasn't emitted ready-or-not)
> emit it with the appropriate error.
> else
> DEBUG ("nothing to do");
Actually no, tp-glib cancel the request for us. You even tested that case in
eci-nest-pas-un-serveur.py : disconnected_before_reply :)
>
> /* FIXME: it's unclear how "first" and "last" should be mapped.
> * http://xmpp.org/registrar/formtypes.html#jabber:iq:se
arch maps
> * "first" with "First Name" and "last" with "Family Name".
> * But Example 7 of XEP-0055 describes "first" as the "Given Name".
> * Maybe we need to add x-first and x-last?
> */
>
> Given that "last" is defined to mean "family name", I think the intention was
> for "first" to mean "given name". I think the mapping is correct. The naming's
> wrong, but at least ejabberd gets it right with its data forms
> implementation.
Cool. Do you think we should remove this FIXME or let it while the XEP has been
clarified?
> --
>
> Nitpicks:
>
> What's the point of
> <http://git.collabora.co.uk/?p=user/cassidy/telepathy-gabble;a=commitdiff;h=1b1bceceda>?
> The first thing that happens to 'h' is that tp_handle_ensure's return value is
> assigned to it, so I don't see the point of initializing it to 0. (And in more
> complicated situations, initializing variables suppresses the compiler's
> warnings about using variables uninitialized, which can save you if you forget
> to assign to a variable in one branch of an 'if' or something.)
I was needed in an old version of the branch but not any more. I removed it.
>
> + # Openfire only supports one text field and a bunch on checkbox
>
> a bunch *of* checkboxes
fixed.
>
> btw. we have assertEquals, assertLength, assertContains, etc. so
> that you don't have to say "assert foo == bar, (foo, bar)". Would be nice to
> use them, but I'm not sure whether it's worth going through all these tests
> now.
Tbh, I'm not really motivated to change that at this point :)
> I vaguely wonder whether channel managers should cache their channel classes so
> that we don't repeatedly build and free tiny hash tables whenever anyone looks
> at RCC.
Maybe. Could be done later to all the channels managers.
(In reply to comment #3)
> parse_data_form:
>
> gboolean found_form_type_search = FALSE;
> found_form_type_search = TRUE;
>
> but then it's never actually used again.
removed.
> tp_name = g_hash_table_lookup (xmpp_to_tp, var);
> 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));
>
> So what happens if a form contains two fields that map to the same Telepathy
> name? I think that the key will appear twice in AvailableSearchKeys, and when
> the client calls Search() the last field name seen will be used. The former is
> a slight bug but it's harmless; the latter is also valid. Maybe there should be
> a test to make sure Gabble doesn't implode when this happens, and if you're
> feeling really keen, code to avoid duplicates?
Tested and fixed
> add_search_result() builds the 'n' field from the separate given and family
> components. It should also use the middle name if present, maybe? Also, should
> we be constructing an 'org' field out of x-org-unit and x-org-name? Ditto
> 'adr'? "No" is a reasonable answer. :)
Tbh I have no idea. I don't know much about vCard and just reused your
existing code. I can add that if you think we should.
--
Configure bugmail: http://bugs.freedesktop.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
More information about the telepathy-bugs
mailing list