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