]> git.meshlink.io Git - catta/blob - avahi-sharp/DomainBrowser.cs
add initial mono bindings
[catta] / avahi-sharp / DomainBrowser.cs
1 using System;
2 using System.Collections;
3 using System.Runtime.InteropServices;
4
5 namespace Avahi
6 {
7     internal delegate void DomainBrowserCallback (IntPtr browser, int iface, Protocol proto, BrowserEvent bevent,
8                                                   IntPtr domain, IntPtr userdata);
9
10     public enum DomainBrowserType {
11         Register,
12         RegisterDefault,
13         Browse,
14         BrowseDefault,
15         BrowseLegacy
16     }
17
18     public struct DomainInfo
19     {
20         public int NetworkInterface;
21         public Protocol Protocol;
22         public string Domain;
23     }
24
25     public delegate void DomainInfoHandler (object o, DomainInfo info);
26     
27     public class DomainBrowser : IDisposable
28     {
29         private IntPtr handle;
30         private ArrayList infos = new ArrayList ();
31         private Client client;
32         private int iface;
33         private Protocol proto;
34         private string domain;
35         private DomainBrowserType btype;
36
37         private ArrayList addListeners = new ArrayList ();
38         private ArrayList removeListeners = new ArrayList ();
39         
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,
43                                                                IntPtr userdata);
44
45         [DllImport ("avahi-client")]
46         private static extern void avahi_domain_browser_free (IntPtr handle);
47
48         public event DomainInfoHandler DomainAdded
49         {
50             add {
51                 addListeners.Add (value);
52                 Start ();
53             }
54             remove {
55                 addListeners.Remove (value);
56                 Stop (false);
57             }
58         }
59         
60         public event DomainInfoHandler DomainRemoved
61         {
62             add {
63                 removeListeners.Add (value);
64                 Start ();
65             }
66             remove {
67                 removeListeners.Remove (value);
68                 Stop (false);
69             }
70         }
71
72         public DomainInfo[] Domains
73         {
74             get { return (DomainInfo[]) infos.ToArray (typeof (DomainInfo)); }
75         }
76
77         public DomainBrowser (Client client) : this (client, -1, Protocol.Unspecified, client.DomainName,
78                                                      DomainBrowserType.Browse) {
79         }
80         
81         public DomainBrowser (Client client, int iface, Protocol proto, string domain, DomainBrowserType btype)
82         {
83             this.client = client;
84             this.iface = iface;
85             this.proto = proto;
86             this.domain = domain;
87             this.btype = btype;
88         }
89
90         ~DomainBrowser ()
91         {
92             Dispose ();
93         }
94
95         public void Dispose ()
96         {
97             Stop (true);
98         }
99
100         private void Start ()
101         {
102             if (handle != IntPtr.Zero || (addListeners.Count == 0 && removeListeners.Count == 0))
103                 return;
104
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);
109         }
110
111         private void Stop (bool force)
112         {
113             if (handle != IntPtr.Zero && (force || (addListeners.Count == 0 && removeListeners.Count == 0))) {
114                 avahi_domain_browser_free (handle);
115                 handle = IntPtr.Zero;
116             }
117         }
118
119         private void OnDomainBrowserCallback (IntPtr browser, int iface, Protocol proto, BrowserEvent bevent,
120                                               IntPtr domain, IntPtr userdata)
121         {
122
123             DomainInfo info;
124             info.NetworkInterface = iface;
125             info.Protocol = proto;
126             info.Domain = Utility.PtrToString (domain);
127
128             infos.Add (info);
129             
130             if (bevent == BrowserEvent.Added) {
131                 infos.Add (info);
132
133                 foreach (DomainInfoHandler handler in addListeners)
134                     handler (this, info);
135             } else {
136                 infos.Remove (info);
137
138                 foreach (DomainInfoHandler handler in removeListeners)
139                     handler (this, info);
140             }
141         }
142     }
143 }