OLD | NEW |
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 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 <stddef.h> | 11 #include <stddef.h> |
12 #include <stdint.h> | 12 #include <stdint.h> |
13 | 13 |
| 14 #include <memory> |
| 15 |
14 #include "base/macros.h" | 16 #include "base/macros.h" |
15 #include "base/memory/scoped_ptr.h" | |
16 #include "base/strings/string_number_conversions.h" | 17 #include "base/strings/string_number_conversions.h" |
17 #include "base/strings/utf_string_conversions.h" | 18 #include "base/strings/utf_string_conversions.h" |
18 #include "content/browser/geolocation/wifi_data_provider_manager.h" | 19 #include "content/browser/geolocation/wifi_data_provider_manager.h" |
19 #include "dbus/bus.h" | 20 #include "dbus/bus.h" |
20 #include "dbus/message.h" | 21 #include "dbus/message.h" |
21 #include "dbus/object_path.h" | 22 #include "dbus/object_path.h" |
22 #include "dbus/object_proxy.h" | 23 #include "dbus/object_proxy.h" |
23 | 24 |
24 namespace content { | 25 namespace content { |
25 namespace { | 26 namespace { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 | 68 |
68 // Given the NetworkManager path to a wireless adapater, dumps the wifi scan | 69 // Given the NetworkManager path to a wireless adapater, dumps the wifi scan |
69 // results and appends them to |data|. Returns false if a fatal error is | 70 // results and appends them to |data|. Returns false if a fatal error is |
70 // encountered such that the data set could not be populated. | 71 // encountered such that the data set could not be populated. |
71 bool GetAccessPointsForAdapter(const dbus::ObjectPath& adapter_path, | 72 bool GetAccessPointsForAdapter(const dbus::ObjectPath& adapter_path, |
72 WifiData::AccessPointDataSet* data); | 73 WifiData::AccessPointDataSet* data); |
73 | 74 |
74 // Internal method used by |GetAccessPointsForAdapter|, given a wifi access | 75 // Internal method used by |GetAccessPointsForAdapter|, given a wifi access |
75 // point proxy retrieves the named property and returns it. Returns NULL in | 76 // point proxy retrieves the named property and returns it. Returns NULL in |
76 // a scoped_ptr if the property could not be read. | 77 // a scoped_ptr if the property could not be read. |
77 scoped_ptr<dbus::Response> GetAccessPointProperty( | 78 std::unique_ptr<dbus::Response> GetAccessPointProperty( |
78 dbus::ObjectProxy* proxy, | 79 dbus::ObjectProxy* proxy, |
79 const std::string& property_name); | 80 const std::string& property_name); |
80 | 81 |
81 scoped_refptr<dbus::Bus> system_bus_; | 82 scoped_refptr<dbus::Bus> system_bus_; |
82 dbus::ObjectProxy* network_manager_proxy_; | 83 dbus::ObjectProxy* network_manager_proxy_; |
83 | 84 |
84 DISALLOW_COPY_AND_ASSIGN(NetworkManagerWlanApi); | 85 DISALLOW_COPY_AND_ASSIGN(NetworkManagerWlanApi); |
85 }; | 86 }; |
86 | 87 |
87 // Convert a wifi frequency to the corresponding channel. Adapted from | 88 // Convert a wifi frequency to the corresponding channel. Adapted from |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 VLOG(1) << "Checking device: " << device_path.value(); | 143 VLOG(1) << "Checking device: " << device_path.value(); |
143 | 144 |
144 dbus::ObjectProxy* device_proxy = | 145 dbus::ObjectProxy* device_proxy = |
145 system_bus_->GetObjectProxy(kNetworkManagerServiceName, | 146 system_bus_->GetObjectProxy(kNetworkManagerServiceName, |
146 device_path); | 147 device_path); |
147 | 148 |
148 dbus::MethodCall method_call(DBUS_INTERFACE_PROPERTIES, "Get"); | 149 dbus::MethodCall method_call(DBUS_INTERFACE_PROPERTIES, "Get"); |
149 dbus::MessageWriter builder(&method_call); | 150 dbus::MessageWriter builder(&method_call); |
150 builder.AppendString("org.freedesktop.NetworkManager.Device"); | 151 builder.AppendString("org.freedesktop.NetworkManager.Device"); |
151 builder.AppendString("DeviceType"); | 152 builder.AppendString("DeviceType"); |
152 scoped_ptr<dbus::Response> response( | 153 std::unique_ptr<dbus::Response> response(device_proxy->CallMethodAndBlock( |
153 device_proxy->CallMethodAndBlock( | 154 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
154 &method_call, | |
155 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); | |
156 if (!response) { | 155 if (!response) { |
157 LOG(WARNING) << "Failed to get the device type for " | 156 LOG(WARNING) << "Failed to get the device type for " |
158 << device_path.value(); | 157 << device_path.value(); |
159 continue; // Check the next device. | 158 continue; // Check the next device. |
160 } | 159 } |
161 dbus::MessageReader reader(response.get()); | 160 dbus::MessageReader reader(response.get()); |
162 uint32_t device_type = 0; | 161 uint32_t device_type = 0; |
163 if (!reader.PopVariantOfUint32(&device_type)) { | 162 if (!reader.PopVariantOfUint32(&device_type)) { |
164 LOG(WARNING) << "Unexpected response for " << device_type << ": " | 163 LOG(WARNING) << "Unexpected response for " << device_type << ": " |
165 << response->ToString(); | 164 << response->ToString(); |
166 continue; // Check the next device. | 165 continue; // Check the next device. |
167 } | 166 } |
168 VLOG(1) << "Device type: " << device_type; | 167 VLOG(1) << "Device type: " << device_type; |
169 | 168 |
170 if (device_type == NM_DEVICE_TYPE_WIFI) { // Found a wlan adapter | 169 if (device_type == NM_DEVICE_TYPE_WIFI) { // Found a wlan adapter |
171 if (GetAccessPointsForAdapter(device_path, data)) | 170 if (GetAccessPointsForAdapter(device_path, data)) |
172 ++success_count; | 171 ++success_count; |
173 else | 172 else |
174 ++fail_count; | 173 ++fail_count; |
175 } | 174 } |
176 } | 175 } |
177 // At least one successful scan overrides any other adapter reporting error. | 176 // At least one successful scan overrides any other adapter reporting error. |
178 return success_count || fail_count == 0; | 177 return success_count || fail_count == 0; |
179 } | 178 } |
180 | 179 |
181 bool NetworkManagerWlanApi::GetAdapterDeviceList( | 180 bool NetworkManagerWlanApi::GetAdapterDeviceList( |
182 std::vector<dbus::ObjectPath>* device_paths) { | 181 std::vector<dbus::ObjectPath>* device_paths) { |
183 dbus::MethodCall method_call(kNetworkManagerInterface, "GetDevices"); | 182 dbus::MethodCall method_call(kNetworkManagerInterface, "GetDevices"); |
184 scoped_ptr<dbus::Response> response( | 183 std::unique_ptr<dbus::Response> response( |
185 network_manager_proxy_->CallMethodAndBlock( | 184 network_manager_proxy_->CallMethodAndBlock( |
186 &method_call, | 185 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
187 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); | |
188 if (!response) { | 186 if (!response) { |
189 LOG(WARNING) << "Failed to get the device list"; | 187 LOG(WARNING) << "Failed to get the device list"; |
190 return false; | 188 return false; |
191 } | 189 } |
192 | 190 |
193 dbus::MessageReader reader(response.get()); | 191 dbus::MessageReader reader(response.get()); |
194 if (!reader.PopArrayOfObjectPaths(device_paths)) { | 192 if (!reader.PopArrayOfObjectPaths(device_paths)) { |
195 LOG(WARNING) << "Unexpected response: " << response->ToString(); | 193 LOG(WARNING) << "Unexpected response: " << response->ToString(); |
196 return false; | 194 return false; |
197 } | 195 } |
198 return true; | 196 return true; |
199 } | 197 } |
200 | 198 |
201 | 199 |
202 bool NetworkManagerWlanApi::GetAccessPointsForAdapter( | 200 bool NetworkManagerWlanApi::GetAccessPointsForAdapter( |
203 const dbus::ObjectPath& adapter_path, WifiData::AccessPointDataSet* data) { | 201 const dbus::ObjectPath& adapter_path, WifiData::AccessPointDataSet* data) { |
204 // Create a proxy object for this wifi adapter, and ask it to do a scan | 202 // Create a proxy object for this wifi adapter, and ask it to do a scan |
205 // (or at least, dump its scan results). | 203 // (or at least, dump its scan results). |
206 dbus::ObjectProxy* device_proxy = | 204 dbus::ObjectProxy* device_proxy = |
207 system_bus_->GetObjectProxy(kNetworkManagerServiceName, | 205 system_bus_->GetObjectProxy(kNetworkManagerServiceName, |
208 adapter_path); | 206 adapter_path); |
209 dbus::MethodCall method_call( | 207 dbus::MethodCall method_call( |
210 "org.freedesktop.NetworkManager.Device.Wireless", | 208 "org.freedesktop.NetworkManager.Device.Wireless", |
211 "GetAccessPoints"); | 209 "GetAccessPoints"); |
212 scoped_ptr<dbus::Response> response( | 210 std::unique_ptr<dbus::Response> response(device_proxy->CallMethodAndBlock( |
213 device_proxy->CallMethodAndBlock( | 211 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); |
214 &method_call, | |
215 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT)); | |
216 if (!response) { | 212 if (!response) { |
217 LOG(WARNING) << "Failed to get access points data for " | 213 LOG(WARNING) << "Failed to get access points data for " |
218 << adapter_path.value(); | 214 << adapter_path.value(); |
219 return false; | 215 return false; |
220 } | 216 } |
221 dbus::MessageReader reader(response.get()); | 217 dbus::MessageReader reader(response.get()); |
222 std::vector<dbus::ObjectPath> access_point_paths; | 218 std::vector<dbus::ObjectPath> access_point_paths; |
223 if (!reader.PopArrayOfObjectPaths(&access_point_paths)) { | 219 if (!reader.PopArrayOfObjectPaths(&access_point_paths)) { |
224 LOG(WARNING) << "Unexpected response for " << adapter_path.value() << ": " | 220 LOG(WARNING) << "Unexpected response for " << adapter_path.value() << ": " |
225 << response->ToString(); | 221 << response->ToString(); |
226 return false; | 222 return false; |
227 } | 223 } |
228 | 224 |
229 VLOG(1) << "Wireless adapter " << adapter_path.value() << " found " | 225 VLOG(1) << "Wireless adapter " << adapter_path.value() << " found " |
230 << access_point_paths.size() << " access points."; | 226 << access_point_paths.size() << " access points."; |
231 | 227 |
232 for (size_t i = 0; i < access_point_paths.size(); ++i) { | 228 for (size_t i = 0; i < access_point_paths.size(); ++i) { |
233 const dbus::ObjectPath& access_point_path = access_point_paths[i]; | 229 const dbus::ObjectPath& access_point_path = access_point_paths[i]; |
234 VLOG(1) << "Checking access point: " << access_point_path.value(); | 230 VLOG(1) << "Checking access point: " << access_point_path.value(); |
235 | 231 |
236 dbus::ObjectProxy* access_point_proxy = | 232 dbus::ObjectProxy* access_point_proxy = |
237 system_bus_->GetObjectProxy(kNetworkManagerServiceName, | 233 system_bus_->GetObjectProxy(kNetworkManagerServiceName, |
238 access_point_path); | 234 access_point_path); |
239 | 235 |
240 AccessPointData access_point_data; | 236 AccessPointData access_point_data; |
241 { | 237 { |
242 scoped_ptr<dbus::Response> response( | 238 std::unique_ptr<dbus::Response> response( |
243 GetAccessPointProperty(access_point_proxy, "Ssid")); | 239 GetAccessPointProperty(access_point_proxy, "Ssid")); |
244 if (!response) | 240 if (!response) |
245 continue; | 241 continue; |
246 // The response should contain a variant that contains an array of bytes. | 242 // The response should contain a variant that contains an array of bytes. |
247 dbus::MessageReader reader(response.get()); | 243 dbus::MessageReader reader(response.get()); |
248 dbus::MessageReader variant_reader(response.get()); | 244 dbus::MessageReader variant_reader(response.get()); |
249 if (!reader.PopVariant(&variant_reader)) { | 245 if (!reader.PopVariant(&variant_reader)) { |
250 LOG(WARNING) << "Unexpected response for " << access_point_path.value() | 246 LOG(WARNING) << "Unexpected response for " << access_point_path.value() |
251 << ": " << response->ToString(); | 247 << ": " << response->ToString(); |
252 continue; | 248 continue; |
253 } | 249 } |
254 const uint8_t* ssid_bytes = NULL; | 250 const uint8_t* ssid_bytes = NULL; |
255 size_t ssid_length = 0; | 251 size_t ssid_length = 0; |
256 if (!variant_reader.PopArrayOfBytes(&ssid_bytes, &ssid_length)) { | 252 if (!variant_reader.PopArrayOfBytes(&ssid_bytes, &ssid_length)) { |
257 LOG(WARNING) << "Unexpected response for " << access_point_path.value() | 253 LOG(WARNING) << "Unexpected response for " << access_point_path.value() |
258 << ": " << response->ToString(); | 254 << ": " << response->ToString(); |
259 continue; | 255 continue; |
260 } | 256 } |
261 std::string ssid(ssid_bytes, ssid_bytes + ssid_length); | 257 std::string ssid(ssid_bytes, ssid_bytes + ssid_length); |
262 access_point_data.ssid = base::UTF8ToUTF16(ssid); | 258 access_point_data.ssid = base::UTF8ToUTF16(ssid); |
263 } | 259 } |
264 | 260 |
265 { // Read the mac address | 261 { // Read the mac address |
266 scoped_ptr<dbus::Response> response( | 262 std::unique_ptr<dbus::Response> response( |
267 GetAccessPointProperty(access_point_proxy, "HwAddress")); | 263 GetAccessPointProperty(access_point_proxy, "HwAddress")); |
268 if (!response) | 264 if (!response) |
269 continue; | 265 continue; |
270 dbus::MessageReader reader(response.get()); | 266 dbus::MessageReader reader(response.get()); |
271 std::string mac; | 267 std::string mac; |
272 if (!reader.PopVariantOfString(&mac)) { | 268 if (!reader.PopVariantOfString(&mac)) { |
273 LOG(WARNING) << "Unexpected response for " << access_point_path.value() | 269 LOG(WARNING) << "Unexpected response for " << access_point_path.value() |
274 << ": " << response->ToString(); | 270 << ": " << response->ToString(); |
275 continue; | 271 continue; |
276 } | 272 } |
277 | 273 |
278 base::ReplaceSubstringsAfterOffset(&mac, 0U, ":", base::StringPiece()); | 274 base::ReplaceSubstringsAfterOffset(&mac, 0U, ":", base::StringPiece()); |
279 std::vector<uint8_t> mac_bytes; | 275 std::vector<uint8_t> mac_bytes; |
280 if (!base::HexStringToBytes(mac, &mac_bytes) || mac_bytes.size() != 6) { | 276 if (!base::HexStringToBytes(mac, &mac_bytes) || mac_bytes.size() != 6) { |
281 LOG(WARNING) << "Can't parse mac address (found " << mac_bytes.size() | 277 LOG(WARNING) << "Can't parse mac address (found " << mac_bytes.size() |
282 << " bytes) so using raw string: " << mac; | 278 << " bytes) so using raw string: " << mac; |
283 access_point_data.mac_address = base::UTF8ToUTF16(mac); | 279 access_point_data.mac_address = base::UTF8ToUTF16(mac); |
284 } else { | 280 } else { |
285 access_point_data.mac_address = MacAddressAsString16(&mac_bytes[0]); | 281 access_point_data.mac_address = MacAddressAsString16(&mac_bytes[0]); |
286 } | 282 } |
287 } | 283 } |
288 | 284 |
289 { // Read signal strength. | 285 { // Read signal strength. |
290 scoped_ptr<dbus::Response> response( | 286 std::unique_ptr<dbus::Response> response( |
291 GetAccessPointProperty(access_point_proxy, "Strength")); | 287 GetAccessPointProperty(access_point_proxy, "Strength")); |
292 if (!response) | 288 if (!response) |
293 continue; | 289 continue; |
294 dbus::MessageReader reader(response.get()); | 290 dbus::MessageReader reader(response.get()); |
295 uint8_t strength = 0; | 291 uint8_t strength = 0; |
296 if (!reader.PopVariantOfByte(&strength)) { | 292 if (!reader.PopVariantOfByte(&strength)) { |
297 LOG(WARNING) << "Unexpected response for " << access_point_path.value() | 293 LOG(WARNING) << "Unexpected response for " << access_point_path.value() |
298 << ": " << response->ToString(); | 294 << ": " << response->ToString(); |
299 continue; | 295 continue; |
300 } | 296 } |
301 // Convert strength as a percentage into dBs. | 297 // Convert strength as a percentage into dBs. |
302 access_point_data.radio_signal_strength = -100 + strength / 2; | 298 access_point_data.radio_signal_strength = -100 + strength / 2; |
303 } | 299 } |
304 | 300 |
305 { // Read the channel | 301 { // Read the channel |
306 scoped_ptr<dbus::Response> response( | 302 std::unique_ptr<dbus::Response> response( |
307 GetAccessPointProperty(access_point_proxy, "Frequency")); | 303 GetAccessPointProperty(access_point_proxy, "Frequency")); |
308 if (!response) | 304 if (!response) |
309 continue; | 305 continue; |
310 dbus::MessageReader reader(response.get()); | 306 dbus::MessageReader reader(response.get()); |
311 uint32_t frequency = 0; | 307 uint32_t frequency = 0; |
312 if (!reader.PopVariantOfUint32(&frequency)) { | 308 if (!reader.PopVariantOfUint32(&frequency)) { |
313 LOG(WARNING) << "Unexpected response for " << access_point_path.value() | 309 LOG(WARNING) << "Unexpected response for " << access_point_path.value() |
314 << ": " << response->ToString(); | 310 << ": " << response->ToString(); |
315 continue; | 311 continue; |
316 } | 312 } |
317 | 313 |
318 // NetworkManager returns frequency in MHz. | 314 // NetworkManager returns frequency in MHz. |
319 access_point_data.channel = | 315 access_point_data.channel = |
320 frquency_in_khz_to_channel(frequency * 1000); | 316 frquency_in_khz_to_channel(frequency * 1000); |
321 } | 317 } |
322 VLOG(1) << "Access point data of " << access_point_path.value() << ": " | 318 VLOG(1) << "Access point data of " << access_point_path.value() << ": " |
323 << "SSID: " << access_point_data.ssid << ", " | 319 << "SSID: " << access_point_data.ssid << ", " |
324 << "MAC: " << access_point_data.mac_address << ", " | 320 << "MAC: " << access_point_data.mac_address << ", " |
325 << "Strength: " << access_point_data.radio_signal_strength << ", " | 321 << "Strength: " << access_point_data.radio_signal_strength << ", " |
326 << "Channel: " << access_point_data.channel; | 322 << "Channel: " << access_point_data.channel; |
327 | 323 |
328 data->insert(access_point_data); | 324 data->insert(access_point_data); |
329 } | 325 } |
330 return true; | 326 return true; |
331 } | 327 } |
332 | 328 |
333 scoped_ptr<dbus::Response> NetworkManagerWlanApi::GetAccessPointProperty( | 329 std::unique_ptr<dbus::Response> NetworkManagerWlanApi::GetAccessPointProperty( |
334 dbus::ObjectProxy* access_point_proxy, | 330 dbus::ObjectProxy* access_point_proxy, |
335 const std::string& property_name) { | 331 const std::string& property_name) { |
336 dbus::MethodCall method_call(DBUS_INTERFACE_PROPERTIES, "Get"); | 332 dbus::MethodCall method_call(DBUS_INTERFACE_PROPERTIES, "Get"); |
337 dbus::MessageWriter builder(&method_call); | 333 dbus::MessageWriter builder(&method_call); |
338 builder.AppendString("org.freedesktop.NetworkManager.AccessPoint"); | 334 builder.AppendString("org.freedesktop.NetworkManager.AccessPoint"); |
339 builder.AppendString(property_name); | 335 builder.AppendString(property_name); |
340 scoped_ptr<dbus::Response> response = access_point_proxy->CallMethodAndBlock( | 336 std::unique_ptr<dbus::Response> response = |
341 &method_call, | 337 access_point_proxy->CallMethodAndBlock( |
342 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT); | 338 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT); |
343 if (!response) { | 339 if (!response) { |
344 LOG(WARNING) << "Failed to get property for " << property_name; | 340 LOG(WARNING) << "Failed to get property for " << property_name; |
345 } | 341 } |
346 return response; | 342 return response; |
347 } | 343 } |
348 | 344 |
349 } // namespace | 345 } // namespace |
350 | 346 |
351 // static | 347 // static |
352 WifiDataProvider* WifiDataProviderManager::DefaultFactoryFunction() { | 348 WifiDataProvider* WifiDataProviderManager::DefaultFactoryFunction() { |
353 return new WifiDataProviderLinux(); | 349 return new WifiDataProviderLinux(); |
354 } | 350 } |
355 | 351 |
356 WifiDataProviderLinux::WifiDataProviderLinux() { | 352 WifiDataProviderLinux::WifiDataProviderLinux() { |
357 } | 353 } |
358 | 354 |
359 WifiDataProviderLinux::~WifiDataProviderLinux() { | 355 WifiDataProviderLinux::~WifiDataProviderLinux() { |
360 } | 356 } |
361 | 357 |
362 WifiDataProviderCommon::WlanApiInterface* | 358 WifiDataProviderCommon::WlanApiInterface* |
363 WifiDataProviderLinux::NewWlanApi() { | 359 WifiDataProviderLinux::NewWlanApi() { |
364 scoped_ptr<NetworkManagerWlanApi> wlan_api(new NetworkManagerWlanApi); | 360 std::unique_ptr<NetworkManagerWlanApi> wlan_api(new NetworkManagerWlanApi); |
365 if (wlan_api->Init()) | 361 if (wlan_api->Init()) |
366 return wlan_api.release(); | 362 return wlan_api.release(); |
367 return NULL; | 363 return NULL; |
368 } | 364 } |
369 | 365 |
370 WifiPollingPolicy* WifiDataProviderLinux::NewPollingPolicy() { | 366 WifiPollingPolicy* WifiDataProviderLinux::NewPollingPolicy() { |
371 return new GenericWifiPollingPolicy<kDefaultPollingIntervalMilliseconds, | 367 return new GenericWifiPollingPolicy<kDefaultPollingIntervalMilliseconds, |
372 kNoChangePollingIntervalMilliseconds, | 368 kNoChangePollingIntervalMilliseconds, |
373 kTwoNoChangePollingIntervalMilliseconds, | 369 kTwoNoChangePollingIntervalMilliseconds, |
374 kNoWifiPollingIntervalMilliseconds>; | 370 kNoWifiPollingIntervalMilliseconds>; |
375 } | 371 } |
376 | 372 |
377 WifiDataProviderCommon::WlanApiInterface* | 373 WifiDataProviderCommon::WlanApiInterface* |
378 WifiDataProviderLinux::NewWlanApiForTesting(dbus::Bus* bus) { | 374 WifiDataProviderLinux::NewWlanApiForTesting(dbus::Bus* bus) { |
379 scoped_ptr<NetworkManagerWlanApi> wlan_api(new NetworkManagerWlanApi); | 375 std::unique_ptr<NetworkManagerWlanApi> wlan_api(new NetworkManagerWlanApi); |
380 if (wlan_api->InitWithBus(bus)) | 376 if (wlan_api->InitWithBus(bus)) |
381 return wlan_api.release(); | 377 return wlan_api.release(); |
382 return NULL; | 378 return NULL; |
383 } | 379 } |
384 | 380 |
385 } // namespace content | 381 } // namespace content |
OLD | NEW |