[Bug 47429] Support SalutContact and SautContact-manager with Bonjour backend

bugzilla-daemon at freedesktop.org bugzilla-daemon at freedesktop.org
Thu Mar 22 13:44:38 CET 2012


https://bugs.freedesktop.org/show_bug.cgi?id=47429

Jonny Lamb <jonny.lamb at collabora.co.uk> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
  Status Whiteboard|                            |review-

--- Comment #3 from Jonny Lamb <jonny.lamb at collabora.co.uk> 2012-03-22 12:44:38 UTC ---
> We need to pass published_name at host when registering for the service current
> code passes NULL, which lets mdns choose it's name.

OOI what does mdns choose if you pass NULL?

> + priv->svc_ref_table = NULL;
> + priv->svc_source_table = NULL;

Huh? These are set to NULL in _init and set to real values in _watch_svc_ref.
If _watch_svc_ref is never called then g_hash_table_foreach_remove,
g_hash_table_remove_all, and g_hash_table_destroy will be all called on NULL.
Creating two hash tables in the discovery client isn't so costly; just create
them in _init then you can remove the checks in _watch_svc_ref and
_drop_svc_ref and not assert in said case.

> + g_hash_table_remove (priv->svc_source_table, channel);
> +
> + return TRUE;

You're calling g_hash_table_foreach_remove which takes a GHRFunc which is
defined to  return "TRUE if the key/value pair should be removed from the
GHashTable." However, just before returning TRUE you remove the key/value pair
from the table anyway..?

In fact, why don't you just make this the value destroy function of the
svc_source_table GHashTable? It would simplify this code a lot.

> + priv->svc_source_table = g_hash_table_new_full (g_direct_hash,
> +     g_direct_equal,NULL, NULL);

Missing space.

> + priv->discovery_client = g_value_get_object (value);
> + g_object_ref (priv->discovery_client);

g_value_dup_object

> + socket_address = g_inet_socket_address_new (addr, port);
> + g_object_ref (addr);

Why do you suddenly ref addr? The equivalent code in SalutAvahiContact which
you've otherwise used as a base does this:

    socket_address = g_inet_socket_address_new (addr, port);
    g_object_unref (addr);

so I'm confused?

> +     g_array_append_val (addresses, s_address);
> +    }
> +}

Indentation.

> + addresses =
> +   g_array_sized_new (TRUE, TRUE, sizeof (salut_contact_address_t), 0);

It seems odd to use sized_new when you just use 0 and you /could/ find out the
exact size if you wanted? Given finding the size is O(n) perhaps it's not worth
it though; what do you think? If you used GQueue you could just use .length
which would be even nicer.

Every time a GQueue is used I cheer!

> + resolvers_left = g_slist_length (priv->resolvers);
> +
> + g_free (ctx);
> +
> + if (resolvers_left == 0)
> +   salut_contact_lost (SALUT_CONTACT (self));

g_[s]list_length(list) == 0 if and only if list == NULL...

> + ctx = g_new0 (SalutBonjourResolveCtx, 1);

Slice allocating this stuff is preferred these days; use g_slice_new0 and
g_slice_free.

> + priv->resolvers = g_slist_prepend (priv->resolvers, ctx);

I really hate this "prepend to a list because it's quicker than appending"
thing. Yes, turn priv->resolvers into a GQueue.


> + if (error_type != kDNSServiceErr_NoError)
> +   {
> +     DEBUG ("Resolver failed witih : (%d)", error_type);
> +     return ;
> +   }

*with

There's an extra space after "return".

Should we not still thaw the salut contact here?

+ if (error_type !=kDNSServiceErr_NoError)

Missing space.

> + else if (!salut_bonjour_contact_has_services (SALUT_BONJOUR_CONTACT
> +     (contact)))
> +   {
> +     g_object_ref (contact);
> +   }

but later on:

+ if (salut_bonjour_contact_has_services (SALUT_BONJOUR_CONTACT (contact)))
+   {
+     /* We reffed this contact as it has services */
+     g_object_unref (contact);
+   }

So this reffing with services confuses me?

-- 
Configure bugmail: https://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