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

Side by Side Diff: content/browser/geolocation/wifi_data_provider_linux.cc

Issue 9378039: dbus: add ObjectPath type (Closed) Base URL: http://git.chromium.org/git/chromium/src@master
Patch Set: added inequality operator Created 8 years, 10 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
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 suitable for typical linux distributions. 5 // Provides wifi scan API binding for suitable for typical linux distributions.
6 // Currently, only the NetworkManager API is used, accessed via D-Bus (in turn 6 // Currently, only the NetworkManager API is used, accessed via D-Bus (in turn
7 // accessed via the GLib wrapper). 7 // accessed via the GLib wrapper).
8 8
9 #include "content/browser/geolocation/wifi_data_provider_linux.h" 9 #include "content/browser/geolocation/wifi_data_provider_linux.h"
10 10
11 #include "base/memory/scoped_ptr.h" 11 #include "base/memory/scoped_ptr.h"
12 #include "base/string_number_conversions.h" 12 #include "base/string_number_conversions.h"
13 #include "base/utf_string_conversions.h" 13 #include "base/utf_string_conversions.h"
14 #include "dbus/bus.h" 14 #include "dbus/bus.h"
15 #include "dbus/message.h" 15 #include "dbus/message.h"
16 #include "dbus/object_path.h"
16 #include "dbus/object_proxy.h" 17 #include "dbus/object_proxy.h"
17 18
18 namespace { 19 namespace {
19 // The time periods between successive polls of the wifi data. 20 // The time periods between successive polls of the wifi data.
20 const int kDefaultPollingIntervalMilliseconds = 10 * 1000; // 10s 21 const int kDefaultPollingIntervalMilliseconds = 10 * 1000; // 10s
21 const int kNoChangePollingIntervalMilliseconds = 2 * 60 * 1000; // 2 mins 22 const int kNoChangePollingIntervalMilliseconds = 2 * 60 * 1000; // 2 mins
22 const int kTwoNoChangePollingIntervalMilliseconds = 10 * 60 * 1000; // 10 mins 23 const int kTwoNoChangePollingIntervalMilliseconds = 10 * 60 * 1000; // 10 mins
23 const int kNoWifiPollingIntervalMilliseconds = 20 * 1000; // 20s 24 const int kNoWifiPollingIntervalMilliseconds = 20 * 1000; // 20s
24 25
25 const char kNetworkManagerServiceName[] = "org.freedesktop.NetworkManager"; 26 const char kNetworkManagerServiceName[] = "org.freedesktop.NetworkManager";
(...skipping 23 matching lines...) Expand all
49 50
50 // WifiDataProviderCommon::WlanApiInterface 51 // WifiDataProviderCommon::WlanApiInterface
51 // 52 //
52 // This function makes blocking D-Bus calls, but it's totally fine as 53 // This function makes blocking D-Bus calls, but it's totally fine as
53 // the code runs in "Geolocation" thread, not the browser's UI thread. 54 // the code runs in "Geolocation" thread, not the browser's UI thread.
54 virtual bool GetAccessPointData(WifiData::AccessPointDataSet* data); 55 virtual bool GetAccessPointData(WifiData::AccessPointDataSet* data);
55 56
56 private: 57 private:
57 // Enumerates the list of available network adapter devices known to 58 // Enumerates the list of available network adapter devices known to
58 // NetworkManager. Return true on success. 59 // NetworkManager. Return true on success.
59 bool GetAdapterDeviceList(std::vector<std::string>* device_paths); 60 bool GetAdapterDeviceList(std::vector<dbus::ObjectPath>* device_paths);
60 61
61 // Given the NetworkManager path to a wireless adapater, dumps the wifi scan 62 // Given the NetworkManager path to a wireless adapater, dumps the wifi scan
62 // results and appends them to |data|. Returns false if a fatal error is 63 // results and appends them to |data|. Returns false if a fatal error is
63 // encountered such that the data set could not be populated. 64 // encountered such that the data set could not be populated.
64 bool GetAccessPointsForAdapter(const std::string& adapter_path, 65 bool GetAccessPointsForAdapter(const dbus::ObjectPath& adapter_path,
65 WifiData::AccessPointDataSet* data); 66 WifiData::AccessPointDataSet* data);
66 67
67 // Internal method used by |GetAccessPointsForAdapter|, given a wifi access 68 // Internal method used by |GetAccessPointsForAdapter|, given a wifi access
68 // point proxy retrieves the named property and returns it. Returns NULL if 69 // point proxy retrieves the named property and returns it. Returns NULL if
69 // the property could not be read. 70 // the property could not be read.
70 dbus::Response* GetAccessPointProperty(dbus::ObjectProxy* proxy, 71 dbus::Response* GetAccessPointProperty(dbus::ObjectProxy* proxy,
71 const std::string& property_name); 72 const std::string& property_name);
72 73
73 scoped_refptr<dbus::Bus> system_bus_; 74 scoped_refptr<dbus::Bus> system_bus_;
74 dbus::ObjectProxy* network_manager_proxy_; 75 dbus::ObjectProxy* network_manager_proxy_;
(...skipping 30 matching lines...) Expand all
105 return InitWithBus(new dbus::Bus(options)); 106 return InitWithBus(new dbus::Bus(options));
106 } 107 }
107 108
108 bool NetworkManagerWlanApi::InitWithBus(dbus::Bus* bus) { 109 bool NetworkManagerWlanApi::InitWithBus(dbus::Bus* bus) {
109 system_bus_ = bus; 110 system_bus_ = bus;
110 // system_bus_ will own all object proxies created from the bus. 111 // system_bus_ will own all object proxies created from the bus.
111 network_manager_proxy_ = 112 network_manager_proxy_ =
112 system_bus_->GetObjectProxy(kNetworkManagerServiceName, 113 system_bus_->GetObjectProxy(kNetworkManagerServiceName,
113 kNetworkManagerPath); 114 kNetworkManagerPath);
114 // Validate the proxy object by checking we can enumerate devices. 115 // Validate the proxy object by checking we can enumerate devices.
115 std::vector<std::string> adapter_paths; 116 std::vector<dbus::ObjectPath> adapter_paths;
116 const bool success = GetAdapterDeviceList(&adapter_paths); 117 const bool success = GetAdapterDeviceList(&adapter_paths);
117 VLOG(1) << "Init() result: " << success; 118 VLOG(1) << "Init() result: " << success;
118 return success; 119 return success;
119 } 120 }
120 121
121 bool NetworkManagerWlanApi::GetAccessPointData( 122 bool NetworkManagerWlanApi::GetAccessPointData(
122 WifiData::AccessPointDataSet* data) { 123 WifiData::AccessPointDataSet* data) {
123 std::vector<std::string> device_paths; 124 std::vector<dbus::ObjectPath> device_paths;
124 if (!GetAdapterDeviceList(&device_paths)) { 125 if (!GetAdapterDeviceList(&device_paths)) {
125 LOG(WARNING) << "Could not enumerate access points"; 126 LOG(WARNING) << "Could not enumerate access points";
126 return false; 127 return false;
127 } 128 }
128 int success_count = 0; 129 int success_count = 0;
129 int fail_count = 0; 130 int fail_count = 0;
130 131
131 // Iterate the devices, getting APs for each wireless adapter found 132 // Iterate the devices, getting APs for each wireless adapter found
132 for (size_t i = 0; i < device_paths.size(); ++i) { 133 for (size_t i = 0; i < device_paths.size(); ++i) {
133 const std::string& device_path = device_paths[i]; 134 const dbus::ObjectPath& device_path = device_paths[i];
134 VLOG(1) << "Checking device: " << device_path; 135 VLOG(1) << "Checking device: " << device_path;
135 136
136 dbus::ObjectProxy* device_proxy = 137 dbus::ObjectProxy* device_proxy =
137 system_bus_->GetObjectProxy(kNetworkManagerServiceName, 138 system_bus_->GetObjectProxy(kNetworkManagerServiceName,
138 device_path); 139 device_path);
139 140
140 dbus::MethodCall method_call(DBUS_INTERFACE_PROPERTIES, "Get"); 141 dbus::MethodCall method_call(DBUS_INTERFACE_PROPERTIES, "Get");
141 dbus::MessageWriter builder(&method_call); 142 dbus::MessageWriter builder(&method_call);
142 builder.AppendString("org.freedesktop.NetworkManager.Device"); 143 builder.AppendString("org.freedesktop.NetworkManager.Device");
143 builder.AppendString("DeviceType"); 144 builder.AppendString("DeviceType");
(...skipping 19 matching lines...) Expand all
163 ++success_count; 164 ++success_count;
164 else 165 else
165 ++fail_count; 166 ++fail_count;
166 } 167 }
167 } 168 }
168 // At least one successfull scan overrides any other adapter reporting error. 169 // At least one successfull scan overrides any other adapter reporting error.
169 return success_count || fail_count == 0; 170 return success_count || fail_count == 0;
170 } 171 }
171 172
172 bool NetworkManagerWlanApi::GetAdapterDeviceList( 173 bool NetworkManagerWlanApi::GetAdapterDeviceList(
173 std::vector<std::string>* device_paths) { 174 std::vector<dbus::ObjectPath>* device_paths) {
174 dbus::MethodCall method_call(kNetworkManagerInterface, "GetDevices"); 175 dbus::MethodCall method_call(kNetworkManagerInterface, "GetDevices");
175 scoped_ptr<dbus::Response> response( 176 scoped_ptr<dbus::Response> response(
176 network_manager_proxy_->CallMethodAndBlock( 177 network_manager_proxy_->CallMethodAndBlock(
177 &method_call, 178 &method_call,
178 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); 179 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT));
179 if (!response.get()) { 180 if (!response.get()) {
180 LOG(WARNING) << "Failed to get the device list"; 181 LOG(WARNING) << "Failed to get the device list";
181 return false; 182 return false;
182 } 183 }
183 184
184 dbus::MessageReader reader(response.get()); 185 dbus::MessageReader reader(response.get());
185 if (!reader.PopArrayOfObjectPaths(device_paths)) { 186 if (!reader.PopArrayOfObjectPaths(device_paths)) {
186 LOG(WARNING) << "Unexpected response: " << response->ToString(); 187 LOG(WARNING) << "Unexpected response: " << response->ToString();
187 return false; 188 return false;
188 } 189 }
189 return true; 190 return true;
190 } 191 }
191 192
192 193
193 bool NetworkManagerWlanApi::GetAccessPointsForAdapter( 194 bool NetworkManagerWlanApi::GetAccessPointsForAdapter(
194 const std::string& adapter_path, WifiData::AccessPointDataSet* data) { 195 const dbus::ObjectPath& adapter_path, WifiData::AccessPointDataSet* data) {
195 // Create a proxy object for this wifi adapter, and ask it to do a scan 196 // Create a proxy object for this wifi adapter, and ask it to do a scan
196 // (or at least, dump its scan results). 197 // (or at least, dump its scan results).
197 dbus::ObjectProxy* device_proxy = 198 dbus::ObjectProxy* device_proxy =
198 system_bus_->GetObjectProxy(kNetworkManagerServiceName, 199 system_bus_->GetObjectProxy(kNetworkManagerServiceName,
199 adapter_path); 200 adapter_path);
200 dbus::MethodCall method_call( 201 dbus::MethodCall method_call(
201 "org.freedesktop.NetworkManager.Device.Wireless", 202 "org.freedesktop.NetworkManager.Device.Wireless",
202 "GetAccessPoints"); 203 "GetAccessPoints");
203 scoped_ptr<dbus::Response> response( 204 scoped_ptr<dbus::Response> response(
204 device_proxy->CallMethodAndBlock( 205 device_proxy->CallMethodAndBlock(
205 &method_call, 206 &method_call,
206 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); 207 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT));
207 if (!response.get()) { 208 if (!response.get()) {
208 LOG(WARNING) << "Failed to get access points data for " << adapter_path; 209 LOG(WARNING) << "Failed to get access points data for " << adapter_path;
209 return false; 210 return false;
210 } 211 }
211 dbus::MessageReader reader(response.get()); 212 dbus::MessageReader reader(response.get());
212 std::vector<std::string> access_point_paths; 213 std::vector<dbus::ObjectPath> access_point_paths;
213 if (!reader.PopArrayOfObjectPaths(&access_point_paths)) { 214 if (!reader.PopArrayOfObjectPaths(&access_point_paths)) {
214 LOG(WARNING) << "Unexpected response for " << adapter_path << ": " 215 LOG(WARNING) << "Unexpected response for " << adapter_path << ": "
215 << response->ToString(); 216 << response->ToString();
216 return false; 217 return false;
217 } 218 }
218 219
219 VLOG(1) << "Wireless adapter " << adapter_path << " found " 220 VLOG(1) << "Wireless adapter " << adapter_path << " found "
220 << access_point_paths.size() << " access points."; 221 << access_point_paths.size() << " access points.";
221 222
222 for (size_t i = 0; i < access_point_paths.size(); ++i) { 223 for (size_t i = 0; i < access_point_paths.size(); ++i) {
223 const std::string& access_point_path = access_point_paths[i]; 224 const dbus::ObjectPath& access_point_path = access_point_paths[i];
224 VLOG(1) << "Checking access point: " << access_point_path; 225 VLOG(1) << "Checking access point: " << access_point_path;
225 226
226 dbus::ObjectProxy* access_point_proxy = 227 dbus::ObjectProxy* access_point_proxy =
227 system_bus_->GetObjectProxy(kNetworkManagerServiceName, 228 system_bus_->GetObjectProxy(kNetworkManagerServiceName,
228 access_point_path); 229 access_point_path);
229 230
230 AccessPointData access_point_data; 231 AccessPointData access_point_data;
231 { 232 {
232 scoped_ptr<dbus::Response> response( 233 scoped_ptr<dbus::Response> response(
233 GetAccessPointProperty(access_point_proxy, "Ssid")); 234 GetAccessPointProperty(access_point_proxy, "Ssid"));
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 kNoWifiPollingIntervalMilliseconds>; 366 kNoWifiPollingIntervalMilliseconds>;
366 } 367 }
367 368
368 WifiDataProviderCommon::WlanApiInterface* 369 WifiDataProviderCommon::WlanApiInterface*
369 WifiDataProviderLinux::NewWlanApiForTesting(dbus::Bus* bus) { 370 WifiDataProviderLinux::NewWlanApiForTesting(dbus::Bus* bus) {
370 scoped_ptr<NetworkManagerWlanApi> wlan_api(new NetworkManagerWlanApi); 371 scoped_ptr<NetworkManagerWlanApi> wlan_api(new NetworkManagerWlanApi);
371 if (wlan_api->InitWithBus(bus)) 372 if (wlan_api->InitWithBus(bus))
372 return wlan_api.release(); 373 return wlan_api.release();
373 return NULL; 374 return NULL;
374 } 375 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698