• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 using System;
2 using System.Net;
3 using System.Collections;
4 using System.Runtime.InteropServices;
5 using Gtk;
6 using Mono.Unix;
7 using Mono.Unix.Native;
8 
9 namespace Avahi.UI
10 {
11     public class ServiceDialog : Dialog
12     {
13         [DllImport ("avahi-ui")]
aui_service_dialog_new(string title, IntPtr parent, IntPtr dummy)14         private static extern IntPtr aui_service_dialog_new (string title, IntPtr parent, IntPtr dummy);
15 
16         [DllImport ("avahi-ui")]
aui_service_dialog_set_browse_service_typesv(IntPtr dialog, IntPtr[] types)17         private static extern void aui_service_dialog_set_browse_service_typesv (IntPtr dialog, IntPtr[] types);
18 
19         [DllImport ("avahi-ui")]
aui_service_dialog_get_browse_service_types(IntPtr dialog)20         private static extern IntPtr aui_service_dialog_get_browse_service_types (IntPtr dialog);
21 
22         [DllImport ("avahi-ui")]
aui_service_dialog_get_domain(IntPtr dialog)23         private static extern IntPtr aui_service_dialog_get_domain (IntPtr dialog);
24 
25         [DllImport ("avahi-ui")]
aui_service_dialog_set_domain(IntPtr dialog, IntPtr domain)26         private static extern void aui_service_dialog_set_domain (IntPtr dialog, IntPtr domain);
27 
28         [DllImport ("avahi-ui")]
aui_service_dialog_get_service_type(IntPtr dialog)29         private static extern IntPtr aui_service_dialog_get_service_type (IntPtr dialog);
30 
31         [DllImport ("avahi-ui")]
aui_service_dialog_set_service_type(IntPtr dialog, IntPtr type)32         private static extern void aui_service_dialog_set_service_type (IntPtr dialog, IntPtr type);
33 
34         [DllImport ("avahi-ui")]
aui_service_dialog_get_service_name(IntPtr dialog)35         private static extern IntPtr aui_service_dialog_get_service_name (IntPtr dialog);
36 
37         [DllImport ("avahi-ui")]
aui_service_dialog_set_service_name(IntPtr dialog, IntPtr type)38         private static extern void aui_service_dialog_set_service_name (IntPtr dialog, IntPtr type);
39 
40         [DllImport ("avahi-ui")]
aui_service_dialog_get_address(IntPtr dialog)41         private static extern IntPtr aui_service_dialog_get_address (IntPtr dialog);
42 
43         [DllImport ("avahi-ui")]
aui_service_dialog_get_port(IntPtr dialog)44         private static extern UInt16 aui_service_dialog_get_port (IntPtr dialog);
45 
46         [DllImport ("avahi-ui")]
aui_service_dialog_get_host_name(IntPtr dialog)47         private static extern IntPtr aui_service_dialog_get_host_name (IntPtr dialog);
48 
49         [DllImport ("avahi-ui")]
aui_service_dialog_get_txt_data(IntPtr dialog)50         private static extern IntPtr aui_service_dialog_get_txt_data (IntPtr dialog);
51 
52         [DllImport ("avahi-ui")]
aui_service_dialog_get_resolve_service(IntPtr dialog)53         private static extern bool aui_service_dialog_get_resolve_service (IntPtr dialog);
54 
55         [DllImport ("avahi-ui")]
aui_service_dialog_set_resolve_service(IntPtr dialog, bool val)56         private static extern void aui_service_dialog_set_resolve_service (IntPtr dialog, bool val);
57 
58         [DllImport ("avahi-ui")]
aui_service_dialog_get_resolve_host_name(IntPtr dialog)59         private static extern bool aui_service_dialog_get_resolve_host_name (IntPtr dialog);
60 
61         [DllImport ("avahi-ui")]
aui_service_dialog_set_resolve_host_name(IntPtr dialog, bool val)62         private static extern void aui_service_dialog_set_resolve_host_name (IntPtr dialog, bool val);
63 
64         [DllImport ("avahi-ui")]
aui_service_dialog_get_address_family(IntPtr dialog)65         private static extern Protocol aui_service_dialog_get_address_family (IntPtr dialog);
66 
67         [DllImport ("avahi-ui")]
aui_service_dialog_set_address_family(IntPtr dialog, Protocol proto)68         private static extern void aui_service_dialog_set_address_family (IntPtr dialog, Protocol proto);
69 
70         [DllImport ("avahi-common")]
avahi_address_snprint(IntPtr buf, int size, IntPtr address)71         private static extern IntPtr avahi_address_snprint (IntPtr buf, int size, IntPtr address);
72 
73         [DllImport ("avahi-common")]
avahi_string_list_get_next(IntPtr list)74         private static extern IntPtr avahi_string_list_get_next (IntPtr list);
75 
76         [DllImport ("avahi-common")]
avahi_string_list_get_text(IntPtr list)77         private static extern IntPtr avahi_string_list_get_text (IntPtr list);
78 
79         [DllImport ("avahi-common")]
avahi_string_list_get_size(IntPtr list)80         private static extern int avahi_string_list_get_size (IntPtr list);
81 
82         public string[] BrowseServiceTypes {
83             get {
84                 IntPtr arr = aui_service_dialog_get_browse_service_types (Raw);
85 
86                 ArrayList values = new ArrayList ();
87 
88                 for (int i = 0;;i++) {
89                     IntPtr ptr = Marshal.ReadIntPtr (arr, i * Marshal.SizeOf (typeof (IntPtr)));
90 
91                     if (ptr == IntPtr.Zero)
92                         break;
93 
94                     values.Add (GLib.Marshaller.Utf8PtrToString (ptr));
95                 }
96 
97                 return (string[]) values.ToArray (typeof (string));
98             } set {
99                 IntPtr[] types;
100                 if (value == null) {
101                     types = new IntPtr[] { IntPtr.Zero };
102                 } else {
103                     types = new IntPtr[value.Length + 1];
104 
105                     for (int i = 0; i < value.Length; i++) {
106                         types[i] = GLib.Marshaller.StringToPtrGStrdup (value[i]);
107                     }
108 
109                     types[value.Length] = IntPtr.Zero;
110                 }
111 
112                 aui_service_dialog_set_browse_service_typesv (Raw, types);
113 
114                 for (int i = 0;;i++) {
115                     if (types[i] != IntPtr.Zero)
116                         break;
117 
118                     GLib.Marshaller.Free (types[i]);
119                 }
120             }
121         }
122 
123         public string ServiceType {
124             get {
125                 return GLib.Marshaller.Utf8PtrToString (aui_service_dialog_get_service_type (Raw));
126             } set {
127                 IntPtr type = GLib.Marshaller.StringToPtrGStrdup (value);
128                 aui_service_dialog_set_service_type (Raw, type);
129                 GLib.Marshaller.Free (type);
130             }
131         }
132 
133         public string ServiceName {
134             get {
135                 return GLib.Marshaller.Utf8PtrToString (aui_service_dialog_get_service_name (Raw));
136             } set {
137                 IntPtr name = GLib.Marshaller.StringToPtrGStrdup (value);
138                 aui_service_dialog_set_service_name (Raw, name);
139                 GLib.Marshaller.Free (name);
140             }
141         }
142 
143         public IPAddress Address {
144             get {
145                 return PtrToAddress (aui_service_dialog_get_address (Raw));
146             }
147         }
148 
149         public UInt16 Port {
150             get {
151                 return aui_service_dialog_get_port (Raw);
152             }
153         }
154 
155         public string HostName {
156             get {
157                 return GLib.Marshaller.Utf8PtrToString (aui_service_dialog_get_host_name (Raw));
158             }
159         }
160 
161         public string Domain {
162             get {
163                 return GLib.Marshaller.Utf8PtrToString (aui_service_dialog_get_domain (Raw));
164             } set {
165                 IntPtr domain = GLib.Marshaller.StringToPtrGStrdup (value);
166                 aui_service_dialog_set_domain (Raw, domain);
167                 GLib.Marshaller.Free (domain);
168             }
169         }
170 
171         public byte[][] TxtData {
172             get {
173                 ArrayList txtlist = new ArrayList ();
174                 IntPtr txt = aui_service_dialog_get_txt_data (Raw);
175 
176                 for (IntPtr l = txt; l != IntPtr.Zero; l = avahi_string_list_get_next (l)) {
177                     IntPtr buf = avahi_string_list_get_text (l);
178                     int len = avahi_string_list_get_size (l);
179 
180                     byte[] txtbuf = new byte[len];
181                     Marshal.Copy (buf, txtbuf, 0, len);
182                     txtlist.Add (txtbuf);
183                 }
184 
185                 return (byte[][]) txtlist.ToArray (typeof (byte[]));
186             }
187         }
188 
189         public bool ResolveServiceEnabled {
190             get {
191                 return aui_service_dialog_get_resolve_service (Raw);
192             } set {
193                 aui_service_dialog_set_resolve_service (Raw, value);
194             }
195         }
196 
197         public bool ResolveHostNameEnabled {
198             get {
199                 return aui_service_dialog_get_resolve_host_name (Raw);
200             } set {
201                 aui_service_dialog_set_resolve_host_name (Raw, value);
202             }
203         }
204 
205         public Protocol AddressFamily {
206             get {
207                 return aui_service_dialog_get_address_family (Raw);
208             } set {
209                 aui_service_dialog_set_address_family (Raw, value);
210             }
211         }
212 
ServiceDialog(string title, Window parent, params object[] buttonData)213         public ServiceDialog (string title, Window parent, params object[] buttonData)
214         {
215             Raw = aui_service_dialog_new (title, parent == null ? IntPtr.Zero : parent.Handle,
216                                           IntPtr.Zero);
217 
218             for (int i = 0; i < buttonData.Length - 1; i += 2) {
219                 AddButton ((string) buttonData[i], (int) buttonData[i + 1]);
220             }
221         }
222 
PtrToAddress(IntPtr ptr)223         private static IPAddress PtrToAddress (IntPtr ptr)
224         {
225             IPAddress address = null;
226 
227             if (ptr != IntPtr.Zero) {
228                 IntPtr buf = Stdlib.malloc (256);
229                 IntPtr addrPtr = avahi_address_snprint (buf, 256, ptr);
230                 address = IPAddress.Parse (GLib.Marshaller.Utf8PtrToString (addrPtr));
231 
232                 Stdlib.free (addrPtr);
233             }
234 
235             return address;
236         }
237     }
238 }
239