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