X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-sharp%2FEntryGroup.cs;h=24abae4d5222b0b4c0998b8ef9eac73d5578110e;hb=2aa610ca9e872c18937c298d1d52dea20702176d;hp=eb7d9e2725ebf5a35731dad73630181011512cfb;hpb=84e07c25895dd6a8f706499a867afa44b9444ce2;p=catta diff --git a/avahi-sharp/EntryGroup.cs b/avahi-sharp/EntryGroup.cs index eb7d9e2..24abae4 100644 --- a/avahi-sharp/EntryGroup.cs +++ b/avahi-sharp/EntryGroup.cs @@ -1,5 +1,3 @@ -/* $Id$ */ - /*** This file is part of avahi. @@ -22,6 +20,7 @@ using System; using System.Net; using System.Runtime.InteropServices; +using System.Text; using Mono.Unix; namespace Avahi @@ -40,7 +39,7 @@ namespace Avahi UseWideArea = 128, UseMulticast = 256 } - + public enum EntryGroupState { Uncommited, Registering, @@ -57,7 +56,7 @@ namespace Avahi { get { return state; } } - + public EntryGroupStateArgs (EntryGroupState state) { this.state = state; @@ -66,13 +65,13 @@ namespace Avahi internal delegate void EntryGroupCallback (IntPtr group, EntryGroupState state, IntPtr userdata); public delegate void EntryGroupStateHandler (object o, EntryGroupStateArgs args); - + public class EntryGroup : IDisposable { private Client client; private IntPtr handle; private EntryGroupCallback cb; - + [DllImport ("avahi-client")] private static extern IntPtr avahi_entry_group_new (IntPtr client, EntryGroupCallback cb, IntPtr userdata); @@ -90,30 +89,30 @@ namespace Avahi [DllImport ("avahi-client")] private static extern int avahi_entry_group_add_service_strlst (IntPtr group, int iface, Protocol proto, - PublishFlags flags, IntPtr name, IntPtr type, - IntPtr domain, IntPtr host, UInt16 port, + PublishFlags flags, byte[] name, byte[] type, + byte[] domain, byte[] host, UInt16 port, IntPtr strlst); [DllImport ("avahi-client")] private static extern int avahi_entry_group_update_service_strlst (IntPtr group, int iface, Protocol proto, - PublishFlags flags, IntPtr name, - IntPtr type, IntPtr domain, IntPtr strlst); + PublishFlags flags, byte[] name, + byte[] type, byte[] domain, IntPtr strlst); [DllImport ("avahi-client")] private static extern int avahi_entry_group_add_service_subtype (IntPtr group, int iface, Protocol proto, - PublishFlags flags, IntPtr name, IntPtr type, - IntPtr domain, IntPtr subtype); + PublishFlags flags, byte[] name, byte[] type, + byte[] domain, byte[] subtype); [DllImport ("avahi-client")] private static extern int avahi_entry_group_add_address (IntPtr group, int iface, Protocol proto, - PublishFlags flags, IntPtr name, IntPtr address); + PublishFlags flags, byte[] name, IntPtr address); [DllImport ("avahi-client")] private static extern int avahi_entry_group_add_record (IntPtr group, int iface, Protocol proto, - PublishFlags flags, IntPtr name, RecordClass clazz, + PublishFlags flags, byte[] name, RecordClass clazz, RecordType type, uint ttl, byte[] rdata, int size); - + [DllImport ("avahi-client")] private static extern void avahi_entry_group_free (IntPtr group); @@ -121,26 +120,16 @@ namespace Avahi private static extern IntPtr avahi_string_list_new (IntPtr txt); [DllImport ("avahi-common")] - private static extern IntPtr avahi_string_list_add (IntPtr list, IntPtr txt); + private static extern IntPtr avahi_string_list_add (IntPtr list, byte[] txt); [DllImport ("avahi-common")] private static extern void avahi_string_list_free (IntPtr list); [DllImport ("avahi-common")] - private static extern int avahi_service_name_join (IntPtr buf, int len, IntPtr name, IntPtr type, - IntPtr domain); - - [DllImport ("avahi-common")] - private static extern int avahi_service_name_split (IntPtr service, IntPtr name, int name_len, - IntPtr type, int type_len, - IntPtr domain, int domain_len); - - - [DllImport ("avahi-common")] - private static extern IntPtr avahi_alternative_service_name (IntPtr name); + private static extern IntPtr avahi_alternative_service_name (byte[] name); public event EntryGroupStateHandler StateChanged; - + public EntryGroupState State { get { @@ -158,7 +147,7 @@ namespace Avahi } } } - + public EntryGroup (Client client) { this.client = client; @@ -221,32 +210,45 @@ namespace Avahi if (txt != null) { foreach (string item in txt) { - IntPtr itemPtr = Utility.StringToPtr (item); - list = avahi_string_list_add (list, itemPtr); - Utility.Free (itemPtr); + list = avahi_string_list_add (list, Utility.StringToBytes (item)); + } + } + + AddService (iface, proto, flags, name, type, domain, host, port, list); + } + + public void AddService (int iface, Protocol proto, PublishFlags flags, string name, string type, string domain, + string host, UInt16 port, params byte[][] txt) + { + IntPtr list = avahi_string_list_new (IntPtr.Zero); + + if (txt != null) { + foreach (byte[] item in txt) { + list = avahi_string_list_add (list, item); } } - IntPtr namePtr = Utility.StringToPtr (name); - IntPtr typePtr = Utility.StringToPtr (type); - IntPtr domainPtr = Utility.StringToPtr (domain); - IntPtr hostPtr = Utility.StringToPtr (host); + AddService (iface, proto, flags, name, type, domain, host, port, list); + } + + private void AddService (int iface, Protocol proto, PublishFlags flags, string name, string type, + string domain, string host, UInt16 port, IntPtr list) + { + int ret; lock (client) { - int ret = avahi_entry_group_add_service_strlst (handle, iface, proto, flags, namePtr, typePtr, domainPtr, - hostPtr, port, list); + ret = avahi_entry_group_add_service_strlst (handle, iface, proto, flags, + Utility.StringToBytes (name), + Utility.StringToBytes (type), + Utility.StringToBytes (domain), + Utility.StringToBytes (host), port, list); + } - Utility.Free (namePtr); - Utility.Free (typePtr); - Utility.Free (domainPtr); - Utility.Free (hostPtr); - avahi_string_list_free (list); + avahi_string_list_free (list); - if (ret < 0) { - client.ThrowError (); - } + if (ret < 0) { + client.ThrowError (); } - } public void UpdateService (string name, string type, string domain, params string[] txt) @@ -261,23 +263,37 @@ namespace Avahi if (txt != null) { foreach (string item in txt) { - IntPtr itemPtr = Utility.StringToPtr (item); - list = avahi_string_list_add (list, itemPtr); - Utility.Free (itemPtr); + list = avahi_string_list_add (list, Utility.StringToBytes (item)); } } - IntPtr namePtr = Utility.StringToPtr (name); - IntPtr typePtr = Utility.StringToPtr (type); - IntPtr domainPtr = Utility.StringToPtr (domain); + UpdateService (iface, proto, flags, name, type, domain, list); + } + public void UpdateService (int iface, Protocol proto, PublishFlags flags, string name, string type, + string domain, params byte[][] txt) + { + IntPtr list = avahi_string_list_new (IntPtr.Zero); + + if (txt != null) { + foreach (byte[] item in txt) { + list = avahi_string_list_add (list, item); + } + } + + UpdateService (iface, proto, flags, name, type, domain, list); + } + + private void UpdateService (int iface, Protocol proto, PublishFlags flags, string name, string type, + string domain, IntPtr list) + { lock (client) { - int ret = avahi_entry_group_update_service_strlst (handle, iface, proto, flags, namePtr, typePtr, domainPtr, list); + int ret = avahi_entry_group_update_service_strlst (handle, iface, proto, flags, + Utility.StringToBytes (name), + Utility.StringToBytes (type), + Utility.StringToBytes (domain), + list); - Utility.Free (namePtr); - Utility.Free (typePtr); - Utility.Free (domainPtr); - avahi_string_list_free (list); if (ret < 0) { @@ -294,20 +310,13 @@ namespace Avahi public void AddServiceSubtype (int iface, Protocol proto, PublishFlags flags, string name, string type, string domain, string subtype) { - IntPtr namePtr = Utility.StringToPtr (name); - IntPtr typePtr = Utility.StringToPtr (type); - IntPtr domainPtr = Utility.StringToPtr (domain); - IntPtr subtypePtr = Utility.StringToPtr (subtype); - lock (client) { - int ret = avahi_entry_group_add_service_subtype (handle, iface, proto, flags, namePtr, - typePtr, domainPtr, subtypePtr); - - Utility.Free (namePtr); - Utility.Free (typePtr); - Utility.Free (domainPtr); - Utility.Free (subtypePtr); - + int ret = avahi_entry_group_add_service_subtype (handle, iface, proto, flags, + Utility.StringToBytes (name), + Utility.StringToBytes (type), + Utility.StringToBytes (domain), + Utility.StringToBytes (subtype)); + if (ret < 0) { client.ThrowError (); } @@ -321,13 +330,12 @@ namespace Avahi public void AddAddress (int iface, Protocol proto, PublishFlags flags, string name, IPAddress address) { - IntPtr namePtr = Utility.StringToPtr (name); IntPtr addressPtr = Utility.AddressToPtr (address); lock (client) { - int ret = avahi_entry_group_add_address (handle, iface, proto, flags, namePtr, addressPtr); + int ret = avahi_entry_group_add_address (handle, iface, proto, flags, + Utility.StringToBytes (name), addressPtr); - Utility.Free (namePtr); Utility.Free (addressPtr); if (ret < 0) { @@ -344,85 +352,19 @@ namespace Avahi public void AddRecord (int iface, Protocol proto, PublishFlags flags, string name, RecordClass clazz, RecordType type, uint ttl, byte[] rdata, int length) { - IntPtr namePtr = Utility.StringToPtr (name); - lock (client) { - int ret = avahi_entry_group_add_record (handle, iface, proto, flags, namePtr, + int ret = avahi_entry_group_add_record (handle, iface, proto, flags, + Utility.StringToBytes (name), clazz, type, ttl, rdata, length); - Utility.Free (namePtr); - if (ret < 0) { client.ThrowError (); } } } - public static string JoinServiceName (string name, string type, string domain) - { - int len = 4 * (name.Length + type.Length + domain.Length) + 4; - IntPtr buf = Stdlib.malloc ((ulong) len); - - IntPtr namePtr = Utility.StringToPtr (name); - IntPtr typePtr = Utility.StringToPtr (type); - IntPtr domainPtr = Utility.StringToPtr (domain); - - int ret = avahi_service_name_join (buf, len, namePtr, typePtr, domainPtr); - - Utility.Free (namePtr); - Utility.Free (typePtr); - Utility.Free (domainPtr); - - if (ret < 0) { - Utility.Free (buf); - return null; // FIXME, should throw exception - } - - string service = Utility.PtrToString (buf); - Utility.Free (buf); - - return service; - } - - public static void SplitServiceName (string service, out string name, out string type, out string domain) - { - int len = 1024; - - IntPtr servicePtr = Utility.StringToPtr (service); - IntPtr namePtr = Stdlib.malloc ((ulong) len); - IntPtr typePtr = Stdlib.malloc ((ulong) len); - IntPtr domainPtr = Stdlib.malloc ((ulong) len); - - int ret = avahi_service_name_split (servicePtr, namePtr, len, typePtr, len, domainPtr, len); - - Utility.Free (servicePtr); - - if (ret < 0) { - Utility.Free (namePtr); - Utility.Free (typePtr); - Utility.Free (domainPtr); - - name = null; - type = null; - domain = null; - return; - } - - name = Utility.PtrToString (namePtr); - type = Utility.PtrToString (typePtr); - domain = Utility.PtrToString (domainPtr); - - Utility.Free (namePtr); - Utility.Free (typePtr); - Utility.Free (domainPtr); - } - public static string GetAlternativeServiceName (string name) { - IntPtr namePtr = Utility.StringToPtr (name); - IntPtr result = avahi_alternative_service_name (namePtr); - Utility.Free (namePtr); - - return Utility.PtrToStringFree (result); + return Utility.PtrToStringFree (avahi_alternative_service_name (Utility.StringToBytes (name))); } private void OnEntryGroupCallback (IntPtr group, EntryGroupState state, IntPtr userdata)