]> git.meshlink.io Git - catta/blob - avahi-sharp/AddressResolver.cs
add some data access api to string list, and use it in ServiceResolver
[catta] / avahi-sharp / AddressResolver.cs
1 /* $Id$ */
2
3 /***
4   This file is part of avahi.
5
6   avahi is free software; you can redistribute it and/or modify it
7   under the terms of the GNU Lesser General Public License as
8   published by the Free Software Foundation; either version 2.1 of the
9   License, or (at your option) any later version.
10
11   avahi is distributed in the hope that it will be useful, but WITHOUT
12   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13   or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
14   Public License for more details.
15
16   You should have received a copy of the GNU Lesser General Public
17   License along with avahi; if not, write to the Free Software
18   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
19   USA.
20 ***/
21
22 using System;
23 using System.Collections;
24 using System.Net;
25 using System.Runtime.InteropServices;
26 using Mono.Unix;
27
28 namespace Avahi
29 {
30
31     internal delegate void AddressResolverCallback (IntPtr resolver, int iface, Protocol proto,
32                                                     ResolverEvent revent, Protocol aproto, IntPtr address,
33                                                     IntPtr hostname, IntPtr userdata);
34
35     public delegate void HostAddressHandler (object o, string host, IPAddress address);
36     
37     public class AddressResolver : IDisposable
38     {
39         private IntPtr handle;
40         private Client client;
41         private int iface;
42         private Protocol proto;
43         private IPAddress address;
44
45         private IPAddress currentAddress;
46         private string currentHost;
47
48         private ArrayList foundListeners = new ArrayList ();
49         private ArrayList timeoutListeners = new ArrayList ();
50         
51         [DllImport ("avahi-client")]
52         private static extern IntPtr avahi_address_resolver_new (IntPtr client, int iface, Protocol proto,
53                                                                  IntPtr address, AddressResolverCallback cb,
54                                                                  IntPtr userdata);
55
56         [DllImport ("avahi-client")]
57         private static extern void avahi_address_resolver_free (IntPtr handle);
58
59         public event HostAddressHandler Found
60         {
61             add {
62                 foundListeners.Add (value);
63                 Start ();
64             }
65             remove {
66                 foundListeners.Remove (value);
67                 Stop (false);
68             }
69         }
70         
71         public event EventHandler Timeout
72         {
73             add {
74                 timeoutListeners.Add (value);
75                 Start ();
76             }
77             remove {
78                 timeoutListeners.Remove (value);
79                 Stop (false);
80             }
81         }
82
83         public IPAddress Address
84         {
85             get { return currentAddress; }
86         }
87
88         public string HostName
89         {
90             get { return currentHost; }
91         }
92
93         public AddressResolver (Client client, IPAddress address) : this (client, -1, Protocol.Unspecified, address)
94         {
95         }
96
97         public AddressResolver (Client client, int iface, Protocol proto, IPAddress address)
98         {
99             this.client = client;
100             this.iface = iface;
101             this.proto = proto;
102             this.address = address;
103         }
104
105         ~AddressResolver ()
106         {
107             Dispose ();
108         }
109
110         public void Dispose ()
111         {
112             Stop (true);
113         }
114
115         private void Start ()
116         {
117             if (handle != IntPtr.Zero || (foundListeners.Count == 0 && timeoutListeners.Count == 0))
118                 return;
119
120             IntPtr addrPtr = Utility.StringToPtr (address.ToString ());
121             handle = avahi_address_resolver_new (client.Handle, iface, proto, addrPtr,
122                                                  OnAddressResolverCallback, IntPtr.Zero);
123             Utility.Free (addrPtr);
124         }
125
126         private void Stop (bool force)
127         {
128             if (handle != IntPtr.Zero && (force || (foundListeners.Count == 0 && timeoutListeners.Count == 0))) {
129                 avahi_address_resolver_free (handle);
130                 handle = IntPtr.Zero;
131             }
132         }
133
134         private void OnAddressResolverCallback (IntPtr resolver, int iface, Protocol proto,
135                                                 ResolverEvent revent, Protocol aproto, IntPtr address,
136                                                 IntPtr hostname, IntPtr userdata)
137         {
138             if (revent == ResolverEvent.Found) {
139                 currentAddress = Utility.PtrToAddress (address);
140                 currentHost = Utility.PtrToString (hostname);
141
142                 foreach (HostAddressHandler handler in foundListeners)
143                     handler (this, currentHost, currentAddress);
144             } else {
145                 currentAddress = null;
146                 currentHost = null;
147                 
148                 foreach (EventHandler handler in timeoutListeners)
149                     handler (this, new EventArgs ());
150             }
151         }
152     }
153 }