X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-sharp%2FEntryGroup.cs;h=24abae4d5222b0b4c0998b8ef9eac73d5578110e;hb=a50ab2d8de27e616c9834df3063d99da6ebbd2ac;hp=ccdeec9fc5e24d138eb0cf72872f38e0af9b9415;hpb=54320e5cf9ebb54565d7134e52b2610b02a0d586;p=catta diff --git a/avahi-sharp/EntryGroup.cs b/avahi-sharp/EntryGroup.cs index ccdeec9..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 (); } @@ -291,7 +283,7 @@ namespace Avahi 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) { @@ -371,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))); }