c741f51ab5e81a765716e2bb81fe50eaaea54f6f
[platform/framework/web/crosswalk.git] / src / chrome / browser / local_discovery / service_discovery_client_mdns.h
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef CHROME_BROWSER_LOCAL_DISCOVERY_SERVICE_DISCOVERY_CLIENT_MDNS_H_
6 #define CHROME_BROWSER_LOCAL_DISCOVERY_SERVICE_DISCOVERY_CLIENT_MDNS_H_
7
8 #include <set>
9 #include <string>
10
11 #include "base/cancelable_callback.h"
12 #include "chrome/browser/local_discovery/service_discovery_shared_client.h"
13 #include "chrome/common/local_discovery/service_discovery_client.h"
14 #include "net/base/network_change_notifier.h"
15 #include "net/dns/mdns_client.h"
16
17 namespace local_discovery {
18
19 // Implementation of ServiceDiscoverySharedClient with front-end of UI thread
20 // and networking code on IO thread.
21 class ServiceDiscoveryClientMdns
22     : public ServiceDiscoverySharedClient,
23       public net::NetworkChangeNotifier::NetworkChangeObserver {
24  public:
25   class Proxy;
26   ServiceDiscoveryClientMdns();
27
28   // ServiceDiscoveryClient implementation.
29   virtual scoped_ptr<ServiceWatcher> CreateServiceWatcher(
30       const std::string& service_type,
31       const ServiceWatcher::UpdatedCallback& callback) OVERRIDE;
32   virtual scoped_ptr<ServiceResolver> CreateServiceResolver(
33       const std::string& service_name,
34       const ServiceResolver::ResolveCompleteCallback& callback) OVERRIDE;
35   virtual scoped_ptr<LocalDomainResolver> CreateLocalDomainResolver(
36       const std::string& domain,
37       net::AddressFamily address_family,
38       const LocalDomainResolver::IPAddressCallback& callback) OVERRIDE;
39
40   // net::NetworkChangeNotifier::NetworkChangeObserver implementation.
41   virtual void OnNetworkChanged(
42       net::NetworkChangeNotifier::ConnectionType type) OVERRIDE;
43
44  private:
45   virtual ~ServiceDiscoveryClientMdns();
46
47   void ScheduleStartNewClient();
48   void StartNewClient();
49   void OnInterfaceListReady(const net::InterfaceIndexFamilyList& interfaces);
50   void OnMdnsInitialized(bool success);
51   void ReportSuccess();
52   void InvalidateWeakPtrs();
53   void Reset();
54
55   bool PostToMdnsThread(const base::Closure& task);
56
57   std::set<Proxy*> proxies_;
58
59   scoped_refptr<base::SequencedTaskRunner> mdns_runner_;
60
61   // Access only on |mdns_runner_| thread.
62   scoped_ptr<net::MDnsClient> mdns_;
63
64   // Access only on |mdns_runner_| thread.
65   scoped_ptr<ServiceDiscoveryClient> client_;
66
67   // Counter of restart attempts we have made after network change.
68   int restart_attempts_;
69
70   // If false delay tasks until initialization is posted to |mdns_runner_|
71   // thread.
72   bool need_dalay_mdns_tasks_;
73
74   // Delayed |mdns_runner_| tasks.
75   std::vector<base::Closure> delayed_tasks_;
76
77   base::WeakPtrFactory<ServiceDiscoveryClientMdns> weak_ptr_factory_;
78
79   DISALLOW_COPY_AND_ASSIGN(ServiceDiscoveryClientMdns);
80 };
81
82 }  // namespace local_discovery
83
84 #endif  // CHROME_BROWSER_LOCAL_DISCOVERY_SERVICE_DISCOVERY_CLIENT_MDNS_H_