103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// found in the LICENSE file. 403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/browser/geolocation/wifi_data_provider_manager.h" 603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/browser/geolocation/wifi_data_provider.h" 803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace content { 1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// static 1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)WifiDataProviderManager* WifiDataProviderManager::instance_ = NULL; 1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// static 1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)WifiDataProviderManager::ImplFactoryFunction 1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) WifiDataProviderManager::factory_function_ = DefaultFactoryFunction; 1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// static 1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void WifiDataProviderManager::SetFactoryForTesting( 2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ImplFactoryFunction factory_function_in) { 2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) factory_function_ = factory_function_in; 2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// static 2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void WifiDataProviderManager::ResetFactoryForTesting() { 2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) factory_function_ = DefaultFactoryFunction; 2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// static 3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)WifiDataProviderManager* WifiDataProviderManager::Register( 3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) WifiDataUpdateCallback* callback) { 3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool need_to_start_data_provider = false; 3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (!instance_) { 3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) instance_ = new WifiDataProviderManager(); 3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) need_to_start_data_provider = true; 3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(instance_); 3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) instance_->AddCallback(callback); 3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Start the provider after adding the callback, to avoid any race in 4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // it running early. 4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (need_to_start_data_provider) 4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) instance_->StartDataProvider(); 4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return instance_; 4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// static 4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool WifiDataProviderManager::Unregister(WifiDataUpdateCallback* callback) { 4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(instance_); 4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(instance_->has_callbacks()); 5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (!instance_->RemoveCallback(callback)) { 5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return false; 5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (!instance_->has_callbacks()) { 5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Must stop the data provider (and any implementation threads) before 5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // destroying to avoid any race conditions in access to the provider in 5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // the destructor chain. 5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) instance_->StopDataProvider(); 5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) delete instance_; 5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) instance_ = NULL; 6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return true; 6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)WifiDataProviderManager::WifiDataProviderManager() { 6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(factory_function_); 6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) impl_ = (*factory_function_)(); 6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(impl_.get()); 6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)WifiDataProviderManager::~WifiDataProviderManager() { 7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DCHECK(impl_.get()); 7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool WifiDataProviderManager::GetData(WifiData* data) { 7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return impl_->GetData(data); 7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void WifiDataProviderManager::AddCallback(WifiDataUpdateCallback* callback) { 7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) impl_->AddCallback(callback); 8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool WifiDataProviderManager::RemoveCallback(WifiDataUpdateCallback* callback) { 8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return impl_->RemoveCallback(callback); 8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool WifiDataProviderManager::has_callbacks() const { 8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return impl_->has_callbacks(); 8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void WifiDataProviderManager::StartDataProvider() { 9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) impl_->StartDataProvider(); 9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void WifiDataProviderManager::StopDataProvider() { 9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) impl_->StopDataProvider(); 9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} // namespace content 99