forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwifi_data_provider_manager.cc
98 lines (80 loc) · 2.59 KB
/
wifi_data_provider_manager.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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 "device/geolocation/wifi_data_provider_manager.h"
#include "device/geolocation/wifi_data_provider.h"
namespace device {
// 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 device