1/* $Id$ */
2
3/***
4    This file is part of avahi.
5
6    avahi is free software; you can redistribute it and/or modify it
7    under the terms of the GNU Lesser General Public License as
8    published by the Free Software Foundation; either version 2.1 of the
9    License, or (at your option) any later version.
10
11    avahi is distributed in the hope that it will be useful, but WITHOUT
12    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13    or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
14    Public License for more details.
15
16    You should have received a copy of the GNU Lesser General Public
17    License along with avahi; if not, write to the Free Software
18    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
19    USA.
20***/
21
22using System;
23using System.Collections;
24using System.Text;
25using System.Net;
26using Avahi;
27
28public class AvahiTest {
29    private static Client client;
30    private static ArrayList objects = new ArrayList ();
31
32    public static void Main () {
33        client = new Client ();
34
35	Console.WriteLine ("joined service name: " + Client.JoinServiceName ("FooBar", "_foo", "local"));
36
37        EntryGroup eg = new EntryGroup (client);
38        eg.StateChanged += OnEntryGroupChanged;
39        eg.AddService ("foobar2", "_dingdong._tcp", client.DomainName,
40                       444, new string[] { "foo=stuff", "bar=stuff2", "baz=stuff3" });
41        eg.Commit ();
42        BrowseServiceTypes ("local");
43        Console.WriteLine ("Press enter to quit");
44        Console.ReadLine ();
45        client.Dispose ();
46    }
47
48    private static void OnEntryGroupChanged (object o, EntryGroupStateArgs args)
49    {
50        Console.WriteLine ("Entry group status: " + args.State);
51        if (args.State == EntryGroupState.Established) {
52            DomainBrowser browser = new DomainBrowser (client);
53            objects.Add (browser);
54
55            browser.DomainAdded += OnDomainAdded;
56        }
57    }
58
59    private static void OnDomainAdded (object o, DomainInfoArgs args)
60    {
61        Console.WriteLine ("Got domain added: " + args.Domain.Domain);
62        // BrowseServiceTypes (args.Domain.Domain);
63    }
64
65    private static void BrowseServiceTypes (string domain)
66    {
67        ServiceTypeBrowser stb = new ServiceTypeBrowser (client, domain);
68        objects.Add (stb);
69
70        stb.CacheExhausted += OnCacheExhausted;
71        stb.ServiceTypeAdded += OnServiceTypeAdded;
72    }
73
74    private static void OnCacheExhausted (object o, EventArgs args)
75    {
76        Console.WriteLine ("Cache is exhausted");
77    }
78
79    private static void OnServiceTypeAdded (object o, ServiceTypeInfoArgs args)
80    {
81        Console.WriteLine ("Got service type: " + args.ServiceType.ServiceType);
82        ServiceBrowser sb = new ServiceBrowser (client, args.ServiceType.ServiceType, args.ServiceType.Domain);
83        objects.Add (sb);
84
85        sb.ServiceAdded += OnServiceAdded;
86    }
87
88    private static void OnServiceAdded (object o, ServiceInfoArgs args)
89    {
90        // Console.WriteLine ("Got service: " + info.Name);
91        ServiceResolver resolver = new ServiceResolver (client, args.Service);
92        objects.Add (resolver);
93        resolver.Found += OnServiceResolved;
94    }
95
96    private static void OnServiceResolved (object o, ServiceInfoArgs args)
97    {
98        objects.Remove (o);
99
100        Console.WriteLine ("Service '{0}' at {1}:{2}", args.Service.Name, args.Service.HostName, args.Service.Port);
101        foreach (byte[] bytes in args.Service.Text) {
102            Console.WriteLine ("Text: " + Encoding.UTF8.GetString (bytes));
103        }
104
105        AddressResolver ar = new AddressResolver (client, args.Service.Address);
106        objects.Add (ar);
107
108        ar.Found += OnAddressResolved;
109        ar.Failed += OnAddressResolverFailed;
110    }
111
112    private static void OnAddressResolverFailed (object o, ErrorCodeArgs args)
113    {
114        Console.WriteLine ("Failed to resolve '{0}': {1}", (o as AddressResolver).Address, args.ErrorCode);
115    }
116
117    private static void OnAddressResolved (object o, HostAddressArgs args)
118    {
119        objects.Remove (o);
120
121        Console.WriteLine ("Resolved {0} to {1}", args.Address, args.Host);
122        HostNameResolver hr = new HostNameResolver (client, args.Host);
123        objects.Add (hr);
124
125        hr.Found += OnHostNameResolved;
126    }
127
128    private static void OnHostNameResolved (object o, HostAddressArgs args)
129    {
130        objects.Remove (o);
131        Console.WriteLine ("Resolved {0} to {1}", args.Host, args.Address);
132    }
133}
134