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