service_discovery_client_mdns.h revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
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 "base/observer_list.h"
13#include "chrome/browser/local_discovery/service_discovery_shared_client.h"
14#include "chrome/common/local_discovery/service_discovery_client.h"
15#include "net/base/network_change_notifier.h"
16#include "net/dns/mdns_client.h"
17
18namespace local_discovery {
19
20// Implementation of ServiceDiscoverySharedClient with front-end of UI thread
21// and networking code on IO thread.
22class ServiceDiscoveryClientMdns
23    : public ServiceDiscoverySharedClient,
24      public net::NetworkChangeNotifier::NetworkChangeObserver {
25 public:
26  class Proxy;
27  ServiceDiscoveryClientMdns();
28
29  // ServiceDiscoveryClient implementation.
30  virtual scoped_ptr<ServiceWatcher> CreateServiceWatcher(
31      const std::string& service_type,
32      const ServiceWatcher::UpdatedCallback& callback) OVERRIDE;
33  virtual scoped_ptr<ServiceResolver> CreateServiceResolver(
34      const std::string& service_name,
35      const ServiceResolver::ResolveCompleteCallback& callback) OVERRIDE;
36  virtual scoped_ptr<LocalDomainResolver> CreateLocalDomainResolver(
37      const std::string& domain,
38      net::AddressFamily address_family,
39      const LocalDomainResolver::IPAddressCallback& callback) OVERRIDE;
40
41  // net::NetworkChangeNotifier::NetworkChangeObserver implementation.
42  virtual void OnNetworkChanged(
43      net::NetworkChangeNotifier::ConnectionType type) OVERRIDE;
44
45 private:
46  virtual ~ServiceDiscoveryClientMdns();
47
48  void ScheduleStartNewClient();
49  void StartNewClient();
50  void OnInterfaceListReady(const net::InterfaceIndexFamilyList& interfaces);
51  void OnMdnsInitialized(bool success);
52  void ReportSuccess();
53  void InvalidateWeakPtrs();
54  void OnBeforeMdnsDestroy();
55  void DestroyMdns();
56
57  ObserverList<Proxy, true> 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  base::WeakPtrFactory<ServiceDiscoveryClientMdns> weak_ptr_factory_;
75
76  DISALLOW_COPY_AND_ASSIGN(ServiceDiscoveryClientMdns);
77};
78
79}  // namespace local_discovery
80
81#endif  // CHROME_BROWSER_LOCAL_DISCOVERY_SERVICE_DISCOVERY_CLIENT_MDNS_H_
82