OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "net/base/network_change_notifier.h" | 5 #include "net/base/network_change_notifier.h" |
6 #include "net/base/network_change_notifier_factory.h" | 6 #include "net/base/network_change_notifier_factory.h" |
7 #include "build/build_config.h" | 7 #include "build/build_config.h" |
8 #if defined(OS_WIN) | 8 #if defined(OS_WIN) |
9 #include "net/base/network_change_notifier_win.h" | 9 #include "net/base/network_change_notifier_win.h" |
10 #elif defined(OS_LINUX) && !defined(OS_CHROMEOS) | 10 #elif defined(OS_LINUX) && !defined(OS_CHROMEOS) |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 #endif | 74 #endif |
75 } | 75 } |
76 | 76 |
77 // static | 77 // static |
78 bool NetworkChangeNotifier::IsOffline() { | 78 bool NetworkChangeNotifier::IsOffline() { |
79 return g_network_change_notifier && | 79 return g_network_change_notifier && |
80 g_network_change_notifier->IsCurrentlyOffline(); | 80 g_network_change_notifier->IsCurrentlyOffline(); |
81 } | 81 } |
82 | 82 |
83 // static | 83 // static |
| 84 bool NetworkChangeNotifier::IsWatchingDNS() { |
| 85 if (!g_network_change_notifier) |
| 86 return false; |
| 87 base::AutoLock(g_network_change_notifier->watching_dns_lock_); |
| 88 return g_network_change_notifier->watching_dns_; |
| 89 } |
| 90 |
| 91 // static |
84 NetworkChangeNotifier* NetworkChangeNotifier::CreateMock() { | 92 NetworkChangeNotifier* NetworkChangeNotifier::CreateMock() { |
85 return new MockNetworkChangeNotifier(); | 93 return new MockNetworkChangeNotifier(); |
86 } | 94 } |
87 | 95 |
88 void NetworkChangeNotifier::AddIPAddressObserver(IPAddressObserver* observer) { | 96 void NetworkChangeNotifier::AddIPAddressObserver(IPAddressObserver* observer) { |
89 if (g_network_change_notifier) | 97 if (g_network_change_notifier) |
90 g_network_change_notifier->ip_address_observer_list_->AddObserver(observer); | 98 g_network_change_notifier->ip_address_observer_list_->AddObserver(observer); |
91 } | 99 } |
92 | 100 |
93 void NetworkChangeNotifier::AddOnlineStateObserver( | 101 void NetworkChangeNotifier::AddOnlineStateObserver( |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 | 138 |
131 NetworkChangeNotifier::NetworkChangeNotifier() | 139 NetworkChangeNotifier::NetworkChangeNotifier() |
132 : ip_address_observer_list_( | 140 : ip_address_observer_list_( |
133 new ObserverListThreadSafe<IPAddressObserver>( | 141 new ObserverListThreadSafe<IPAddressObserver>( |
134 ObserverListBase<IPAddressObserver>::NOTIFY_EXISTING_ONLY)), | 142 ObserverListBase<IPAddressObserver>::NOTIFY_EXISTING_ONLY)), |
135 online_state_observer_list_( | 143 online_state_observer_list_( |
136 new ObserverListThreadSafe<OnlineStateObserver>( | 144 new ObserverListThreadSafe<OnlineStateObserver>( |
137 ObserverListBase<OnlineStateObserver>::NOTIFY_EXISTING_ONLY)), | 145 ObserverListBase<OnlineStateObserver>::NOTIFY_EXISTING_ONLY)), |
138 resolver_state_observer_list_( | 146 resolver_state_observer_list_( |
139 new ObserverListThreadSafe<DNSObserver>( | 147 new ObserverListThreadSafe<DNSObserver>( |
140 ObserverListBase<DNSObserver>::NOTIFY_EXISTING_ONLY)) { | 148 ObserverListBase<DNSObserver>::NOTIFY_EXISTING_ONLY)), |
| 149 watching_dns_(false) { |
141 DCHECK(!g_network_change_notifier); | 150 DCHECK(!g_network_change_notifier); |
142 g_network_change_notifier = this; | 151 g_network_change_notifier = this; |
143 } | 152 } |
144 | 153 |
| 154 // static |
145 void NetworkChangeNotifier::NotifyObserversOfIPAddressChange() { | 155 void NetworkChangeNotifier::NotifyObserversOfIPAddressChange() { |
146 if (g_network_change_notifier) { | 156 if (g_network_change_notifier) { |
147 g_network_change_notifier->ip_address_observer_list_->Notify( | 157 g_network_change_notifier->ip_address_observer_list_->Notify( |
148 &IPAddressObserver::OnIPAddressChanged); | 158 &IPAddressObserver::OnIPAddressChanged); |
149 } | 159 } |
150 } | 160 } |
151 | 161 |
| 162 // static |
152 void NetworkChangeNotifier::NotifyObserversOfDNSChange(unsigned detail) { | 163 void NetworkChangeNotifier::NotifyObserversOfDNSChange(unsigned detail) { |
153 if (g_network_change_notifier) { | 164 if (g_network_change_notifier) { |
| 165 { |
| 166 base::AutoLock(g_network_change_notifier->watching_dns_lock_); |
| 167 if (detail & NetworkChangeNotifier::CHANGE_DNS_WATCH_STARTED) { |
| 168 g_network_change_notifier->watching_dns_ = true; |
| 169 } else if (detail & NetworkChangeNotifier::CHANGE_DNS_WATCH_FAILED) { |
| 170 g_network_change_notifier->watching_dns_ = false; |
| 171 } |
| 172 // Include detail that watch is off to spare the call to IsWatchingDNS. |
| 173 if (!g_network_change_notifier->watching_dns_) |
| 174 detail |= NetworkChangeNotifier::CHANGE_DNS_WATCH_FAILED; |
| 175 } |
| 176 DCHECK(!(detail & NetworkChangeNotifier::CHANGE_DNS_WATCH_FAILED) || |
| 177 !(detail & NetworkChangeNotifier::CHANGE_DNS_WATCH_STARTED)); |
154 g_network_change_notifier->resolver_state_observer_list_->Notify( | 178 g_network_change_notifier->resolver_state_observer_list_->Notify( |
155 &DNSObserver::OnDNSChanged, detail); | 179 &DNSObserver::OnDNSChanged, detail); |
156 } | 180 } |
157 } | 181 } |
158 | 182 |
| 183 // static |
159 void NetworkChangeNotifier::NotifyObserversOfOnlineStateChange() { | 184 void NetworkChangeNotifier::NotifyObserversOfOnlineStateChange() { |
160 if (g_network_change_notifier) { | 185 if (g_network_change_notifier) { |
161 g_network_change_notifier->online_state_observer_list_->Notify( | 186 g_network_change_notifier->online_state_observer_list_->Notify( |
162 &OnlineStateObserver::OnOnlineStateChanged, !IsOffline()); | 187 &OnlineStateObserver::OnOnlineStateChanged, !IsOffline()); |
163 } | 188 } |
164 } | 189 } |
165 | 190 |
166 NetworkChangeNotifier::DisableForTest::DisableForTest() | 191 NetworkChangeNotifier::DisableForTest::DisableForTest() |
167 : network_change_notifier_(g_network_change_notifier) { | 192 : network_change_notifier_(g_network_change_notifier) { |
168 DCHECK(g_network_change_notifier); | 193 DCHECK(g_network_change_notifier); |
169 g_network_change_notifier = NULL; | 194 g_network_change_notifier = NULL; |
170 } | 195 } |
171 | 196 |
172 NetworkChangeNotifier::DisableForTest::~DisableForTest() { | 197 NetworkChangeNotifier::DisableForTest::~DisableForTest() { |
173 DCHECK(!g_network_change_notifier); | 198 DCHECK(!g_network_change_notifier); |
174 g_network_change_notifier = network_change_notifier_; | 199 g_network_change_notifier = network_change_notifier_; |
175 } | 200 } |
176 | 201 |
177 } // namespace net | 202 } // namespace net |
OLD | NEW |