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

Side by Side Diff: content/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
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/chromeos/chromeos_version.h"
10 #include "base/utf_string_conversions.h" 11 #include "base/utf_string_conversions.h"
11 #include "chrome/browser/chromeos/cros/cros_library.h" 12 #include "chromeos/network/cros_network_functions.h"
12 #include "chrome/browser/chromeos/cros/network_library.h" 13 #include "chromeos/network/network_state_handler.h"
13 #include "content/public/browser/browser_thread.h" 14 #include "content/public/browser/browser_thread.h"
15 #include "third_party/cros_system_api/dbus/service_constants.h"
14 16
15 using content::AccessPointData; 17 namespace content {
16 using content::BrowserThread; 18 namespace {
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 19
24 namespace {
25 // The time periods between successive polls of the wifi data. 20 // The time periods between successive polls of the wifi data.
26 const int kDefaultPollingIntervalMilliseconds = 10 * 1000; // 10s 21 const int kDefaultPollingIntervalMilliseconds = 10 * 1000; // 10s
27 const int kNoChangePollingIntervalMilliseconds = 2 * 60 * 1000; // 2 mins 22 const int kNoChangePollingIntervalMilliseconds = 2 * 60 * 1000; // 2 mins
28 const int kTwoNoChangePollingIntervalMilliseconds = 10 * 60 * 1000; // 10 mins 23 const int kTwoNoChangePollingIntervalMilliseconds = 10 * 60 * 1000; // 10 mins
29 const int kNoWifiPollingIntervalMilliseconds = 20 * 1000; // 20s 24 const int kNoWifiPollingIntervalMilliseconds = 20 * 1000; // 20s
30 25
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 26 } // namespace
47 27
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) { 28 WifiDataProviderChromeOs::WifiDataProviderChromeOs() : started_(false) {
98 } 29 }
99 30
100 WifiDataProviderChromeOs::~WifiDataProviderChromeOs() { 31 WifiDataProviderChromeOs::~WifiDataProviderChromeOs() {
101 } 32 }
102 33
103 bool WifiDataProviderChromeOs::StartDataProvider() { 34 bool WifiDataProviderChromeOs::StartDataProvider() {
104 DCHECK(CalledOnClientThread()); 35 DCHECK(CalledOnClientThread());
105 36
106 DCHECK(polling_policy_ == NULL); 37 DCHECK(polling_policy_ == NULL);
107 polling_policy_.reset(NewPollingPolicy()); 38 polling_policy_.reset(
108 DCHECK(polling_policy_ != NULL); 39 new GenericPollingPolicy<kDefaultPollingIntervalMilliseconds,
40 kNoChangePollingIntervalMilliseconds,
41 kTwoNoChangePollingIntervalMilliseconds,
42 kNoWifiPollingIntervalMilliseconds>);
109 43
110 ScheduleStart(); 44 ScheduleStart();
111 return true; 45 return true;
112 } 46 }
113 47
114 void WifiDataProviderChromeOs::StopDataProvider() { 48 void WifiDataProviderChromeOs::StopDataProvider() {
115 DCHECK(CalledOnClientThread()); 49 DCHECK(CalledOnClientThread());
116 50
117 polling_policy_.reset(); 51 polling_policy_.reset();
118 ScheduleStop(); 52 ScheduleStop();
119 } 53 }
120 54
121 bool WifiDataProviderChromeOs::GetData(WifiData* data) { 55 bool WifiDataProviderChromeOs::GetData(WifiData* data) {
122 DCHECK(CalledOnClientThread()); 56 DCHECK(CalledOnClientThread());
123 DCHECK(data); 57 DCHECK(data);
124 *data = wifi_data_; 58 *data = wifi_data_;
125 return is_first_scan_complete_; 59 return is_first_scan_complete_;
126 } 60 }
127 61
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() { 62 void WifiDataProviderChromeOs::DoStartTaskOnUIThread() {
148 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 63 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(); 64 DoWifiScanTaskOnUIThread();
156 } 65 }
157 66
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() { 67 void WifiDataProviderChromeOs::DoWifiScanTaskOnUIThread() {
170 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 68 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
171 69
172 // This method could be scheduled after a DoStopTaskOnUIThread. 70 // This method could be scheduled after a ScheduleStop.
173 if (!wlan_api_.get()) 71 if (!started_)
174 return; 72 return;
175 73
176 WifiData new_data; 74 WifiData new_data;
177 75
178 if (!wlan_api_->GetAccessPointData(&new_data.access_point_data)) { 76 if (!GetAccessPointData(&new_data.access_point_data)) {
179 client_loop()->PostTask( 77 client_loop()->PostTask(
180 FROM_HERE, 78 FROM_HERE,
181 base::Bind(&WifiDataProviderChromeOs::DidWifiScanTaskNoResults, this)); 79 base::Bind(&WifiDataProviderChromeOs::DidWifiScanTaskNoResults, this));
182 } else { 80 } else {
183 client_loop()->PostTask( 81 client_loop()->PostTask(
184 FROM_HERE, 82 FROM_HERE,
185 base::Bind(&WifiDataProviderChromeOs::DidWifiScanTask, this, new_data)); 83 base::Bind(&WifiDataProviderChromeOs::DidWifiScanTask, this, new_data));
186 } 84 }
187 } 85 }
188 86
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 BrowserThread::UI, 120 BrowserThread::UI,
223 FROM_HERE, 121 FROM_HERE,
224 base::Bind(&WifiDataProviderChromeOs::DoWifiScanTaskOnUIThread, this), 122 base::Bind(&WifiDataProviderChromeOs::DoWifiScanTaskOnUIThread, this),
225 base::TimeDelta::FromMilliseconds(interval)); 123 base::TimeDelta::FromMilliseconds(interval));
226 } 124 }
227 125
228 void WifiDataProviderChromeOs::ScheduleStop() { 126 void WifiDataProviderChromeOs::ScheduleStop() {
229 DCHECK(CalledOnClientThread()); 127 DCHECK(CalledOnClientThread());
230 DCHECK(started_); 128 DCHECK(started_);
231 started_ = false; 129 started_ = false;
232 BrowserThread::PostTask(
233 BrowserThread::UI,
234 FROM_HERE,
235 base::Bind(&WifiDataProviderChromeOs::DoStopTaskOnUIThread, this));
236 } 130 }
237 131
238 void WifiDataProviderChromeOs::ScheduleStart() { 132 void WifiDataProviderChromeOs::ScheduleStart() {
239 DCHECK(CalledOnClientThread()); 133 DCHECK(CalledOnClientThread());
240 DCHECK(!started_); 134 DCHECK(!started_);
241 started_ = true; 135 started_ = true;
242 // Perform first scan ASAP regardless of the polling policy. If this scan 136 // 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. 137 // fails we'll retry at a rate in line with the polling policy.
244 BrowserThread::PostTask( 138 BrowserThread::PostTask(
245 BrowserThread::UI, 139 BrowserThread::UI,
246 FROM_HERE, 140 FROM_HERE,
247 base::Bind(&WifiDataProviderChromeOs::DoStartTaskOnUIThread, this)); 141 base::Bind(&WifiDataProviderChromeOs::DoStartTaskOnUIThread, this));
248 } 142 }
143
144 bool WifiDataProviderChromeOs::GetAccessPointData(
145 WifiData::AccessPointDataSet* result) {
146 if (!base::chromeos::IsRunningOnChromeOS()) {
147 *result = WifiData::AccessPointDataSet();
148 return true;
149 }
150
151 chromeos::WifiAccessPointVector access_points;
152 if (!chromeos::CrosGetWifiAccessPoints(&access_points))
153 return false;
stevenjb 2013/01/04 20:41:04 So, this is OK, we can replace it when it has been
154 for (size_t i = 0; i < access_points.size(); ++i) {
155 AccessPointData ap_data;
156 ap_data.mac_address = ASCIIToUTF16(access_points[i].mac_address);
157 ap_data.radio_signal_strength = access_points[i].signal_strength;
158 ap_data.channel = access_points[i].channel;
159 ap_data.signal_to_noise = access_points[i].signal_to_noise;
160 ap_data.ssid = UTF8ToUTF16(access_points[i].name);
161 result->insert(ap_data);
162 }
163 bool wifi_enabled = chromeos::NetworkStateHandler::Get()->
164 TechnologyEnabled(flimflam::kTypeWifi);
stevenjb 2013/01/04 20:41:04 This is behind a flag and will crash without --ena
jam 2013/01/04 21:18:31 my plan was just to wait for your refactor
165 return !result->empty() || wifi_enabled;
166 }
167
168 // static
169 template<>
170 WifiDataProviderImplBase* WifiDataProvider::DefaultFactoryFunction() {
171 return new WifiDataProviderChromeOs();
172 }
173
174 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698