• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-WNDR4500v2-V1.0.0.60_1.0.38/ap/gpl/timemachine/avahi-0.6.25/avahi-ui-sharp/
1using System;
2using System.Net;
3using System.Collections;
4using System.Runtime.InteropServices;
5using Gtk;
6using Mono.Unix;
7using Mono.Unix.Native;
8
9namespace 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}
239