| 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/media/router/discovery/mdns/dns_sd_registry.h" | 5 #include "chrome/browser/media/router/discovery/mdns/dns_sd_registry.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
| 10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 108 DnsSdRegistry::DnsSdRegistry() { | 108 DnsSdRegistry::DnsSdRegistry() { |
| 109 #if BUILDFLAG(ENABLE_SERVICE_DISCOVERY) | 109 #if BUILDFLAG(ENABLE_SERVICE_DISCOVERY) |
| 110 service_discovery_client_ = ServiceDiscoverySharedClient::GetInstance(); | 110 service_discovery_client_ = ServiceDiscoverySharedClient::GetInstance(); |
| 111 #endif | 111 #endif |
| 112 } | 112 } |
| 113 | 113 |
| 114 DnsSdRegistry::DnsSdRegistry(ServiceDiscoverySharedClient* client) { | 114 DnsSdRegistry::DnsSdRegistry(ServiceDiscoverySharedClient* client) { |
| 115 service_discovery_client_ = client; | 115 service_discovery_client_ = client; |
| 116 } | 116 } |
| 117 | 117 |
| 118 DnsSdRegistry::~DnsSdRegistry() {} | 118 DnsSdRegistry::~DnsSdRegistry() { |
| 119 DCHECK(thread_checker_.CalledOnValidThread()); |
| 120 } |
| 121 |
| 122 // static |
| 123 DnsSdRegistry* DnsSdRegistry::GetInstance() { |
| 124 return base::Singleton<DnsSdRegistry, |
| 125 base::LeakySingletonTraits<DnsSdRegistry>>::get(); |
| 126 } |
| 119 | 127 |
| 120 void DnsSdRegistry::AddObserver(DnsSdObserver* observer) { | 128 void DnsSdRegistry::AddObserver(DnsSdObserver* observer) { |
| 129 DCHECK(thread_checker_.CalledOnValidThread()); |
| 121 observers_.AddObserver(observer); | 130 observers_.AddObserver(observer); |
| 122 } | 131 } |
| 123 | 132 |
| 124 void DnsSdRegistry::RemoveObserver(DnsSdObserver* observer) { | 133 void DnsSdRegistry::RemoveObserver(DnsSdObserver* observer) { |
| 134 DCHECK(thread_checker_.CalledOnValidThread()); |
| 125 observers_.RemoveObserver(observer); | 135 observers_.RemoveObserver(observer); |
| 126 } | 136 } |
| 127 | 137 |
| 128 DnsSdDeviceLister* DnsSdRegistry::CreateDnsSdDeviceLister( | 138 DnsSdDeviceLister* DnsSdRegistry::CreateDnsSdDeviceLister( |
| 129 DnsSdDelegate* delegate, | 139 DnsSdDelegate* delegate, |
| 130 const std::string& service_type, | 140 const std::string& service_type, |
| 131 local_discovery::ServiceDiscoverySharedClient* discovery_client) { | 141 local_discovery::ServiceDiscoverySharedClient* discovery_client) { |
| 132 return new DnsSdDeviceLister(discovery_client, delegate, service_type); | 142 return new DnsSdDeviceLister(discovery_client, delegate, service_type); |
| 133 } | 143 } |
| 134 | 144 |
| 135 void DnsSdRegistry::Publish(const std::string& service_type) { | 145 void DnsSdRegistry::Publish(const std::string& service_type) { |
| 146 DCHECK(thread_checker_.CalledOnValidThread()); |
| 136 DispatchApiEvent(service_type); | 147 DispatchApiEvent(service_type); |
| 137 } | 148 } |
| 138 | 149 |
| 139 void DnsSdRegistry::ForceDiscovery() { | 150 void DnsSdRegistry::ForceDiscovery() { |
| 151 DCHECK(thread_checker_.CalledOnValidThread()); |
| 140 for (const auto& next_service : service_data_map_) { | 152 for (const auto& next_service : service_data_map_) { |
| 141 next_service.second->ForceDiscovery(); | 153 next_service.second->ForceDiscovery(); |
| 142 } | 154 } |
| 143 } | 155 } |
| 144 | 156 |
| 145 void DnsSdRegistry::RegisterDnsSdListener(const std::string& service_type) { | 157 void DnsSdRegistry::RegisterDnsSdListener(const std::string& service_type) { |
| 158 DCHECK(thread_checker_.CalledOnValidThread()); |
| 146 VLOG(1) << "RegisterDnsSdListener: " << service_type | 159 VLOG(1) << "RegisterDnsSdListener: " << service_type |
| 147 << ", registered: " << IsRegistered(service_type); | 160 << ", registered: " << IsRegistered(service_type); |
| 148 if (service_type.empty()) | 161 if (service_type.empty()) |
| 149 return; | 162 return; |
| 150 | 163 |
| 151 if (IsRegistered(service_type)) { | 164 if (IsRegistered(service_type)) { |
| 152 service_data_map_[service_type]->ListenerAdded(); | 165 service_data_map_[service_type]->ListenerAdded(); |
| 153 DispatchApiEvent(service_type); | 166 DispatchApiEvent(service_type); |
| 154 return; | 167 return; |
| 155 } | 168 } |
| 156 | 169 |
| 157 std::unique_ptr<DnsSdDeviceLister> dns_sd_device_lister( | 170 std::unique_ptr<DnsSdDeviceLister> dns_sd_device_lister( |
| 158 CreateDnsSdDeviceLister(this, service_type, | 171 CreateDnsSdDeviceLister(this, service_type, |
| 159 service_discovery_client_.get())); | 172 service_discovery_client_.get())); |
| 160 dns_sd_device_lister->Discover(false); | 173 dns_sd_device_lister->Discover(false); |
| 161 service_data_map_[service_type] = | 174 service_data_map_[service_type] = |
| 162 base::MakeUnique<ServiceTypeData>(std::move(dns_sd_device_lister)); | 175 base::MakeUnique<ServiceTypeData>(std::move(dns_sd_device_lister)); |
| 163 DispatchApiEvent(service_type); | 176 DispatchApiEvent(service_type); |
| 164 } | 177 } |
| 165 | 178 |
| 166 void DnsSdRegistry::UnregisterDnsSdListener(const std::string& service_type) { | 179 void DnsSdRegistry::UnregisterDnsSdListener(const std::string& service_type) { |
| 180 DCHECK(thread_checker_.CalledOnValidThread()); |
| 167 VLOG(1) << "UnregisterDnsSdListener: " << service_type; | 181 VLOG(1) << "UnregisterDnsSdListener: " << service_type; |
| 168 auto it = service_data_map_.find(service_type); | 182 auto it = service_data_map_.find(service_type); |
| 169 if (it == service_data_map_.end()) | 183 if (it == service_data_map_.end()) |
| 170 return; | 184 return; |
| 171 | 185 |
| 172 if (service_data_map_[service_type]->ListenerRemoved()) | 186 if (service_data_map_[service_type]->ListenerRemoved()) |
| 173 service_data_map_.erase(it); | 187 service_data_map_.erase(it); |
| 174 } | 188 } |
| 175 | 189 |
| 176 void DnsSdRegistry::ServiceChanged(const std::string& service_type, | 190 void DnsSdRegistry::ServiceChanged(const std::string& service_type, |
| 177 bool added, | 191 bool added, |
| 178 const DnsSdService& service) { | 192 const DnsSdService& service) { |
| 193 DCHECK(thread_checker_.CalledOnValidThread()); |
| 179 VLOG(1) << "ServiceChanged: service_type: " << service_type | 194 VLOG(1) << "ServiceChanged: service_type: " << service_type |
| 180 << ", known: " << IsRegistered(service_type) | 195 << ", known: " << IsRegistered(service_type) |
| 181 << ", service: " << service.service_name << ", added: " << added; | 196 << ", service: " << service.service_name << ", added: " << added; |
| 182 if (!IsRegistered(service_type)) { | 197 if (!IsRegistered(service_type)) { |
| 183 return; | 198 return; |
| 184 } | 199 } |
| 185 | 200 |
| 186 bool is_updated = | 201 bool is_updated = |
| 187 service_data_map_[service_type]->UpdateService(added, service); | 202 service_data_map_[service_type]->UpdateService(added, service); |
| 188 VLOG(1) << "ServiceChanged: is_updated: " << is_updated; | 203 VLOG(1) << "ServiceChanged: is_updated: " << is_updated; |
| 189 | 204 |
| 190 if (is_updated) { | 205 if (is_updated) { |
| 191 DispatchApiEvent(service_type); | 206 DispatchApiEvent(service_type); |
| 192 } | 207 } |
| 193 } | 208 } |
| 194 | 209 |
| 195 void DnsSdRegistry::ServiceRemoved(const std::string& service_type, | 210 void DnsSdRegistry::ServiceRemoved(const std::string& service_type, |
| 196 const std::string& service_name) { | 211 const std::string& service_name) { |
| 212 DCHECK(thread_checker_.CalledOnValidThread()); |
| 197 VLOG(1) << "ServiceRemoved: service_type: " << service_type | 213 VLOG(1) << "ServiceRemoved: service_type: " << service_type |
| 198 << ", known: " << IsRegistered(service_type) | 214 << ", known: " << IsRegistered(service_type) |
| 199 << ", service: " << service_name; | 215 << ", service: " << service_name; |
| 200 if (!IsRegistered(service_type)) { | 216 if (!IsRegistered(service_type)) { |
| 201 return; | 217 return; |
| 202 } | 218 } |
| 203 | 219 |
| 204 bool is_removed = | 220 bool is_removed = |
| 205 service_data_map_[service_type]->RemoveService(service_name); | 221 service_data_map_[service_type]->RemoveService(service_name); |
| 206 VLOG(1) << "ServiceRemoved: is_removed: " << is_removed; | 222 VLOG(1) << "ServiceRemoved: is_removed: " << is_removed; |
| 207 | 223 |
| 208 if (is_removed) | 224 if (is_removed) |
| 209 DispatchApiEvent(service_type); | 225 DispatchApiEvent(service_type); |
| 210 } | 226 } |
| 211 | 227 |
| 212 void DnsSdRegistry::ServicesFlushed(const std::string& service_type) { | 228 void DnsSdRegistry::ServicesFlushed(const std::string& service_type) { |
| 229 DCHECK(thread_checker_.CalledOnValidThread()); |
| 213 VLOG(1) << "ServicesFlushed: service_type: " << service_type | 230 VLOG(1) << "ServicesFlushed: service_type: " << service_type |
| 214 << ", known: " << IsRegistered(service_type); | 231 << ", known: " << IsRegistered(service_type); |
| 215 if (!IsRegistered(service_type)) { | 232 if (!IsRegistered(service_type)) { |
| 216 return; | 233 return; |
| 217 } | 234 } |
| 218 | 235 |
| 219 bool is_cleared = service_data_map_[service_type]->ClearServices(); | 236 bool is_cleared = service_data_map_[service_type]->ClearServices(); |
| 220 VLOG(1) << "ServicesFlushed: is_cleared: " << is_cleared; | 237 VLOG(1) << "ServicesFlushed: is_cleared: " << is_cleared; |
| 221 | 238 |
| 222 if (is_cleared) | 239 if (is_cleared) |
| 223 DispatchApiEvent(service_type); | 240 DispatchApiEvent(service_type); |
| 224 } | 241 } |
| 225 | 242 |
| 226 void DnsSdRegistry::DispatchApiEvent(const std::string& service_type) { | 243 void DnsSdRegistry::DispatchApiEvent(const std::string& service_type) { |
| 244 DCHECK(thread_checker_.CalledOnValidThread()); |
| 227 VLOG(1) << "DispatchApiEvent: service_type: " << service_type; | 245 VLOG(1) << "DispatchApiEvent: service_type: " << service_type; |
| 228 for (auto& observer : observers_) { | 246 for (auto& observer : observers_) { |
| 229 observer.OnDnsSdEvent(service_type, | 247 observer.OnDnsSdEvent(service_type, |
| 230 service_data_map_[service_type]->GetServiceList()); | 248 service_data_map_[service_type]->GetServiceList()); |
| 231 } | 249 } |
| 232 } | 250 } |
| 233 | 251 |
| 234 bool DnsSdRegistry::IsRegistered(const std::string& service_type) { | 252 bool DnsSdRegistry::IsRegistered(const std::string& service_type) { |
| 253 DCHECK(thread_checker_.CalledOnValidThread()); |
| 235 return service_data_map_.find(service_type) != service_data_map_.end(); | 254 return service_data_map_.find(service_type) != service_data_map_.end(); |
| 236 } | 255 } |
| 237 | 256 |
| 238 } // namespace media_router | 257 } // namespace media_router |
| OLD | NEW |