[avahi] Mono apps don't get notified of ClientState.Running

Trent Lloyd lathiat at bur.st
Mon May 1 09:28:13 PDT 2006


Celso Pinto wrote:
> I only checked the client-publish-service.c example.
>
> I'm assuming it works and the code looks the same.
>
> But you don't have to trust me on this, check the attached example and
> you'll see that the OnClientStateChange callback is never invoked.
>
> Compile the example with: mcs -pkg:glib-sharp-2.0,avahi-sharp demo.cs
I mean the c-sharp examples - snorp?
>
> I'm thinking that probably I'll just workaround the issue and if this
> gets solved do the right thing later, but it sucks not being able to
> use the state changes to do everything.
Indeed as that is the preferred way, even in the C api :)

Trent
>
> Cheers,
> Celso
>
>
> Trent Lloyd wrote:
>> 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
>>
>>
> ------------------------------------------------------------------------
>
> using System;
>
> using Avahi;
> using GLib;
>
> namespace demo
> {
>
>     public class demo
>     {
>     
>         public static void OnClientStateChange(object obj, ClientStateArgs args)
>         {
>             Console.WriteLine("State changed to: {0}",args.State);
>         }
>         
>         [STAThread]
>         public static void Main(string[] args)
>         {
>         
>             Avahi.Client client = new Avahi.Client();
>             Console.WriteLine("client instance created");
>             
>             client.StateChanged += OnClientStateChange;
>             
>             Console.WriteLine("Waiting for running state...");
>             
>             new MainLoop().Run();
>         }
>     
>     }
>
>
> }
>   
> ------------------------------------------------------------------------
>
> _______________________________________________
> avahi mailing list
> avahi at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/avahi
>   



More information about the avahi mailing list