X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-sharp%2FServiceResolver.cs;h=4a6a8a068f3bff7ad57867b25b59823e06d06da9;hb=3e9a76c55eb47b34aa1cbc2a16983da5c33bbf2f;hp=8e8464be10f32bf36846408fedf08931e5be8e02;hpb=264700bf97de2e4430494cb41201950162fba020;p=catta diff --git a/avahi-sharp/ServiceResolver.cs b/avahi-sharp/ServiceResolver.cs index 8e8464b..4a6a8a0 100644 --- a/avahi-sharp/ServiceResolver.cs +++ b/avahi-sharp/ServiceResolver.cs @@ -31,9 +31,10 @@ namespace Avahi internal delegate void ServiceResolverCallback (IntPtr resolver, int iface, Protocol proto, ResolverEvent revent, IntPtr name, IntPtr type, IntPtr domain, IntPtr host, IntPtr address, - UInt16 port, IntPtr txt, IntPtr userdata); + UInt16 port, IntPtr txt, LookupResultFlags flags, + IntPtr userdata); - public class ServiceResolver : IDisposable + public class ServiceResolver : ResolverBase, IDisposable { private IntPtr handle; private ServiceInfo currentInfo; @@ -44,6 +45,7 @@ namespace Avahi private string type; private string domain; private Protocol aproto; + private LookupFlags flags; private ServiceResolverCallback cb; private ArrayList foundListeners = new ArrayList (); @@ -52,7 +54,8 @@ namespace Avahi [DllImport ("avahi-client")] private static extern IntPtr avahi_service_resolver_new (IntPtr client, int iface, Protocol proto, IntPtr name, IntPtr type, IntPtr domain, - Protocol aproto, ServiceResolverCallback cb, + Protocol aproto, LookupFlags flags, + ServiceResolverCallback cb, IntPtr userdata); [DllImport ("avahi-common")] @@ -99,19 +102,21 @@ namespace Avahi public ServiceResolver (Client client, string name, string type, string domain) : this (client, -1, Protocol.Unspecified, name, type, domain, - Protocol.Unspecified) + Protocol.Unspecified, + LookupFlags.None) { } public ServiceResolver (Client client, ServiceInfo service) : this (client, service.NetworkInterface, service.Protocol, service.Name, service.ServiceType, service.Domain, - Protocol.Unspecified) + Protocol.Unspecified, + GetLookupFlags (service.Flags)) { } public ServiceResolver (Client client, int iface, Protocol proto, string name, - string type, string domain, Protocol aproto) + string type, string domain, Protocol aproto, LookupFlags flags) { this.client = client; this.iface = iface; @@ -120,6 +125,7 @@ namespace Avahi this.type = type; this.domain = domain; this.aproto = aproto; + this.flags = flags; cb = OnServiceResolverCallback; } @@ -145,7 +151,7 @@ namespace Avahi lock (client) { handle = avahi_service_resolver_new (client.Handle, iface, proto, namePtr, typePtr, domainPtr, - aproto, cb, IntPtr.Zero); + aproto, flags, cb, IntPtr.Zero); } Utility.Free (namePtr); @@ -168,7 +174,8 @@ namespace Avahi private void OnServiceResolverCallback (IntPtr resolver, int iface, Protocol proto, ResolverEvent revent, IntPtr name, IntPtr type, IntPtr domain, IntPtr host, IntPtr address, - UInt16 port, IntPtr txt, IntPtr userdata) + UInt16 port, IntPtr txt, LookupResultFlags flags, + IntPtr userdata) { ServiceInfo info; info.NetworkInterface = iface; @@ -191,18 +198,30 @@ namespace Avahi } info.Text = (byte[][]) txtlist.ToArray (typeof (byte[])); - - if (revent == ResolverEvent.Found) { + info.Flags = flags; + + switch (revent) { + case ResolverEvent.Found: currentInfo = info; foreach (ServiceInfoHandler handler in foundListeners) handler (this, info); - } else { - currentInfo = ServiceInfo.Zero; - - foreach (EventHandler handler in timeoutListeners) - handler (this, new EventArgs ()); + break; + case ResolverEvent.Failure: + EmitFailure (client.LastError); + break; } } + + private static LookupFlags GetLookupFlags (LookupResultFlags rflags) { + LookupFlags ret = LookupFlags.None; + + if ((rflags & LookupResultFlags.Multicast) > 0) + ret |= LookupFlags.UseMulticast; + if ((rflags & LookupResultFlags.WideArea) > 0) + ret |= LookupFlags.UseWideArea; + + return ret; + } } }