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