Chromium Code Reviews| Index: chrome/browser/local_discovery/service_discovery_host_client.cc |
| diff --git a/chrome/browser/local_discovery/service_discovery_host_client.cc b/chrome/browser/local_discovery/service_discovery_host_client.cc |
| index 9394b404910df32a928854a93aef69630984253e..2cd85287bf81bd6aa36c5fc6c883a10d7885d933 100644 |
| --- a/chrome/browser/local_discovery/service_discovery_host_client.cc |
| +++ b/chrome/browser/local_discovery/service_discovery_host_client.cc |
| @@ -192,25 +192,23 @@ uint64 ServiceDiscoveryHostClient::RegisterLocalDomainResolverCallback( |
| void ServiceDiscoveryHostClient::UnregisterWatcherCallback(uint64 id) { |
| DCHECK(CalledOnValidThread()); |
| - DCHECK(ContainsKey(service_watcher_callbacks_, id)); |
| service_watcher_callbacks_.erase(id); |
| } |
| void ServiceDiscoveryHostClient::UnregisterResolverCallback(uint64 id) { |
| DCHECK(CalledOnValidThread()); |
| - DCHECK(ContainsKey(service_resolver_callbacks_, id)); |
| service_resolver_callbacks_.erase(id); |
| } |
| void ServiceDiscoveryHostClient::UnregisterLocalDomainResolverCallback( |
| uint64 id) { |
| DCHECK(CalledOnValidThread()); |
| - DCHECK(ContainsKey(domain_resolver_callbacks_, id)); |
| domain_resolver_callbacks_.erase(id); |
| } |
| void ServiceDiscoveryHostClient::Start() { |
| DCHECK(CalledOnValidThread()); |
| + net::NetworkChangeNotifier::AddIPAddressObserver(this); |
| BrowserThread::PostTask( |
| BrowserThread::IO, |
| FROM_HERE, |
| @@ -218,6 +216,7 @@ void ServiceDiscoveryHostClient::Start() { |
| } |
| void ServiceDiscoveryHostClient::Shutdown() { |
| + net::NetworkChangeNotifier::RemoveIPAddressObserver(this); |
| DCHECK(CalledOnValidThread()); |
| BrowserThread::PostTask( |
| BrowserThread::IO, |
| @@ -259,6 +258,13 @@ void ServiceDiscoveryHostClient::ShutdownOnIOThread() { |
| } |
| } |
| +void ServiceDiscoveryHostClient::RestartOnIOThread() { |
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + |
| + ShutdownOnIOThread(); |
| + StartOnIOThread(); |
| +} |
| + |
| void ServiceDiscoveryHostClient::Send(IPC::Message* msg) { |
| DCHECK(CalledOnValidThread()); |
| BrowserThread::PostTask( |
| @@ -273,6 +279,27 @@ void ServiceDiscoveryHostClient::SendOnIOThread(IPC::Message* msg) { |
| utility_host_->Send(msg); |
| } |
| +void ServiceDiscoveryHostClient::OnIPAddressChanged() { |
| + BrowserThread::PostTask( |
| + BrowserThread::IO, |
| + FROM_HERE, |
| + base::Bind(&ServiceDiscoveryHostClient::RestartOnIOThread, this)); |
| + |
| + WatcherCallbacks service_watcher_callbacks; |
| + service_watcher_callbacks_.swap(service_watcher_callbacks); |
| + |
| + for (WatcherCallbacks::iterator i = service_watcher_callbacks.begin(); |
| + 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.
|
| + ServiceWatcher::UpdatedCallback callback = i->second; |
| + // i must be advanced before the callback is called in case the callback |
| + // destroys the watcher proxy. |
| + i++; |
| + if (!callback.is_null()) { |
| + callback.Run(ServiceWatcher::UPDATE_INVALIDATED, ""); |
| + } |
| + } |
| +} |
| + |
| bool ServiceDiscoveryHostClient::OnMessageReceived( |
| const IPC::Message& message) { |
| bool handled = true; |