OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 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_host_client.h" | 5 #include "chrome/browser/local_discovery/service_discovery_host_client.h" |
6 | 6 |
7 #if defined(OS_POSIX) | 7 #if defined(OS_POSIX) |
8 #include "base/file_descriptor_posix.h" | 8 #include "base/file_descriptor_posix.h" |
9 #endif // OS_POSIX | 9 #endif // OS_POSIX |
10 | 10 |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
185 uint64 ServiceDiscoveryHostClient::RegisterLocalDomainResolverCallback( | 185 uint64 ServiceDiscoveryHostClient::RegisterLocalDomainResolverCallback( |
186 const LocalDomainResolver::IPAddressCallback& callback) { | 186 const LocalDomainResolver::IPAddressCallback& callback) { |
187 DCHECK(CalledOnValidThread()); | 187 DCHECK(CalledOnValidThread()); |
188 DCHECK(!ContainsKey(domain_resolver_callbacks_, current_id_ + 1)); | 188 DCHECK(!ContainsKey(domain_resolver_callbacks_, current_id_ + 1)); |
189 domain_resolver_callbacks_[++current_id_] = callback; | 189 domain_resolver_callbacks_[++current_id_] = callback; |
190 return current_id_; | 190 return current_id_; |
191 } | 191 } |
192 | 192 |
193 void ServiceDiscoveryHostClient::UnregisterWatcherCallback(uint64 id) { | 193 void ServiceDiscoveryHostClient::UnregisterWatcherCallback(uint64 id) { |
194 DCHECK(CalledOnValidThread()); | 194 DCHECK(CalledOnValidThread()); |
195 DCHECK(ContainsKey(service_watcher_callbacks_, id)); | |
196 service_watcher_callbacks_.erase(id); | 195 service_watcher_callbacks_.erase(id); |
197 } | 196 } |
198 | 197 |
199 void ServiceDiscoveryHostClient::UnregisterResolverCallback(uint64 id) { | 198 void ServiceDiscoveryHostClient::UnregisterResolverCallback(uint64 id) { |
200 DCHECK(CalledOnValidThread()); | 199 DCHECK(CalledOnValidThread()); |
201 DCHECK(ContainsKey(service_resolver_callbacks_, id)); | |
202 service_resolver_callbacks_.erase(id); | 200 service_resolver_callbacks_.erase(id); |
203 } | 201 } |
204 | 202 |
205 void ServiceDiscoveryHostClient::UnregisterLocalDomainResolverCallback( | 203 void ServiceDiscoveryHostClient::UnregisterLocalDomainResolverCallback( |
206 uint64 id) { | 204 uint64 id) { |
207 DCHECK(CalledOnValidThread()); | 205 DCHECK(CalledOnValidThread()); |
208 DCHECK(ContainsKey(domain_resolver_callbacks_, id)); | |
209 domain_resolver_callbacks_.erase(id); | 206 domain_resolver_callbacks_.erase(id); |
210 } | 207 } |
211 | 208 |
212 void ServiceDiscoveryHostClient::Start() { | 209 void ServiceDiscoveryHostClient::Start() { |
213 DCHECK(CalledOnValidThread()); | 210 DCHECK(CalledOnValidThread()); |
211 net::NetworkChangeNotifier::AddIPAddressObserver(this); | |
214 BrowserThread::PostTask( | 212 BrowserThread::PostTask( |
215 BrowserThread::IO, | 213 BrowserThread::IO, |
216 FROM_HERE, | 214 FROM_HERE, |
217 base::Bind(&ServiceDiscoveryHostClient::StartOnIOThread, this)); | 215 base::Bind(&ServiceDiscoveryHostClient::StartOnIOThread, this)); |
218 } | 216 } |
219 | 217 |
220 void ServiceDiscoveryHostClient::Shutdown() { | 218 void ServiceDiscoveryHostClient::Shutdown() { |
219 net::NetworkChangeNotifier::RemoveIPAddressObserver(this); | |
221 DCHECK(CalledOnValidThread()); | 220 DCHECK(CalledOnValidThread()); |
222 BrowserThread::PostTask( | 221 BrowserThread::PostTask( |
223 BrowserThread::IO, | 222 BrowserThread::IO, |
224 FROM_HERE, | 223 FROM_HERE, |
225 base::Bind(&ServiceDiscoveryHostClient::ShutdownOnIOThread, this)); | 224 base::Bind(&ServiceDiscoveryHostClient::ShutdownOnIOThread, this)); |
226 } | 225 } |
227 | 226 |
228 void ServiceDiscoveryHostClient::StartOnIOThread() { | 227 void ServiceDiscoveryHostClient::StartOnIOThread() { |
229 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 228 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
230 utility_host_ = UtilityProcessHost::Create( | 229 utility_host_ = UtilityProcessHost::Create( |
(...skipping 21 matching lines...) Expand all Loading... | |
252 } | 251 } |
253 | 252 |
254 void ServiceDiscoveryHostClient::ShutdownOnIOThread() { | 253 void ServiceDiscoveryHostClient::ShutdownOnIOThread() { |
255 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 254 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
256 if (utility_host_) { | 255 if (utility_host_) { |
257 utility_host_->Send(new LocalDiscoveryMsg_ShutdownLocalDiscovery); | 256 utility_host_->Send(new LocalDiscoveryMsg_ShutdownLocalDiscovery); |
258 utility_host_->EndBatchMode(); | 257 utility_host_->EndBatchMode(); |
259 } | 258 } |
260 } | 259 } |
261 | 260 |
261 void ServiceDiscoveryHostClient::RestartOnIOThread() { | |
262 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | |
263 | |
264 ShutdownOnIOThread(); | |
265 StartOnIOThread(); | |
266 } | |
267 | |
262 void ServiceDiscoveryHostClient::Send(IPC::Message* msg) { | 268 void ServiceDiscoveryHostClient::Send(IPC::Message* msg) { |
263 DCHECK(CalledOnValidThread()); | 269 DCHECK(CalledOnValidThread()); |
264 BrowserThread::PostTask( | 270 BrowserThread::PostTask( |
265 BrowserThread::IO, | 271 BrowserThread::IO, |
266 FROM_HERE, | 272 FROM_HERE, |
267 base::Bind(&ServiceDiscoveryHostClient::SendOnIOThread, this, msg)); | 273 base::Bind(&ServiceDiscoveryHostClient::SendOnIOThread, this, msg)); |
268 } | 274 } |
269 | 275 |
270 void ServiceDiscoveryHostClient::SendOnIOThread(IPC::Message* msg) { | 276 void ServiceDiscoveryHostClient::SendOnIOThread(IPC::Message* msg) { |
271 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 277 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
272 if (utility_host_) | 278 if (utility_host_) |
273 utility_host_->Send(msg); | 279 utility_host_->Send(msg); |
274 } | 280 } |
275 | 281 |
282 void ServiceDiscoveryHostClient::OnIPAddressChanged() { | |
283 BrowserThread::PostTask( | |
284 BrowserThread::IO, | |
285 FROM_HERE, | |
286 base::Bind(&ServiceDiscoveryHostClient::RestartOnIOThread, this)); | |
287 | |
288 WatcherCallbacks service_watcher_callbacks; | |
289 service_watcher_callbacks_.swap(service_watcher_callbacks); | |
290 | |
291 for (WatcherCallbacks::iterator i = service_watcher_callbacks.begin(); | |
292 i != service_watcher_callbacks.end();) { | |
Vitaly Buka (NO REVIEWS)
2013/09/07 00:27:51
I see no reason to have i++; not in the for statem
Noam Samuel
2013/09/07 01:34:30
Done.
| |
293 ServiceWatcher::UpdatedCallback callback = i->second; | |
294 // i must be advanced before the callback is called in case the callback | |
295 // destroys the watcher proxy. | |
296 i++; | |
297 if (!callback.is_null()) { | |
298 callback.Run(ServiceWatcher::UPDATE_INVALIDATED, ""); | |
299 } | |
300 } | |
301 } | |
302 | |
276 bool ServiceDiscoveryHostClient::OnMessageReceived( | 303 bool ServiceDiscoveryHostClient::OnMessageReceived( |
277 const IPC::Message& message) { | 304 const IPC::Message& message) { |
278 bool handled = true; | 305 bool handled = true; |
279 IPC_BEGIN_MESSAGE_MAP(ServiceDiscoveryHostClient, message) | 306 IPC_BEGIN_MESSAGE_MAP(ServiceDiscoveryHostClient, message) |
280 IPC_MESSAGE_HANDLER(LocalDiscoveryHostMsg_WatcherCallback, | 307 IPC_MESSAGE_HANDLER(LocalDiscoveryHostMsg_WatcherCallback, |
281 OnWatcherCallback) | 308 OnWatcherCallback) |
282 IPC_MESSAGE_HANDLER(LocalDiscoveryHostMsg_ResolverCallback, | 309 IPC_MESSAGE_HANDLER(LocalDiscoveryHostMsg_ResolverCallback, |
283 OnResolverCallback) | 310 OnResolverCallback) |
284 IPC_MESSAGE_HANDLER(LocalDiscoveryHostMsg_LocalDomainResolverCallback, | 311 IPC_MESSAGE_HANDLER(LocalDiscoveryHostMsg_LocalDomainResolverCallback, |
285 OnLocalDomainResolverCallback) | 312 OnLocalDomainResolverCallback) |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
391 void ServiceDiscoveryHostClientFactory::ReleaseClientInternal() { | 418 void ServiceDiscoveryHostClientFactory::ReleaseClientInternal() { |
392 DCHECK(CalledOnValidThread()); | 419 DCHECK(CalledOnValidThread()); |
393 references_--; | 420 references_--; |
394 if (references_ == 0) { | 421 if (references_ == 0) { |
395 instance_->Shutdown(); | 422 instance_->Shutdown(); |
396 instance_ = NULL; | 423 instance_ = NULL; |
397 } | 424 } |
398 } | 425 } |
399 | 426 |
400 } // namespace local_discovery | 427 } // namespace local_discovery |
OLD | NEW |