Index: chrome/browser/chromeos/cros/cros_network_functions.cc |
diff --git a/chrome/browser/chromeos/cros/cros_network_functions.cc b/chrome/browser/chromeos/cros/cros_network_functions.cc |
index e0fdd818dd930cc09d0e23858cc3b583bab4abf0..20a696e73717f4de5645df542475f345d13347f3 100644 |
--- a/chrome/browser/chromeos/cros/cros_network_functions.cc |
+++ b/chrome/browser/chromeos/cros/cros_network_functions.cc |
@@ -13,6 +13,7 @@ |
#include "chromeos/dbus/flimflam_device_client.h" |
#include "chromeos/dbus/flimflam_ipconfig_client.h" |
#include "chromeos/dbus/flimflam_manager_client.h" |
+#include "chromeos/dbus/flimflam_network_client.h" |
#include "chromeos/dbus/flimflam_profile_client.h" |
#include "chromeos/dbus/flimflam_service_client.h" |
#include "dbus/object_path.h" |
@@ -775,26 +776,112 @@ void CrosFreeIPConfigStatus(IPConfigStatus* status) { |
} |
bool CrosGetWifiAccessPoints(WifiAccessPointVector* result) { |
- DeviceNetworkList* network_list = chromeos::GetDeviceNetworkList(); |
- if (network_list == NULL) |
- return false; |
- result->clear(); |
- result->reserve(network_list->network_size); |
- const base::Time now = base::Time::Now(); |
- for (size_t i = 0; i < network_list->network_size; ++i) { |
- DCHECK(network_list->networks[i].address); |
- DCHECK(network_list->networks[i].name); |
- WifiAccessPoint ap; |
- ap.mac_address = SafeString(network_list->networks[i].address); |
- ap.name = SafeString(network_list->networks[i].name); |
- ap.timestamp = now - |
- base::TimeDelta::FromSeconds(network_list->networks[i].age_seconds); |
- ap.signal_strength = network_list->networks[i].strength; |
- ap.channel = network_list->networks[i].channel; |
- result->push_back(ap); |
- } |
- chromeos::FreeDeviceNetworkList(network_list); |
- return true; |
+ if (g_libcros_network_functions_enabled) { |
+ DeviceNetworkList* network_list = chromeos::GetDeviceNetworkList(); |
+ if (network_list == NULL) |
+ return false; |
+ result->clear(); |
+ result->reserve(network_list->network_size); |
+ const base::Time now = base::Time::Now(); |
+ for (size_t i = 0; i < network_list->network_size; ++i) { |
+ DCHECK(network_list->networks[i].address); |
+ DCHECK(network_list->networks[i].name); |
+ WifiAccessPoint ap; |
+ ap.mac_address = SafeString(network_list->networks[i].address); |
+ ap.name = SafeString(network_list->networks[i].name); |
+ ap.timestamp = now - |
+ base::TimeDelta::FromSeconds(network_list->networks[i].age_seconds); |
+ ap.signal_strength = network_list->networks[i].strength; |
+ ap.channel = network_list->networks[i].channel; |
+ result->push_back(ap); |
+ } |
+ chromeos::FreeDeviceNetworkList(network_list); |
+ return true; |
+ } else { |
+ scoped_ptr<base::DictionaryValue> manager_properties( |
+ DBusThreadManager::Get()->GetFlimflamManagerClient()-> |
+ CallGetPropertiesAndBlock()); |
+ if (!manager_properties.get()) { |
+ LOG(WARNING) << "Couldn't read managers's properties"; |
+ return false; |
+ } |
+ |
+ base::ListValue* devices = NULL; |
+ if (!manager_properties->GetListWithoutPathExpansion( |
+ flimflam::kDevicesProperty, &devices)) { |
+ LOG(WARNING) << flimflam::kDevicesProperty << " property not found"; |
+ return false; |
+ } |
+ const base::Time now = base::Time::Now(); |
+ bool found_at_least_one_device = false; |
+ result->clear(); |
+ for (size_t i = 0; i < devices->GetSize(); i++) { |
+ std::string device_path; |
+ if (!devices->GetString(i, &device_path)) { |
+ LOG(WARNING) << "Couldn't get devices[" << i << "]"; |
+ continue; |
+ } |
+ scoped_ptr<base::DictionaryValue> device_properties( |
+ DBusThreadManager::Get()->GetFlimflamDeviceClient()-> |
+ CallGetPropertiesAndBlock(dbus::ObjectPath(device_path))); |
+ if (!device_properties.get()) { |
+ LOG(WARNING) << "Couldn't read device's properties " << device_path; |
+ continue; |
+ } |
+ |
+ base::ListValue* networks = NULL; |
+ if (!device_properties->GetListWithoutPathExpansion( |
+ flimflam::kNetworksProperty, &networks)) |
+ continue; // Some devices do not list networks, e.g. ethernet. |
+ |
+ base::Value* device_powered_value = NULL; |
+ bool device_powered = false; |
+ if (device_properties->GetWithoutPathExpansion( |
+ flimflam::kPoweredProperty, &device_powered_value) && |
+ device_powered_value->GetAsBoolean(&device_powered) && |
+ !device_powered) |
+ continue; // Skip devices that are not powered up. |
+ |
+ int scan_interval = 0; |
+ device_properties->GetIntegerWithoutPathExpansion( |
+ flimflam::kScanIntervalProperty, &scan_interval); |
+ |
+ found_at_least_one_device = true; |
+ for (size_t j = 0; j < networks->GetSize(); j++) { |
+ std::string network_path; |
+ if (!networks->GetString(j, &network_path)) { |
+ LOG(WARNING) << "Couldn't get networks[" << j << "]"; |
+ continue; |
+ } |
+ |
+ scoped_ptr<base::DictionaryValue> network_properties( |
+ DBusThreadManager::Get()->GetFlimflamNetworkClient()-> |
+ CallGetPropertiesAndBlock(dbus::ObjectPath(network_path))); |
+ if (!network_properties.get()) { |
+ LOG(WARNING) << "Couldn't read network's properties " << network_path; |
+ continue; |
+ } |
+ |
+ // Using the scan interval as a proxy for approximate age. |
+ // TODO(joth): Replace with actual age, when available from dbus. |
+ const int age_seconds = scan_interval; |
+ WifiAccessPoint ap; |
+ network_properties->GetStringWithoutPathExpansion( |
+ flimflam::kAddressProperty, &ap.mac_address); |
+ network_properties->GetStringWithoutPathExpansion( |
+ flimflam::kNameProperty, &ap.name); |
+ ap.timestamp = now - base::TimeDelta::FromSeconds(age_seconds); |
+ network_properties->GetIntegerWithoutPathExpansion( |
+ flimflam::kSignalStrengthProperty, &ap.signal_strength); |
+ network_properties->GetIntegerWithoutPathExpansion( |
+ flimflam::kWifiChannelProperty, &ap.channel); |
+ result->push_back(ap); |
+ } |
+ } |
+ if (!found_at_least_one_device) |
+ return false; // No powered device found that has a 'Networks' array. |
+ return true; |
+ } |
} |
void CrosConfigureService(const base::DictionaryValue& properties) { |