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

Side by Side Diff: content/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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Provides wifi scan API binding for chromeos, using proprietary APIs. 5 // Provides wifi scan API binding for chromeos, using proprietary APIs.
6 6
7 #include "chrome/browser/geolocation/wifi_data_provider_chromeos.h" 7 #include "content/browser/geolocation/wifi_data_provider_chromeos.h"
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/utf_string_conversions.h" 10 #include "base/utf_string_conversions.h"
11 #include "chrome/browser/chromeos/cros/cros_library.h" 11 #include "chromeos/network/geolocation_handler.h"
12 #include "chrome/browser/chromeos/cros/network_library.h"
13 #include "content/public/browser/browser_thread.h" 12 #include "content/public/browser/browser_thread.h"
14 13
15 using content::AccessPointData; 14 namespace content {
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 15
24 namespace { 16 namespace {
17
25 // The time periods between successive polls of the wifi data. 18 // The time periods between successive polls of the wifi data.
26 const int kDefaultPollingIntervalMilliseconds = 10 * 1000; // 10s 19 const int kDefaultPollingIntervalMilliseconds = 10 * 1000; // 10s
27 const int kNoChangePollingIntervalMilliseconds = 2 * 60 * 1000; // 2 mins 20 const int kNoChangePollingIntervalMilliseconds = 2 * 60 * 1000; // 2 mins
28 const int kTwoNoChangePollingIntervalMilliseconds = 10 * 60 * 1000; // 10 mins 21 const int kTwoNoChangePollingIntervalMilliseconds = 10 * 60 * 1000; // 10 mins
29 const int kNoWifiPollingIntervalMilliseconds = 20 * 1000; // 20s 22 const int kNoWifiPollingIntervalMilliseconds = 20 * 1000; // 20s
30 23
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 24 } // namespace
47 25
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) { 26 WifiDataProviderChromeOs::WifiDataProviderChromeOs() : started_(false) {
88 } 27 }
89 28
90 WifiDataProviderChromeOs::~WifiDataProviderChromeOs() { 29 WifiDataProviderChromeOs::~WifiDataProviderChromeOs() {
91 } 30 }
92 31
93 bool WifiDataProviderChromeOs::StartDataProvider() { 32 bool WifiDataProviderChromeOs::StartDataProvider() {
94 DCHECK(CalledOnClientThread()); 33 DCHECK(CalledOnClientThread());
95 34
96 DCHECK(polling_policy_ == NULL); 35 DCHECK(polling_policy_ == NULL);
97 polling_policy_.reset(NewPollingPolicy()); 36 polling_policy_.reset(
98 DCHECK(polling_policy_ != NULL); 37 new GenericPollingPolicy<kDefaultPollingIntervalMilliseconds,
38 kNoChangePollingIntervalMilliseconds,
39 kTwoNoChangePollingIntervalMilliseconds,
40 kNoWifiPollingIntervalMilliseconds>);
99 41
100 ScheduleStart(); 42 ScheduleStart();
101 return true; 43 return true;
102 } 44 }
103 45
104 void WifiDataProviderChromeOs::StopDataProvider() { 46 void WifiDataProviderChromeOs::StopDataProvider() {
105 DCHECK(CalledOnClientThread()); 47 DCHECK(CalledOnClientThread());
106 48
107 polling_policy_.reset(); 49 polling_policy_.reset();
108 ScheduleStop(); 50 ScheduleStop();
109 } 51 }
110 52
111 bool WifiDataProviderChromeOs::GetData(WifiData* data) { 53 bool WifiDataProviderChromeOs::GetData(WifiData* data) {
112 DCHECK(CalledOnClientThread()); 54 DCHECK(CalledOnClientThread());
113 DCHECK(data); 55 DCHECK(data);
114 *data = wifi_data_; 56 *data = wifi_data_;
115 return is_first_scan_complete_; 57 return is_first_scan_complete_;
116 } 58 }
117 59
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() { 60 void WifiDataProviderChromeOs::DoStartTaskOnUIThread() {
138 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 61 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(); 62 DoWifiScanTaskOnUIThread();
146 } 63 }
147 64
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() { 65 void WifiDataProviderChromeOs::DoWifiScanTaskOnUIThread() {
160 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 66 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
161 67
162 // This method could be scheduled after a DoStopTaskOnUIThread. 68 // This method could be scheduled after a ScheduleStop.
163 if (!wlan_api_.get()) 69 if (!started_)
164 return; 70 return;
165 71
166 WifiData new_data; 72 WifiData new_data;
167 73
168 if (!wlan_api_->GetAccessPointData(&new_data.access_point_data)) { 74 if (!GetAccessPointData(&new_data.access_point_data)) {
169 client_loop()->PostTask( 75 client_loop()->PostTask(
170 FROM_HERE, 76 FROM_HERE,
171 base::Bind(&WifiDataProviderChromeOs::DidWifiScanTaskNoResults, this)); 77 base::Bind(&WifiDataProviderChromeOs::DidWifiScanTaskNoResults, this));
172 } else { 78 } else {
173 client_loop()->PostTask( 79 client_loop()->PostTask(
174 FROM_HERE, 80 FROM_HERE,
175 base::Bind(&WifiDataProviderChromeOs::DidWifiScanTask, this, new_data)); 81 base::Bind(&WifiDataProviderChromeOs::DidWifiScanTask, this, new_data));
176 } 82 }
177 } 83 }
178 84
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 BrowserThread::UI, 118 BrowserThread::UI,
213 FROM_HERE, 119 FROM_HERE,
214 base::Bind(&WifiDataProviderChromeOs::DoWifiScanTaskOnUIThread, this), 120 base::Bind(&WifiDataProviderChromeOs::DoWifiScanTaskOnUIThread, this),
215 base::TimeDelta::FromMilliseconds(interval)); 121 base::TimeDelta::FromMilliseconds(interval));
216 } 122 }
217 123
218 void WifiDataProviderChromeOs::ScheduleStop() { 124 void WifiDataProviderChromeOs::ScheduleStop() {
219 DCHECK(CalledOnClientThread()); 125 DCHECK(CalledOnClientThread());
220 DCHECK(started_); 126 DCHECK(started_);
221 started_ = false; 127 started_ = false;
222 BrowserThread::PostTask(
223 BrowserThread::UI,
224 FROM_HERE,
225 base::Bind(&WifiDataProviderChromeOs::DoStopTaskOnUIThread, this));
226 } 128 }
227 129
228 void WifiDataProviderChromeOs::ScheduleStart() { 130 void WifiDataProviderChromeOs::ScheduleStart() {
229 DCHECK(CalledOnClientThread()); 131 DCHECK(CalledOnClientThread());
230 DCHECK(!started_); 132 DCHECK(!started_);
231 started_ = true; 133 started_ = true;
232 // Perform first scan ASAP regardless of the polling policy. If this scan 134 // 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. 135 // fails we'll retry at a rate in line with the polling policy.
234 BrowserThread::PostTask( 136 BrowserThread::PostTask(
235 BrowserThread::UI, 137 BrowserThread::UI,
236 FROM_HERE, 138 FROM_HERE,
237 base::Bind(&WifiDataProviderChromeOs::DoStartTaskOnUIThread, this)); 139 base::Bind(&WifiDataProviderChromeOs::DoStartTaskOnUIThread, this));
238 } 140 }
141
142 bool WifiDataProviderChromeOs::GetAccessPointData(
143 WifiData::AccessPointDataSet* result) {
144 chromeos::WifiAccessPointVector access_points;
145 if (!chromeos::GeolocationHandler::Get()->wifi_enabled())
146 return false;
147 int64 age_ms = 0;
148 if (!chromeos::GeolocationHandler::Get()->GetWifiAccessPoints(
149 &access_points, &age_ms)) {
150 return false;
151 }
152 for (chromeos::WifiAccessPointVector::const_iterator i
153 = access_points.begin();
154 i != access_points.end(); ++i) {
155 AccessPointData ap_data;
156 ap_data.mac_address = ASCIIToUTF16(i->mac_address);
157 ap_data.radio_signal_strength = i->signal_strength;
158 ap_data.channel = i->channel;
159 ap_data.signal_to_noise = i->signal_to_noise;
160 ap_data.ssid = UTF8ToUTF16(i->ssid);
161 result->insert(ap_data);
162 }
163 // If the age is significantly longer than our long polling time, assume the
164 // data is stale and return false which will trigger a faster update.
165 if (age_ms > kTwoNoChangePollingIntervalMilliseconds * 2)
166 return false;
167 return true;
168 }
169
170 // static
171 template<>
172 WifiDataProviderImplBase* WifiDataProvider::DefaultFactoryFunction() {
173 return new WifiDataProviderChromeOs();
174 }
175
176 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698