2 using System.Collections;
3 using System.Runtime.InteropServices;
7 internal delegate void DomainBrowserCallback (IntPtr browser, int iface, Protocol proto, BrowserEvent bevent,
8 IntPtr domain, IntPtr userdata);
10 public enum DomainBrowserType {
18 public struct DomainInfo
20 public int NetworkInterface;
21 public Protocol Protocol;
25 public delegate void DomainInfoHandler (object o, DomainInfo info);
27 public class DomainBrowser : IDisposable
29 private IntPtr handle;
30 private ArrayList infos = new ArrayList ();
31 private Client client;
33 private Protocol proto;
34 private string domain;
35 private DomainBrowserType btype;
37 private ArrayList addListeners = new ArrayList ();
38 private ArrayList removeListeners = new ArrayList ();
40 [DllImport ("avahi-client")]
41 private static extern IntPtr avahi_domain_browser_new (IntPtr client, int iface, int proto,
42 IntPtr domain, int btype, DomainBrowserCallback cb,
45 [DllImport ("avahi-client")]
46 private static extern void avahi_domain_browser_free (IntPtr handle);
48 public event DomainInfoHandler DomainAdded
51 addListeners.Add (value);
55 addListeners.Remove (value);
60 public event DomainInfoHandler DomainRemoved
63 removeListeners.Add (value);
67 removeListeners.Remove (value);
72 public DomainInfo[] Domains
74 get { return (DomainInfo[]) infos.ToArray (typeof (DomainInfo)); }
77 public DomainBrowser (Client client) : this (client, -1, Protocol.Unspecified, client.DomainName,
78 DomainBrowserType.Browse) {
81 public DomainBrowser (Client client, int iface, Protocol proto, string domain, DomainBrowserType btype)
95 public void Dispose ()
100 private void Start ()
102 if (handle != IntPtr.Zero || (addListeners.Count == 0 && removeListeners.Count == 0))
105 IntPtr domainPtr = Utility.StringToPtr (domain);
106 handle = avahi_domain_browser_new (client.Handle, iface, (int) proto, domainPtr, (int) btype,
107 OnDomainBrowserCallback, IntPtr.Zero);
108 Utility.Free (domainPtr);
111 private void Stop (bool force)
113 if (handle != IntPtr.Zero && (force || (addListeners.Count == 0 && removeListeners.Count == 0))) {
114 avahi_domain_browser_free (handle);
115 handle = IntPtr.Zero;
119 private void OnDomainBrowserCallback (IntPtr browser, int iface, Protocol proto, BrowserEvent bevent,
120 IntPtr domain, IntPtr userdata)
124 info.NetworkInterface = iface;
125 info.Protocol = proto;
126 info.Domain = Utility.PtrToString (domain);
130 if (bevent == BrowserEvent.Added) {
133 foreach (DomainInfoHandler handler in addListeners)
134 handler (this, info);
138 foreach (DomainInfoHandler handler in removeListeners)
139 handler (this, info);