- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / local_discovery / service_discovery_client_mdns.cc
1 // Copyright 2013 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 #include "chrome/browser/local_discovery/service_discovery_client_mdns.h"
6
7 #include "base/metrics/histogram.h"
8 #include "chrome/browser/local_discovery/service_discovery_host_client.h"
9 #include "content/public/browser/browser_thread.h"
10
11 namespace local_discovery {
12
13 using content::BrowserThread;
14
15 namespace {
16 const int kMaxRestartAttempts = 10;
17 const int kRestartDelayOnNetworkChangeSeconds = 3;
18 const int kReportSuccessAfterSeconds = 10;
19 }
20
21 scoped_ptr<ServiceWatcher> ServiceDiscoveryClientMdns::CreateServiceWatcher(
22     const std::string& service_type,
23     const ServiceWatcher::UpdatedCallback& callback) {
24   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
25   return host_client_->CreateServiceWatcher(service_type, callback);
26 }
27
28 scoped_ptr<ServiceResolver> ServiceDiscoveryClientMdns::CreateServiceResolver(
29     const std::string& service_name,
30     const ServiceResolver::ResolveCompleteCallback& callback) {
31   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
32   return host_client_->CreateServiceResolver(service_name, callback);
33 }
34
35 scoped_ptr<LocalDomainResolver>
36 ServiceDiscoveryClientMdns::CreateLocalDomainResolver(
37     const std::string& domain,
38     net::AddressFamily address_family,
39     const LocalDomainResolver::IPAddressCallback& callback) {
40   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
41   return host_client_->CreateLocalDomainResolver(domain, address_family,
42                                                  callback);
43 }
44
45 ServiceDiscoveryClientMdns::ServiceDiscoveryClientMdns()
46     : restart_attempts_(kMaxRestartAttempts),
47       weak_ptr_factory_(this) {
48   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
49   net::NetworkChangeNotifier::AddNetworkChangeObserver(this);
50   StartNewClient();
51 }
52
53 ServiceDiscoveryClientMdns::~ServiceDiscoveryClientMdns() {
54   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
55   net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this);
56   host_client_->Shutdown();
57 }
58
59 void ServiceDiscoveryClientMdns::OnNetworkChanged(
60     net::NetworkChangeNotifier::ConnectionType type) {
61   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
62   // Only network changes resets kMaxRestartAttempts.
63   restart_attempts_ = kMaxRestartAttempts;
64   ScheduleStartNewClient();
65 }
66
67 void ServiceDiscoveryClientMdns::ScheduleStartNewClient() {
68   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
69   host_client_->Shutdown();
70   weak_ptr_factory_.InvalidateWeakPtrs();
71   base::MessageLoop::current()->PostDelayedTask(
72       FROM_HERE,
73       base::Bind(&ServiceDiscoveryClientMdns::StartNewClient,
74                  weak_ptr_factory_.GetWeakPtr()),
75       base::TimeDelta::FromSeconds(kRestartDelayOnNetworkChangeSeconds));
76 }
77
78 void ServiceDiscoveryClientMdns::StartNewClient() {
79   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
80   scoped_refptr<ServiceDiscoveryHostClient> old_client = host_client_;
81   if ((restart_attempts_--) > 0) {
82     host_client_ = new ServiceDiscoveryHostClient();
83     host_client_->Start(
84         base::Bind(&ServiceDiscoveryClientMdns::ScheduleStartNewClient,
85                    weak_ptr_factory_.GetWeakPtr()));
86
87     base::MessageLoop::current()->PostDelayedTask(
88         FROM_HERE,
89         base::Bind(&ServiceDiscoveryClientMdns::ReportSuccess,
90                    weak_ptr_factory_.GetWeakPtr()),
91         base::TimeDelta::FromSeconds(kReportSuccessAfterSeconds));
92   } else {
93     restart_attempts_ = -1;
94     ReportSuccess();
95   }
96   // Run when host_client_ is created. Callbacks created by InvalidateWatchers
97   // may create new watchers.
98   if (old_client)
99     old_client->InvalidateWatchers();
100 }
101
102 void ServiceDiscoveryClientMdns::ReportSuccess() {
103   UMA_HISTOGRAM_COUNTS_100("LocalDiscovery.ClientRestartAttempts",
104                            kMaxRestartAttempts - restart_attempts_);
105 }
106
107 }  // namespace local_discovery