From 3025a26988fe2de9d14867056c945e20f490ec1e Mon Sep 17 00:00:00 2001 From: James Willcox Date: Thu, 19 Apr 2007 21:01:45 +0000 Subject: add avahi-ui-sharp git-svn-id: file:///home/lennart/svn/public/avahi/trunk@1444 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe --- avahi-ui-sharp/ServiceDialog.cs | 238 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 238 insertions(+) create mode 100644 avahi-ui-sharp/ServiceDialog.cs (limited to 'avahi-ui-sharp/ServiceDialog.cs') diff --git a/avahi-ui-sharp/ServiceDialog.cs b/avahi-ui-sharp/ServiceDialog.cs new file mode 100644 index 0000000..e0306e1 --- /dev/null +++ b/avahi-ui-sharp/ServiceDialog.cs @@ -0,0 +1,238 @@ +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; + } + } +} -- cgit