1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "content/browser/geolocation/wifi_data_provider_manager.h" 6 7#include "content/browser/geolocation/wifi_data_provider.h" 8 9namespace content { 10 11// static 12WifiDataProviderManager* WifiDataProviderManager::instance_ = NULL; 13 14// static 15WifiDataProviderManager::ImplFactoryFunction 16 WifiDataProviderManager::factory_function_ = DefaultFactoryFunction; 17 18// static 19void WifiDataProviderManager::SetFactoryForTesting( 20 ImplFactoryFunction factory_function_in) { 21 factory_function_ = factory_function_in; 22} 23 24// static 25void WifiDataProviderManager::ResetFactoryForTesting() { 26 factory_function_ = DefaultFactoryFunction; 27} 28 29// static 30WifiDataProviderManager* WifiDataProviderManager::Register( 31 WifiDataUpdateCallback* callback) { 32 bool need_to_start_data_provider = false; 33 if (!instance_) { 34 instance_ = new WifiDataProviderManager(); 35 need_to_start_data_provider = true; 36 } 37 DCHECK(instance_); 38 instance_->AddCallback(callback); 39 // Start the provider after adding the callback, to avoid any race in 40 // it running early. 41 if (need_to_start_data_provider) 42 instance_->StartDataProvider(); 43 return instance_; 44} 45 46// static 47bool WifiDataProviderManager::Unregister(WifiDataUpdateCallback* callback) { 48 DCHECK(instance_); 49 DCHECK(instance_->has_callbacks()); 50 if (!instance_->RemoveCallback(callback)) { 51 return false; 52 } 53 if (!instance_->has_callbacks()) { 54 // Must stop the data provider (and any implementation threads) before 55 // destroying to avoid any race conditions in access to the provider in 56 // the destructor chain. 57 instance_->StopDataProvider(); 58 delete instance_; 59 instance_ = NULL; 60 } 61 return true; 62} 63 64WifiDataProviderManager::WifiDataProviderManager() { 65 DCHECK(factory_function_); 66 impl_ = (*factory_function_)(); 67 DCHECK(impl_.get()); 68} 69 70WifiDataProviderManager::~WifiDataProviderManager() { 71 DCHECK(impl_.get()); 72} 73 74bool WifiDataProviderManager::GetData(WifiData* data) { 75 return impl_->GetData(data); 76} 77 78void WifiDataProviderManager::AddCallback(WifiDataUpdateCallback* callback) { 79 impl_->AddCallback(callback); 80} 81 82bool WifiDataProviderManager::RemoveCallback(WifiDataUpdateCallback* callback) { 83 return impl_->RemoveCallback(callback); 84} 85 86bool WifiDataProviderManager::has_callbacks() const { 87 return impl_->has_callbacks(); 88} 89 90void WifiDataProviderManager::StartDataProvider() { 91 impl_->StartDataProvider(); 92} 93 94void WifiDataProviderManager::StopDataProvider() { 95 impl_->StopDataProvider(); 96} 97 98} // namespace content 99