15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/network/managed_state.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/network/device_state.h"
1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chromeos/network/network_event_log.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/network/network_state.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chromeos/network/network_type_pattern.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool ManagedState::Matches(const NetworkTypePattern& pattern) const {
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return pattern.MatchesType(type());
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// static
22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochstd::string ManagedState::TypeToString(ManagedType type) {
23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  switch (type) {
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    case MANAGED_TYPE_NETWORK:
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      return "Network";
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    case MANAGED_TYPE_DEVICE:
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      return "Device";
28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return "Unknown";
30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ManagedState::ManagedState(ManagedType type, const std::string& path)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : managed_type_(type),
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      path_(path),
352385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      update_received_(false),
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      update_requested_(false) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ManagedState::~ManagedState() {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ManagedState* ManagedState::Create(ManagedType type, const std::string& path) {
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  switch (type) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case MANAGED_TYPE_NETWORK:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return new NetworkState(path);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case MANAGED_TYPE_DEVICE:
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return new DeviceState(path);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NetworkState* ManagedState::AsNetworkState() {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (managed_type() == MANAGED_TYPE_NETWORK)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return static_cast<NetworkState*>(this);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DeviceState* ManagedState::AsDeviceState() {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (managed_type() == MANAGED_TYPE_DEVICE)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return static_cast<DeviceState*>(this);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool ManagedState::InitialPropertiesReceived(
65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const base::DictionaryValue& properties) {
66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return false;
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ManagedState::GetStateProperties(base::DictionaryValue* dictionary) const {
70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  dictionary->SetStringWithoutPathExpansion(shill::kNameProperty, name());
71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  dictionary->SetStringWithoutPathExpansion(shill::kTypeProperty, type());
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ManagedState::ManagedStatePropertyChanged(const std::string& key,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               const base::Value& value) {
7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (key == shill::kNameProperty) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return GetStringValue(key, value, &name_);
7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  } else if (key == shill::kTypeProperty) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return GetStringValue(key, value, &type_);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ManagedState::GetBooleanValue(const std::string& key,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const base::Value& value,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   bool* out_value) {
8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool new_value;
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!value.GetAsBoolean(&new_value)) {
8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    NET_LOG_ERROR("Error parsing state value", path() + "." + key);
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return false;
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (*out_value == new_value)
9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return false;
9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  *out_value = new_value;
9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return true;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ManagedState::GetIntegerValue(const std::string& key,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const base::Value& value,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   int* out_value) {
10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  int new_value;
10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!value.GetAsInteger(&new_value)) {
10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    NET_LOG_ERROR("Error parsing state value", path() + "." + key);
10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return false;
10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (*out_value == new_value)
10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return false;
10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  *out_value = new_value;
10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return true;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ManagedState::GetStringValue(const std::string& key,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const base::Value& value,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  std::string* out_value) {
11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::string new_value;
11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!value.GetAsString(&new_value)) {
117effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    NET_LOG_ERROR("Error parsing state: " + key, path());
11890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return false;
11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (*out_value == new_value)
12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return false;
12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  *out_value = new_value;
12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return true;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool ManagedState::GetUInt32Value(const std::string& key,
1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                  const base::Value& value,
1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                  uint32* out_value) {
1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // base::Value restricts the number types to BOOL, INTEGER, and DOUBLE only.
1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // uint32 will automatically get converted to a double, which is why we try
1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // to obtain the value as a double (see dbus/values_util.h).
1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  uint32 new_value;
1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  double double_value;
1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!value.GetAsDouble(&double_value) || double_value < 0) {
1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    NET_LOG_ERROR("Error parsing state value", path() + "." + key);
1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return false;
1377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  new_value = static_cast<uint32>(double_value);
1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (*out_value == new_value)
1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return false;
1417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  *out_value = new_value;
1427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return true;
1437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
146