summaryrefslogtreecommitdiffstats
path: root/avahi-ui-sharp/ServiceDialog.cs
diff options
context:
space:
mode:
Diffstat (limited to 'avahi-ui-sharp/ServiceDialog.cs')
-rw-r--r--avahi-ui-sharp/ServiceDialog.cs238
1 files changed, 238 insertions, 0 deletions
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;
+ }
+ }
+}