Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / chromeos / network / managed_network_configuration_handler_impl.cc
index f233147..5415a76 100644 (file)
@@ -18,6 +18,7 @@
 #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"
@@ -83,17 +84,6 @@ const base::DictionaryValue* GetByGUID(const GuidToPolicyMap& policies,
   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 {
@@ -169,9 +159,14 @@ void ManagedNetworkConfigurationHandlerImpl::GetManagedPropertiesCallback(
     // 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;
@@ -212,13 +207,31 @@ void ManagedNetworkConfigurationHandlerImpl::GetManagedPropertiesCallback(
 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,
@@ -596,4 +609,34 @@ void ManagedNetworkConfigurationHandlerImpl::OnPolicyAppliedToNetwork(
       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