using System; using System.Net; using System.Collections; using System.Runtime.InteropServices; using Gtk; using Mono.Unix; using Mono.Unix.Native; namespace Avahi.UI { public class ServiceDialog : Dialog { [DllImport ("avahi-ui")] private static extern IntPtr aui_service_dialog_new (string title, IntPtr parent, IntPtr dummy); [DllImport ("avahi-ui")] private static extern void aui_service_dialog_set_browse_service_typesv (IntPtr dialog, IntPtr[] types); [DllImport ("avahi-ui")] private static extern IntPtr aui_service_dialog_get_browse_service_types (IntPtr dialog); [DllImport ("avahi-ui")] private static extern IntPtr aui_service_dialog_get_domain (IntPtr dialog); [DllImport ("avahi-ui")] private static extern void aui_service_dialog_set_domain (IntPtr dialog, IntPtr domain); [DllImport ("avahi-ui")] private static extern IntPtr aui_service_dialog_get_service_type (IntPtr dialog); [DllImport ("avahi-ui")] private static extern void aui_service_dialog_set_service_type (IntPtr dialog, IntPtr type); [DllImport ("avahi-ui")] private static extern IntPtr aui_service_dialog_get_service_name (IntPtr dialog); [DllImport ("avahi-ui")] private static extern void aui_service_dialog_set_service_name (IntPtr dialog, IntPtr type); [DllImport ("avahi-ui")] private static extern IntPtr aui_service_dialog_get_address (IntPtr dialog); [DllImport ("avahi-ui")] private static extern UInt16 aui_service_dialog_get_port (IntPtr dialog); [DllImport ("avahi-ui")] private static extern IntPtr aui_service_dialog_get_host_name (IntPtr dialog); [DllImport ("avahi-ui")] private static extern IntPtr aui_service_dialog_get_txt_data (IntPtr dialog); [DllImport ("avahi-ui")] private static extern bool aui_service_dialog_get_resolve_service (IntPtr dialog); [DllImport ("avahi-ui")] private static extern void aui_service_dialog_set_resolve_service (IntPtr dialog, bool val); [DllImport ("avahi-ui")] private static extern bool aui_service_dialog_get_resolve_host_name (IntPtr dialog); [DllImport ("avahi-ui")] private static extern void aui_service_dialog_set_resolve_host_name (IntPtr dialog, bool val); [DllImport ("avahi-ui")] private static extern Protocol aui_service_dialog_get_address_family (IntPtr dialog); [DllImport ("avahi-ui")] private static extern void aui_service_dialog_set_address_family (IntPtr dialog, Protocol proto); [DllImport ("avahi-common")] private static extern IntPtr avahi_address_snprint (IntPtr buf, int size, IntPtr address); [DllImport ("avahi-common")] private static extern IntPtr avahi_string_list_get_next (IntPtr list); [DllImport ("avahi-common")] private static extern IntPtr avahi_string_list_get_text (IntPtr list); [DllImport ("avahi-common")] private static extern int avahi_string_list_get_size (IntPtr list); public string[] BrowseServiceTypes { get { IntPtr arr = aui_service_dialog_get_browse_service_types (Raw); ArrayList values = new ArrayList (); for (int i = 0;;i++) { IntPtr ptr = Marshal.ReadIntPtr (arr, i * Marshal.SizeOf (typeof (IntPtr))); if (ptr == IntPtr.Zero) break; values.Add (GLib.Marshaller.Utf8PtrToString (ptr)); } return (string[]) values.ToArray (typeof (string)); } set { IntPtr[] types; if (value == null) { types = new IntPtr[] { IntPtr.Zero }; } else { types = new IntPtr[value.Length + 1]; for (int i = 0; i < value.Length; i++) { types[i] = GLib.Marshaller.StringToPtrGStrdup (value[i]); } types[value.Length] = IntPtr.Zero; } aui_service_dialog_set_browse_service_typesv (Raw, types); for (int i = 0;;i++) { if (types[i] != IntPtr.Zero) break; GLib.Marshaller.Free (types[i]); } } } public string ServiceType { get { return GLib.Marshaller.Utf8PtrToString (aui_service_dialog_get_service_type (Raw)); } set { IntPtr type = GLib.Marshaller.StringToPtrGStrdup (value); aui_service_dialog_set_service_type (Raw, type); GLib.Marshaller.Free (type); } } public string ServiceName { get { return GLib.Marshaller.Utf8PtrToString (aui_service_dialog_get_service_name (Raw)); } set { IntPtr name = GLib.Marshaller.StringToPtrGStrdup (value); aui_service_dialog_set_service_name (Raw, name); GLib.Marshaller.Free (name); } } public IPAddress Address { get { return PtrToAddress (aui_service_dialog_get_address (Raw)); } } public UInt16 Port { get { return aui_service_dialog_get_port (Raw); } } public string HostName { get { return GLib.Marshaller.Utf8PtrToString (aui_service_dialog_get_host_name (Raw)); } } public string Domain { get { return GLib.Marshaller.Utf8PtrToString (aui_service_dialog_get_domain (Raw)); } set { IntPtr domain = GLib.Marshaller.StringToPtrGStrdup (value); aui_service_dialog_set_domain (Raw, domain); GLib.Marshaller.Free (domain); } } public byte[][] TxtData { get { ArrayList txtlist = new ArrayList (); IntPtr txt = aui_service_dialog_get_txt_data (Raw); for (IntPtr l = txt; l != IntPtr.Zero; l = avahi_string_list_get_next (l)) { IntPtr buf = avahi_string_list_get_text (l); int len = avahi_string_list_get_size (l); byte[] txtbuf = new byte[len]; Marshal.Copy (buf, txtbuf, 0, len); txtlist.Add (txtbuf); } return (byte[][]) txtlist.ToArray (typeof (byte[])); } } public bool ResolveServiceEnabled { get { return aui_service_dialog_get_resolve_service (Raw); } set { aui_service_dialog_set_resolve_service (Raw, value); } } public bool ResolveHostNameEnabled { get { return aui_service_dialog_get_resolve_host_name (Raw); } set { aui_service_dialog_set_resolve_host_name (Raw, value); } } public Protocol AddressFamily { get { return aui_service_dialog_get_address_family (Raw); } set { aui_service_dialog_set_address_family (Raw, value); } } public ServiceDialog (string title, Window parent, params object[] buttonData) { Raw = aui_service_dialog_new (title, parent == null ? IntPtr.Zero : parent.Handle, IntPtr.Zero); for (int i = 0; i < buttonData.Length - 1; i += 2) { AddButton ((string) buttonData[i], (int) buttonData[i + 1]); } } private static IPAddress PtrToAddress (IntPtr ptr) { IPAddress address = null; if (ptr != IntPtr.Zero) { IntPtr buf = Stdlib.malloc (256); IntPtr addrPtr = avahi_address_snprint (buf, 256, ptr); address = IPAddress.Parse (GLib.Marshaller.Utf8PtrToString (addrPtr)); Stdlib.free (addrPtr); } return address; } } }