#include "chromeos/dbus/shill_manager_client.h"
#include "chromeos/dbus/shill_profile_client.h"
#include "chromeos/dbus/shill_service_client.h"
+#include "chromeos/network/device_state.h"
#include "chromeos/network/network_configuration_handler.h"
#include "chromeos/network/network_event_log.h"
#include "chromeos/network/network_policy_observer.h"
return it->second;
}
-void TranslatePropertiesToOncAndRunCallback(
- const network_handler::DictionaryResultCallback& callback,
- const std::string& service_path,
- const base::DictionaryValue& shill_properties) {
- scoped_ptr<base::DictionaryValue> onc_network(
- onc::TranslateShillServiceToONCPart(
- shill_properties,
- &onc::kNetworkWithStateSignature));
- callback.Run(service_path, *onc_network);
-}
-
} // namespace
struct ManagedNetworkConfigurationHandlerImpl::Policies {
// properties _might_ be user configured.
}
+ scoped_ptr<base::DictionaryValue> properties_copy(
+ shill_properties.DeepCopy());
+ // Add the IPConfigs to the dictionary before the ONC translation.
+ GetIPConfigs(service_path, properties_copy.get());
+
scoped_ptr<base::DictionaryValue> active_settings(
onc::TranslateShillServiceToONCPart(
- shill_properties,
+ *properties_copy,
&onc::kNetworkWithStateSignature));
std::string guid;
void ManagedNetworkConfigurationHandlerImpl::GetProperties(
const std::string& service_path,
const network_handler::DictionaryResultCallback& callback,
- const network_handler::ErrorCallback& error_callback) const {
+ const network_handler::ErrorCallback& error_callback) {
network_configuration_handler_->GetProperties(
service_path,
- base::Bind(&TranslatePropertiesToOncAndRunCallback, callback),
+ base::Bind(&ManagedNetworkConfigurationHandlerImpl::GetPropertiesCallback,
+ weak_ptr_factory_.GetWeakPtr(),
+ callback),
error_callback);
}
+void ManagedNetworkConfigurationHandlerImpl::GetPropertiesCallback(
+ const network_handler::DictionaryResultCallback& callback,
+ const std::string& service_path,
+ const base::DictionaryValue& shill_properties) {
+ scoped_ptr<base::DictionaryValue> properties_copy(
+ shill_properties.DeepCopy());
+ // Add the IPConfigs to the dictionary before the ONC translation.
+ GetIPConfigs(service_path, properties_copy.get());
+
+ scoped_ptr<base::DictionaryValue> onc_network(
+ onc::TranslateShillServiceToONCPart(
+ *properties_copy,
+ &onc::kNetworkWithStateSignature));
+ callback.Run(service_path, *onc_network);
+}
+
void ManagedNetworkConfigurationHandlerImpl::SetProperties(
const std::string& service_path,
const base::DictionaryValue& user_settings,
NetworkPolicyObserver, observers_, PolicyApplied(service_path));
}
+void ManagedNetworkConfigurationHandlerImpl::GetIPConfigs(
+ const std::string& service_path,
+ base::DictionaryValue* properties) {
+ std::string connection_state;
+ properties->GetStringWithoutPathExpansion(
+ shill::kStateProperty, &connection_state);
+ if (!NetworkState::StateIsConnected(connection_state))
+ return;
+
+ // Get the IPConfig properties from the device and store them in "IPConfigs"
+ // (plural) in the properties dictionary. (Note: Shill only provides a single
+ // "IPConfig" property for a network service, but a consumer of this API may
+ // want information about all ipv4 and ipv6 IPConfig properties.
+ std::string device;
+ properties->GetStringWithoutPathExpansion(shill::kDeviceProperty, &device);
+ const DeviceState* device_state =
+ network_state_handler_->GetDeviceState(device);
+ if (!device_state) {
+ NET_LOG_ERROR("GetIPConfigs: no device: " + device, service_path);
+ return;
+ }
+ // Convert IPConfig dictionary to a ListValue.
+ base::ListValue* ip_configs = new base::ListValue;
+ for (base::DictionaryValue::Iterator iter(device_state->ip_configs());
+ !iter.IsAtEnd(); iter.Advance()) {
+ ip_configs->Append(iter.value().DeepCopy());
+ }
+ properties->SetWithoutPathExpansion(shill::kIPConfigsProperty, ip_configs);
+}
+
} // namespace chromeos