2 using System.Runtime.InteropServices;
8 public enum EntryGroupState {
15 internal delegate void EntryGroupCallback (IntPtr group, EntryGroupState state, IntPtr userdata);
16 public delegate void EntryGroupStateHandler (object o, EntryGroupState state);
18 public class EntryGroup : IDisposable
20 private Client client;
21 private IntPtr handle;
23 [DllImport ("avahi-client")]
24 private static extern IntPtr avahi_entry_group_new (IntPtr client, EntryGroupCallback cb, IntPtr userdata);
26 [DllImport ("avahi-client")]
27 private static extern void avahi_entry_group_commit (IntPtr group);
29 [DllImport ("avahi-client")]
30 private static extern void avahi_entry_group_reset (IntPtr group);
32 [DllImport ("avahi-client")]
33 private static extern EntryGroupState avahi_entry_group_get_state (IntPtr group);
35 [DllImport ("avahi-client")]
36 private static extern bool avahi_entry_group_is_empty (IntPtr group);
38 [DllImport ("avahi-client")]
39 private static extern void avahi_entry_group_add_service_strlst (IntPtr group, int iface, Protocol proto,
40 IntPtr name, IntPtr type, IntPtr domain,
41 IntPtr host, UInt16 port, IntPtr strlst);
43 [DllImport ("avahi-client")]
44 private static extern void avahi_entry_group_free (IntPtr group);
46 [DllImport ("avahi-common")]
47 private static extern IntPtr avahi_string_list_new (IntPtr txt);
49 [DllImport ("avahi-common")]
50 private static extern void avahi_string_list_add (IntPtr list, IntPtr txt);
52 [DllImport ("avahi-common")]
53 private static extern void avahi_string_list_free (IntPtr list);
55 public event EntryGroupStateHandler StateChanged;
57 public EntryGroupState State
59 get { return avahi_entry_group_get_state (handle); }
64 get { return avahi_entry_group_is_empty (handle); }
67 public EntryGroup (Client client)
70 handle = avahi_entry_group_new (client.Handle, OnEntryGroupCallback, IntPtr.Zero);
79 public void Dispose ()
81 if (handle != IntPtr.Zero) {
82 avahi_entry_group_free (handle);
89 avahi_entry_group_commit (handle);
95 avahi_entry_group_reset (handle);
99 public void AddService (string name, string type, string domain,
100 UInt16 port, string[] txt)
102 AddService (-1, Protocol.Unspecified, name, type, domain, null, port, txt);
105 public void AddService (int iface, Protocol proto, string name, string type, string domain,
106 string host, UInt16 port, string[] txt)
108 IntPtr list = avahi_string_list_new (IntPtr.Zero);
111 foreach (string item in txt) {
112 IntPtr itemPtr = Utility.StringToPtr (item);
113 avahi_string_list_add (list, itemPtr);
114 Utility.Free (itemPtr);
118 IntPtr namePtr = Utility.StringToPtr (name);
119 IntPtr typePtr = Utility.StringToPtr (type);
120 IntPtr domainPtr = Utility.StringToPtr (domain);
121 IntPtr hostPtr = Utility.StringToPtr (host);
122 avahi_entry_group_add_service_strlst (handle, iface, proto, namePtr, typePtr, domainPtr,
123 hostPtr, port, list);
124 avahi_string_list_free (list);
126 client.CheckError ();
128 Console.WriteLine ("Added service: {0}, {1}, {2}, {3}, {4}", name, type, domain, host, port);
131 private void OnEntryGroupCallback (IntPtr group, EntryGroupState state, IntPtr userdata)
133 if (StateChanged != null)
134 StateChanged (this, state);