]> git.meshlink.io Git - catta/blobdiff - avahi-sharp/EntryGroup.cs
avahi-discover crashes if row is unselected
[catta] / avahi-sharp / EntryGroup.cs
index 2ebecc2afee1b690192531a0a5afd3ce4b8e43d6..02be643676bebbddcfc8c75e2fa299b090795fe0 100644 (file)
@@ -127,16 +127,6 @@ 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);
 
@@ -246,11 +236,15 @@ 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);
             
@@ -275,6 +269,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 +365,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)));
         }