Index: content/browser/geolocation/wifi_data_provider_manager.cc |
diff --git a/content/browser/geolocation/wifi_data_provider_manager.cc b/content/browser/geolocation/wifi_data_provider_manager.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cf53657e53a61ba13ffbac13d8307ac6e6761c82 |
--- /dev/null |
+++ b/content/browser/geolocation/wifi_data_provider_manager.cc |
@@ -0,0 +1,98 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "content/browser/geolocation/wifi_data_provider_manager.h" |
+ |
+#include "content/browser/geolocation/wifi_data_provider.h" |
+ |
+namespace content { |
+ |
+// static |
+WifiDataProviderManager* WifiDataProviderManager::instance_ = NULL; |
+ |
+// static |
+WifiDataProviderManager::ImplFactoryFunction |
+ WifiDataProviderManager::factory_function_ = DefaultFactoryFunction; |
+ |
+// static |
+void WifiDataProviderManager::SetFactoryForTesting( |
+ ImplFactoryFunction factory_function_in) { |
+ factory_function_ = factory_function_in; |
+} |
+ |
+// static |
+void WifiDataProviderManager::ResetFactoryForTesting() { |
+ factory_function_ = DefaultFactoryFunction; |
+} |
+ |
+// static |
+WifiDataProviderManager* WifiDataProviderManager::Register( |
+ WifiDataUpdateCallback* callback) { |
+ bool need_to_start_data_provider = false; |
+ if (!instance_) { |
+ instance_ = new WifiDataProviderManager(); |
+ need_to_start_data_provider = true; |
+ } |
+ DCHECK(instance_); |
+ instance_->AddCallback(callback); |
+ // Start the provider after adding the callback, to avoid any race in |
+ // it running early. |
+ if (need_to_start_data_provider) |
+ instance_->StartDataProvider(); |
+ return instance_; |
+} |
+ |
+// static |
+bool WifiDataProviderManager::Unregister(WifiDataUpdateCallback* callback) { |
+ DCHECK(instance_); |
+ DCHECK(instance_->has_callbacks()); |
+ if (!instance_->RemoveCallback(callback)) { |
+ return false; |
+ } |
+ if (!instance_->has_callbacks()) { |
+ // Must stop the data provider (and any implementation threads) before |
+ // destroying to avoid any race conditions in access to the provider in |
+ // the destructor chain. |
+ instance_->StopDataProvider(); |
+ delete instance_; |
+ instance_ = NULL; |
+ } |
+ return true; |
+} |
+ |
+WifiDataProviderManager::WifiDataProviderManager() { |
+ DCHECK(factory_function_); |
+ impl_ = (*factory_function_)(); |
+ DCHECK(impl_.get()); |
+} |
+ |
+WifiDataProviderManager::~WifiDataProviderManager() { |
+ DCHECK(impl_.get()); |
+} |
+ |
+bool WifiDataProviderManager::GetData(WifiData* data) { |
+ return impl_->GetData(data); |
+} |
+ |
+void WifiDataProviderManager::AddCallback(WifiDataUpdateCallback* callback) { |
+ impl_->AddCallback(callback); |
+} |
+ |
+bool WifiDataProviderManager::RemoveCallback(WifiDataUpdateCallback* callback) { |
+ return impl_->RemoveCallback(callback); |
+} |
+ |
+bool WifiDataProviderManager::has_callbacks() const { |
+ return impl_->has_callbacks(); |
+} |
+ |
+void WifiDataProviderManager::StartDataProvider() { |
+ impl_->StartDataProvider(); |
+} |
+ |
+void WifiDataProviderManager::StopDataProvider() { |
+ impl_->StopDataProvider(); |
+} |
+ |
+} // namespace content |