[avahi] Mono apps don't get notified of ClientState.Running
Trent Lloyd
lathiat at bur.st
Sun Apr 30 21:59:30 PDT 2006
What do the other examples do, not bother to check?
Trent
On Mon, May 01, 2006 at 04:47:38AM +0100, Celso Pinto wrote:
> Hi again guys,
>
> the Connect() method doesn't work because the Client.OnClientCallback
> method is invoked while avahi_client_new, which means that the Client
> object still has an invalid Handle and Avahi.EntryGroup barfs on it.
>
> I'm attaching the patch if you care to take a look (it prints a couple
> of debug messages to stdout).
>
> You'll see that the output "OnClientCallback invoked for state Running"
> is printed before the "Got handle" message.
>
> Any ideas?
>
> Cheers,
> Celso
>
> Celso Pinto wrote:
> >Hi everyone,
> >
> >I'm programming an application that uses Avahi's Mono bindings and I
> >think I found an ugly problem: when a Mono app creates an instance of
> >Avahi.Client, the constructor of this class invokes the native
> >avahi_client_new method, which receives a parameter for the client_state
> >callback.
> >
> >While still in construction, the Avahi.Client class gets notified that
> >the ClientState is now Running, so the Client.OnClientCallback method is
> >invoked but the StateChanged event still doesn't contain any Handlers
> >because this is all happening during construction of the Avahi.Client
> >object.
> >
> >This means that applications, like my own, that are waiting on the
> >StateChanged event with a ClientState.Running value to start publishing
> >their services never get notified, therefore never get to publish anything.
> >
> >The only way to fix this problem is to create a Client.Connect() method.
> >This allows us to first create an instance of Avahi.Client, then add a
> >delegate to the StateChanged event and finally call the
> >Avahi.Client.Connect() method. Only then our callbacks get notified of
> >the running state.
> >
> >The big question is: because this will break the current behaviour of
> >the Avahi.Client class (meaning that the client connects to the daemon
> >during construction), will you guys make the necessary changes?
> >
> >Cheers,
> >Celso
> >_______________________________________________
> >avahi mailing list
> >avahi at lists.freedesktop.org
> >http://lists.freedesktop.org/mailman/listinfo/avahi
> >
> --- Client.cs.old 2006-05-01 03:59:28.000000000 +0100
> +++ Client.cs 2006-05-01 04:44:05.000000000 +0100
> @@ -117,6 +117,7 @@
> private ClientCallback cb;
> private PollCallback pollcb;
> private IntPtr spoll;
> + private ClientFlags cflags;
>
> private Thread thread;
>
> @@ -251,6 +252,16 @@
>
> public Client (ClientFlags flags)
> {
> + cflags = flags;
> + }
> +
> + public Client () : this (ClientFlags.None) {
> + }
> +
> + public void Connect()
> + {
> + if (handle != IntPtr.Zero) return;
> +
> spoll = avahi_simple_poll_new ();
>
> pollcb = OnPollCallback;
> @@ -259,18 +270,22 @@
> cb = OnClientCallback;
>
> int error;
> - handle = avahi_client_new (poll, flags, cb, IntPtr.Zero, out error);
> + handle = avahi_client_new (poll, cflags, cb, IntPtr.Zero, out error);
> + Console.WriteLine("Got handle");
> if (error != 0)
> - throw new ClientException (error);
> + {
> + avahi_simple_poll_quit (spoll);
> + avahi_simple_poll_free (spoll);
> + handle = IntPtr.Zero;
>
> + throw new ClientException (error);
> + }
> +
> thread = new Thread (PollLoop);
> thread.IsBackground = true;
> thread.Start ();
> }
> -
> - public Client () : this (ClientFlags.None) {
> - }
> -
> +
> ~Client ()
> {
> Dispose ();
> @@ -348,6 +363,7 @@
>
> private void OnClientCallback (IntPtr client, ClientState state, IntPtr userData)
> {
> + Console.WriteLine("OnClientCallback invoked for state {0}",state);
> if (StateChanged != null)
> StateChanged (this, new ClientStateArgs (state));
> }
> _______________________________________________
> avahi mailing list
> avahi at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/avahi
--
Trent Lloyd <lathiat at bur.st>
Bur.st Networking Inc.
More information about the avahi
mailing list