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