]> git.meshlink.io Git - catta/blob - avahi-ui-sharp/ServiceDialog.cs
CVE-2009-0758: Reflector creates packet storm on legacy unicast traffic
[catta] / avahi-ui-sharp / ServiceDialog.cs
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")]
14         private static extern IntPtr aui_service_dialog_new (string title, IntPtr parent, IntPtr dummy);
15
16         [DllImport ("avahi-ui")]
17         private static extern void aui_service_dialog_set_browse_service_typesv (IntPtr dialog, IntPtr[] types);
18
19         [DllImport ("avahi-ui")]
20         private static extern IntPtr aui_service_dialog_get_browse_service_types (IntPtr dialog);
21
22         [DllImport ("avahi-ui")]
23         private static extern IntPtr aui_service_dialog_get_domain (IntPtr dialog);
24
25         [DllImport ("avahi-ui")]
26         private static extern void aui_service_dialog_set_domain (IntPtr dialog, IntPtr domain);
27
28         [DllImport ("avahi-ui")]
29         private static extern IntPtr aui_service_dialog_get_service_type (IntPtr dialog);
30         
31         [DllImport ("avahi-ui")]
32         private static extern void aui_service_dialog_set_service_type (IntPtr dialog, IntPtr type);
33
34         [DllImport ("avahi-ui")]
35         private static extern IntPtr aui_service_dialog_get_service_name (IntPtr dialog);
36         
37         [DllImport ("avahi-ui")]
38         private static extern void aui_service_dialog_set_service_name (IntPtr dialog, IntPtr type);
39
40         [DllImport ("avahi-ui")]
41         private static extern IntPtr aui_service_dialog_get_address (IntPtr dialog);
42
43         [DllImport ("avahi-ui")]
44         private static extern UInt16 aui_service_dialog_get_port (IntPtr dialog);
45
46         [DllImport ("avahi-ui")]
47         private static extern IntPtr aui_service_dialog_get_host_name (IntPtr dialog);
48
49         [DllImport ("avahi-ui")]
50         private static extern IntPtr aui_service_dialog_get_txt_data (IntPtr dialog);
51
52         [DllImport ("avahi-ui")]
53         private static extern bool aui_service_dialog_get_resolve_service (IntPtr dialog);
54
55         [DllImport ("avahi-ui")]
56         private static extern void aui_service_dialog_set_resolve_service (IntPtr dialog, bool val);
57
58         [DllImport ("avahi-ui")]
59         private static extern bool aui_service_dialog_get_resolve_host_name (IntPtr dialog);
60
61         [DllImport ("avahi-ui")]
62         private static extern void aui_service_dialog_set_resolve_host_name (IntPtr dialog, bool val);
63
64         [DllImport ("avahi-ui")]
65         private static extern Protocol aui_service_dialog_get_address_family (IntPtr dialog);
66
67         [DllImport ("avahi-ui")]
68         private static extern void aui_service_dialog_set_address_family (IntPtr dialog, Protocol proto);
69
70         [DllImport ("avahi-common")]
71         private static extern IntPtr avahi_address_snprint (IntPtr buf, int size, IntPtr address);
72
73         [DllImport ("avahi-common")]
74         private static extern IntPtr avahi_string_list_get_next (IntPtr list);
75
76         [DllImport ("avahi-common")]
77         private static extern IntPtr avahi_string_list_get_text (IntPtr list);
78
79         [DllImport ("avahi-common")]
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         
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
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 }