X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-sharp%2FEntryGroup.cs;h=24abae4d5222b0b4c0998b8ef9eac73d5578110e;hb=b9a4269fb288cffeac208aa7845ac25aad8954b0;hp=2ebecc2afee1b690192531a0a5afd3ce4b8e43d6;hpb=9a589e1f5221d1bd995b6c4fa73e3a074d4c2da4;p=catta diff --git a/avahi-sharp/EntryGroup.cs b/avahi-sharp/EntryGroup.cs index 2ebecc2..24abae4 100644 --- a/avahi-sharp/EntryGroup.cs +++ b/avahi-sharp/EntryGroup.cs @@ -1,5 +1,3 @@ -/* $Id$ */ - /*** This file is part of avahi. @@ -41,7 +39,7 @@ namespace Avahi UseWideArea = 128, UseMulticast = 256 } - + public enum EntryGroupState { Uncommited, Registering, @@ -58,7 +56,7 @@ namespace Avahi { get { return state; } } - + public EntryGroupStateArgs (EntryGroupState state) { this.state = state; @@ -67,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); @@ -114,7 +112,7 @@ namespace Avahi private static extern int avahi_entry_group_add_record (IntPtr group, int iface, Protocol proto, 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); @@ -127,21 +125,11 @@ namespace Avahi [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, byte[] name, byte[] type, - byte[] domain); - - [DllImport ("avahi-common")] - private static extern int avahi_service_name_split (byte[] 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 (byte[] name); public event EntryGroupStateHandler StateChanged; - + public EntryGroupState State { get { @@ -159,7 +147,7 @@ namespace Avahi } } } - + public EntryGroup (Client client) { this.client = client; @@ -246,14 +234,18 @@ namespace Avahi private void AddService (int iface, Protocol proto, PublishFlags flags, string name, string type, string domain, string host, UInt16 port, IntPtr list) { - int ret = avahi_entry_group_add_service_strlst (handle, iface, proto, flags, + int ret; + + lock (client) { + 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); - + } + avahi_string_list_free (list); - + if (ret < 0) { client.ThrowError (); } @@ -275,6 +267,26 @@ namespace Avahi } } + 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, Utility.StringToBytes (name), @@ -351,58 +363,6 @@ namespace Avahi } } - 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); - - int ret = avahi_service_name_join (buf, len, - Utility.StringToBytes (name), - Utility.StringToBytes (type), - Utility.StringToBytes (domain)); - - 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 namePtr = Stdlib.malloc ((ulong) len); - IntPtr typePtr = Stdlib.malloc ((ulong) len); - IntPtr domainPtr = Stdlib.malloc ((ulong) len); - - int ret = avahi_service_name_split (Utility.StringToBytes (service), namePtr, len, typePtr, len, - domainPtr, len); - - 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) { return Utility.PtrToStringFree (avahi_alternative_service_name (Utility.StringToBytes (name))); }