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

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

Issue 11881011: Move wifi_data_provider_chromeos -> content (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase 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
« no previous file with comments | « chrome/browser/geolocation/wifi_data_provider_chromeos.h ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 // TODO(stevenjb): Re-implement this with chromeos::GeolocationHandler. The
80 // previous code has been broken since switching to Shill. crbug.com/167987
81 return false;
82 }
83
84 } // namespace
85 } // namespace chromeos
86
87 WifiDataProviderChromeOs::WifiDataProviderChromeOs() : started_(false) {
88 }
89
90 WifiDataProviderChromeOs::~WifiDataProviderChromeOs() {
91 }
92
93 bool WifiDataProviderChromeOs::StartDataProvider() {
94 DCHECK(CalledOnClientThread());
95
96 DCHECK(polling_policy_ == NULL);
97 polling_policy_.reset(NewPollingPolicy());
98 DCHECK(polling_policy_ != NULL);
99
100 ScheduleStart();
101 return true;
102 }
103
104 void WifiDataProviderChromeOs::StopDataProvider() {
105 DCHECK(CalledOnClientThread());
106
107 polling_policy_.reset();
108 ScheduleStop();
109 }
110
111 bool WifiDataProviderChromeOs::GetData(WifiData* data) {
112 DCHECK(CalledOnClientThread());
113 DCHECK(data);
114 *data = wifi_data_;
115 return is_first_scan_complete_;
116 }
117
118 WifiDataProviderCommon::WlanApiInterface*
119 WifiDataProviderChromeOs::NewWlanApi(chromeos::NetworkLibrary* lib) {
120 return new chromeos::NetworkLibraryWlanApi(lib);
121 }
122
123 WifiDataProviderCommon::WlanApiInterface*
124 WifiDataProviderChromeOs::NewWlanApi() {
125 chromeos::CrosLibrary* cros_lib = chromeos::CrosLibrary::Get();
126 DCHECK(cros_lib);
127 return NewWlanApi(cros_lib->GetNetworkLibrary());
128 }
129
130 PollingPolicyInterface* WifiDataProviderChromeOs::NewPollingPolicy() {
131 return new GenericPollingPolicy<kDefaultPollingIntervalMilliseconds,
132 kNoChangePollingIntervalMilliseconds,
133 kTwoNoChangePollingIntervalMilliseconds,
134 kNoWifiPollingIntervalMilliseconds>;
135 }
136
137 void WifiDataProviderChromeOs::DoStartTaskOnUIThread() {
138 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
139 wlan_api_.reset(NewWlanApi());
140 if (wlan_api_ == NULL) {
141 client_loop()->PostTask(
142 FROM_HERE, base::Bind(&WifiDataProviderChromeOs::DidStartFailed, this));
143 return;
144 }
145 DoWifiScanTaskOnUIThread();
146 }
147
148 void WifiDataProviderChromeOs::DoStopTaskOnUIThread() {
149 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
150 wlan_api_.reset();
151 }
152
153 void WifiDataProviderChromeOs::DidStartFailed() {
154 CHECK(CalledOnClientThread());
155 // Error! Can't do scans, so don't try and schedule one.
156 is_first_scan_complete_ = true;
157 }
158
159 void WifiDataProviderChromeOs::DoWifiScanTaskOnUIThread() {
160 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
161
162 // This method could be scheduled after a DoStopTaskOnUIThread.
163 if (!wlan_api_.get())
164 return;
165
166 WifiData new_data;
167
168 if (!wlan_api_->GetAccessPointData(&new_data.access_point_data)) {
169 client_loop()->PostTask(
170 FROM_HERE,
171 base::Bind(&WifiDataProviderChromeOs::DidWifiScanTaskNoResults, this));
172 } else {
173 client_loop()->PostTask(
174 FROM_HERE,
175 base::Bind(&WifiDataProviderChromeOs::DidWifiScanTask, this, new_data));
176 }
177 }
178
179 void WifiDataProviderChromeOs::DidWifiScanTaskNoResults() {
180 DCHECK(CalledOnClientThread());
181 // Schedule next scan if started (StopDataProvider could have been called
182 // in between DoWifiScanTaskOnUIThread and this method).
183 if (started_)
184 ScheduleNextScan(polling_policy_->NoWifiInterval());
185 MaybeNotifyListeners(false);
186 }
187
188 void WifiDataProviderChromeOs::DidWifiScanTask(const WifiData& new_data) {
189 DCHECK(CalledOnClientThread());
190 bool update_available = wifi_data_.DiffersSignificantly(new_data);
191 wifi_data_ = new_data;
192 // Schedule next scan if started (StopDataProvider could have been called
193 // in between DoWifiScanTaskOnUIThread and this method).
194 if (started_) {
195 polling_policy_->UpdatePollingInterval(update_available);
196 ScheduleNextScan(polling_policy_->PollingInterval());
197 }
198 MaybeNotifyListeners(update_available);
199 }
200
201 void WifiDataProviderChromeOs::MaybeNotifyListeners(bool update_available) {
202 if (update_available || !is_first_scan_complete_) {
203 is_first_scan_complete_ = true;
204 NotifyListeners();
205 }
206 }
207
208 void WifiDataProviderChromeOs::ScheduleNextScan(int interval) {
209 DCHECK(CalledOnClientThread());
210 DCHECK(started_);
211 BrowserThread::PostDelayedTask(
212 BrowserThread::UI,
213 FROM_HERE,
214 base::Bind(&WifiDataProviderChromeOs::DoWifiScanTaskOnUIThread, this),
215 base::TimeDelta::FromMilliseconds(interval));
216 }
217
218 void WifiDataProviderChromeOs::ScheduleStop() {
219 DCHECK(CalledOnClientThread());
220 DCHECK(started_);
221 started_ = false;
222 BrowserThread::PostTask(
223 BrowserThread::UI,
224 FROM_HERE,
225 base::Bind(&WifiDataProviderChromeOs::DoStopTaskOnUIThread, this));
226 }
227
228 void WifiDataProviderChromeOs::ScheduleStart() {
229 DCHECK(CalledOnClientThread());
230 DCHECK(!started_);
231 started_ = true;
232 // Perform first scan ASAP regardless of the polling policy. If this scan
233 // fails we'll retry at a rate in line with the polling policy.
234 BrowserThread::PostTask(
235 BrowserThread::UI,
236 FROM_HERE,
237 base::Bind(&WifiDataProviderChromeOs::DoStartTaskOnUIThread, this));
238 }
OLDNEW
« no previous file with comments | « chrome/browser/geolocation/wifi_data_provider_chromeos.h ('k') | chrome/chrome_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698