-/* $Id$ */
-
/***
This file is part of avahi.
UseWideArea = 128,
UseMulticast = 256
}
-
+
public enum EntryGroupState {
Uncommited,
Registering,
{
get { return state; }
}
-
+
public EntryGroupStateArgs (EntryGroupState state)
{
this.state = state;
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);
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);
[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 {
}
}
}
-
+
public EntryGroup (Client client)
{
this.client = client;
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 ();
}
}
}
+ 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),
}
}
- 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)));
}