Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(89)

Side by Side Diff: chrome/browser/geolocation/wifi_data_provider_chromeos.cc

Issue 11710002: Move wifi_data_provider_chromeos.* from chrome\browser\geolocation to content\browser\geolocation b… (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: sync after r175087 moved cros_network_functions Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 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 // Provides wifi scan API binding for chromeos, using proprietary APIs.
6
7 #include "chrome/browser/geolocation/wifi_data_provider_chromeos.h"
8
9 #include "base/bind.h"
10 #include "base/utf_string_conversions.h"
11 #include "chrome/browser/chromeos/cros/cros_library.h"
12 #include "chrome/browser/chromeos/cros/network_library.h"
13 #include "content/public/browser/browser_thread.h"
14
15 using content::AccessPointData;
16 using content::BrowserThread;
17 using content::GenericPollingPolicy;
18 using content::PollingPolicyInterface;
19 using content::WifiData;
20 using content::WifiDataProvider;
21 using content::WifiDataProviderCommon;
22 using content::WifiDataProviderImplBase;
23
24 namespace {
25 // The time periods between successive polls of the wifi data.
26 const int kDefaultPollingIntervalMilliseconds = 10 * 1000; // 10s
27 const int kNoChangePollingIntervalMilliseconds = 2 * 60 * 1000; // 2 mins
28 const int kTwoNoChangePollingIntervalMilliseconds = 10 * 60 * 1000; // 10 mins
29 const int kNoWifiPollingIntervalMilliseconds = 20 * 1000; // 20s
30
31 WifiDataProviderImplBase* ChromeOSFactoryFunction() {
32 return new WifiDataProviderChromeOs();
33 }
34
35 // This global class forces code that links in this file to use that as a data
36 // provider instead of the default Linux provider.
37 class RegisterChromeOSWifiDataProvider {
38 public:
39 RegisterChromeOSWifiDataProvider() {
40 WifiDataProvider::SetFactory(ChromeOSFactoryFunction);
41 }
42 };
43
44 RegisterChromeOSWifiDataProvider g_force_chrome_os_provider;
45
46 } // namespace
47
48 namespace chromeos {
49 namespace {
50 // Wifi API binding to network_library.h, to allow reuse of the polling behavior
51 // defined in WifiDataProviderCommon.
52 class NetworkLibraryWlanApi : public WifiDataProviderCommon::WlanApiInterface {
53 public:
54 // Does not transfer ownership, |lib| must remain valid for lifetime of
55 // this object.
56 explicit NetworkLibraryWlanApi(NetworkLibrary* lib);
57 ~NetworkLibraryWlanApi();
58
59 // WifiDataProviderCommon::WlanApiInterface
60 bool GetAccessPointData(WifiData::AccessPointDataSet* data);
61
62 private:
63 NetworkLibrary* network_library_;
64
65 DISALLOW_COPY_AND_ASSIGN(NetworkLibraryWlanApi);
66 };
67
68 NetworkLibraryWlanApi::NetworkLibraryWlanApi(NetworkLibrary* lib)
69 : network_library_(lib) {
70 DCHECK(network_library_ != NULL);
71 }
72
73 NetworkLibraryWlanApi::~NetworkLibraryWlanApi() {
74 }
75
76 bool NetworkLibraryWlanApi::GetAccessPointData(
77 WifiData::AccessPointDataSet* result) {
78 WifiAccessPointVector access_points;
79 if (!network_library_->GetWifiAccessPoints(&access_points))
80 return false;
81 for (WifiAccessPointVector::const_iterator i = access_points.begin();
82 i != access_points.end(); ++i) {
83 AccessPointData ap_data;
84 ap_data.mac_address = ASCIIToUTF16(i->mac_address);
85 ap_data.radio_signal_strength = i->signal_strength;
86 ap_data.channel = i->channel;
87 ap_data.signal_to_noise = i->signal_to_noise;
88 ap_data.ssid = UTF8ToUTF16(i->name);
89 result->insert(ap_data);
90 }
91 return !result->empty() || network_library_->wifi_enabled();
92 }
93
94 } // namespace
95 } // namespace chromeos
96
97 WifiDataProviderChromeOs::WifiDataProviderChromeOs() : started_(false) {
98 }
99
100 WifiDataProviderChromeOs::~WifiDataProviderChromeOs() {
101 }
102
103 bool WifiDataProviderChromeOs::StartDataProvider() {
104 DCHECK(CalledOnClientThread());
105
106 DCHECK(polling_policy_ == NULL);
107 polling_policy_.reset(NewPollingPolicy());
108 DCHECK(polling_policy_ != NULL);
109
110 ScheduleStart();
111 return true;
112 }
113
114 void WifiDataProviderChromeOs::StopDataProvider() {
115 DCHECK(CalledOnClientThread());
116
117 polling_policy_.reset();
118 ScheduleStop();
119 }
120
121 bool WifiDataProviderChromeOs::GetData(WifiData* data) {
122 DCHECK(CalledOnClientThread());
123 DCHECK(data);
124 *data = wifi_data_;
125 return is_first_scan_complete_;
126 }
127
128 WifiDataProviderCommon::WlanApiInterface*
129 WifiDataProviderChromeOs::NewWlanApi(chromeos::NetworkLibrary* lib) {
130 return new chromeos::NetworkLibraryWlanApi(lib);
131 }
132
133 WifiDataProviderCommon::WlanApiInterface*
134 WifiDataProviderChromeOs::NewWlanApi() {
135 chromeos::CrosLibrary* cros_lib = chromeos::CrosLibrary::Get();
136 DCHECK(cros_lib);
137 return NewWlanApi(cros_lib->GetNetworkLibrary());
138 }
139
140 PollingPolicyInterface* WifiDataProviderChromeOs::NewPollingPolicy() {
141 return new GenericPollingPolicy<kDefaultPollingIntervalMilliseconds,
142 kNoChangePollingIntervalMilliseconds,
143 kTwoNoChangePollingIntervalMilliseconds,
144 kNoWifiPollingIntervalMilliseconds>;
145 }
146
147 void WifiDataProviderChromeOs::DoStartTaskOnUIThread() {
148 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
149 wlan_api_.reset(NewWlanApi());
150 if (wlan_api_ == NULL) {
151 client_loop()->PostTask(
152 FROM_HERE, base::Bind(&WifiDataProviderChromeOs::DidStartFailed, this));
153 return;
154 }
155 DoWifiScanTaskOnUIThread();
156 }
157
158 void WifiDataProviderChromeOs::DoStopTaskOnUIThread() {
159 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
160 wlan_api_.reset();
161 }
162
163 void WifiDataProviderChromeOs::DidStartFailed() {
164 CHECK(CalledOnClientThread());
165 // Error! Can't do scans, so don't try and schedule one.
166 is_first_scan_complete_ = true;
167 }
168
169 void WifiDataProviderChromeOs::DoWifiScanTaskOnUIThread() {
170 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
171
172 // This method could be scheduled after a DoStopTaskOnUIThread.
173 if (!wlan_api_.get())
174 return;
175
176 WifiData new_data;
177
178 if (!wlan_api_->GetAccessPointData(&new_data.access_point_data)) {
179 client_loop()->PostTask(
180 FROM_HERE,
181 base::Bind(&WifiDataProviderChromeOs::DidWifiScanTaskNoResults, this));
182 } else {
183 client_loop()->PostTask(
184 FROM_HERE,
185 base::Bind(&WifiDataProviderChromeOs::DidWifiScanTask, this, new_data));
186 }
187 }
188
189 void WifiDataProviderChromeOs::DidWifiScanTaskNoResults() {
190 DCHECK(CalledOnClientThread());
191 // Schedule next scan if started (StopDataProvider could have been called
192 // in between DoWifiScanTaskOnUIThread and this method).
193 if (started_)
194 ScheduleNextScan(polling_policy_->NoWifiInterval());
195 MaybeNotifyListeners(false);
196 }
197
198 void WifiDataProviderChromeOs::DidWifiScanTask(const WifiData& new_data) {
199 DCHECK(CalledOnClientThread());
200 bool update_available = wifi_data_.DiffersSignificantly(new_data);
201 wifi_data_ = new_data;
202 // Schedule next scan if started (StopDataProvider could have been called
203 // in between DoWifiScanTaskOnUIThread and this method).
204 if (started_) {
205 polling_policy_->UpdatePollingInterval(update_available);
206 ScheduleNextScan(polling_policy_->PollingInterval());
207 }
208 MaybeNotifyListeners(update_available);
209 }
210
211 void WifiDataProviderChromeOs::MaybeNotifyListeners(bool update_available) {
212 if (update_available || !is_first_scan_complete_) {
213 is_first_scan_complete_ = true;
214 NotifyListeners();
215 }
216 }
217
218 void WifiDataProviderChromeOs::ScheduleNextScan(int interval) {
219 DCHECK(CalledOnClientThread());
220 DCHECK(started_);
221 BrowserThread::PostDelayedTask(
222 BrowserThread::UI,
223 FROM_HERE,
224 base::Bind(&WifiDataProviderChromeOs::DoWifiScanTaskOnUIThread, this),
225 base::TimeDelta::FromMilliseconds(interval));
226 }
227
228 void WifiDataProviderChromeOs::ScheduleStop() {
229 DCHECK(CalledOnClientThread());
230 DCHECK(started_);
231 started_ = false;
232 BrowserThread::PostTask(
233 BrowserThread::UI,
234 FROM_HERE,
235 base::Bind(&WifiDataProviderChromeOs::DoStopTaskOnUIThread, this));
236 }
237
238 void WifiDataProviderChromeOs::ScheduleStart() {
239 DCHECK(CalledOnClientThread());
240 DCHECK(!started_);
241 started_ = true;
242 // Perform first scan ASAP regardless of the polling policy. If this scan
243 // fails we'll retry at a rate in line with the polling policy.
244 BrowserThread::PostTask(
245 BrowserThread::UI,
246 FROM_HERE,
247 base::Bind(&WifiDataProviderChromeOs::DoStartTaskOnUIThread, this));
248 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698