managed_state.cc revision 010d83a9304c5a91596085d917d248abff47903a
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
3// found in the LICENSE file.
4
5#include "chromeos/network/managed_state.h"
6
7#include "base/logging.h"
8#include "base/values.h"
9#include "chromeos/network/device_state.h"
10#include "chromeos/network/favorite_state.h"
11#include "chromeos/network/network_event_log.h"
12#include "chromeos/network/network_state.h"
13#include "chromeos/network/shill_property_util.h"
14#include "third_party/cros_system_api/dbus/service_constants.h"
15
16namespace chromeos {
17
18bool ManagedState::Matches(const NetworkTypePattern& pattern) const {
19  return pattern.MatchesType(type());
20}
21
22// static
23std::string ManagedState::TypeToString(ManagedType type) {
24  switch (type) {
25    case MANAGED_TYPE_NETWORK:
26      return "Network";
27    case MANAGED_TYPE_FAVORITE:
28      return "Favorite";
29    case MANAGED_TYPE_DEVICE:
30      return "Device";
31  }
32  return "Unknown";
33}
34
35ManagedState::ManagedState(ManagedType type, const std::string& path)
36    : managed_type_(type),
37      path_(path),
38      update_received_(false),
39      update_requested_(false) {
40}
41
42ManagedState::~ManagedState() {
43}
44
45ManagedState* ManagedState::Create(ManagedType type, const std::string& path) {
46  switch (type) {
47    case MANAGED_TYPE_NETWORK:
48      return new NetworkState(path);
49    case MANAGED_TYPE_FAVORITE:
50      return new FavoriteState(path);
51    case MANAGED_TYPE_DEVICE:
52      return new DeviceState(path);
53  }
54  return NULL;
55}
56
57NetworkState* ManagedState::AsNetworkState() {
58  if (managed_type() == MANAGED_TYPE_NETWORK)
59    return static_cast<NetworkState*>(this);
60  return NULL;
61}
62
63DeviceState* ManagedState::AsDeviceState() {
64  if (managed_type() == MANAGED_TYPE_DEVICE)
65    return static_cast<DeviceState*>(this);
66  return NULL;
67}
68
69FavoriteState* ManagedState::AsFavoriteState() {
70  if (managed_type() == MANAGED_TYPE_FAVORITE)
71    return static_cast<FavoriteState*>(this);
72  return NULL;
73}
74
75bool ManagedState::InitialPropertiesReceived(
76    const base::DictionaryValue& properties) {
77  return false;
78}
79
80void ManagedState::GetStateProperties(base::DictionaryValue* dictionary) const {
81  dictionary->SetStringWithoutPathExpansion(shill::kNameProperty, name());
82  dictionary->SetStringWithoutPathExpansion(shill::kTypeProperty, type());
83}
84
85bool ManagedState::ManagedStatePropertyChanged(const std::string& key,
86                                               const base::Value& value) {
87  if (key == shill::kNameProperty) {
88    return GetStringValue(key, value, &name_);
89  } else if (key == shill::kTypeProperty) {
90    return GetStringValue(key, value, &type_);
91  }
92  return false;
93}
94
95bool ManagedState::GetBooleanValue(const std::string& key,
96                                   const base::Value& value,
97                                   bool* out_value) {
98  bool new_value;
99  if (!value.GetAsBoolean(&new_value)) {
100    NET_LOG_ERROR("Error parsing state value", path() + "." + key);
101    return false;
102  }
103  if (*out_value == new_value)
104    return false;
105  *out_value = new_value;
106  return true;
107}
108
109bool ManagedState::GetIntegerValue(const std::string& key,
110                                   const base::Value& value,
111                                   int* out_value) {
112  int new_value;
113  if (!value.GetAsInteger(&new_value)) {
114    NET_LOG_ERROR("Error parsing state value", path() + "." + key);
115    return false;
116  }
117  if (*out_value == new_value)
118    return false;
119  *out_value = new_value;
120  return true;
121}
122
123bool ManagedState::GetStringValue(const std::string& key,
124                                  const base::Value& value,
125                                  std::string* out_value) {
126  std::string new_value;
127  if (!value.GetAsString(&new_value)) {
128    NET_LOG_ERROR("Error parsing state: " + key, path());
129    return false;
130  }
131  if (*out_value == new_value)
132    return false;
133  *out_value = new_value;
134  return true;
135}
136
137bool ManagedState::GetUInt32Value(const std::string& key,
138                                  const base::Value& value,
139                                  uint32* out_value) {
140  // base::Value restricts the number types to BOOL, INTEGER, and DOUBLE only.
141  // uint32 will automatically get converted to a double, which is why we try
142  // to obtain the value as a double (see dbus/values_util.h).
143  uint32 new_value;
144  double double_value;
145  if (!value.GetAsDouble(&double_value) || double_value < 0) {
146    NET_LOG_ERROR("Error parsing state value", path() + "." + key);
147    return false;
148  }
149  new_value = static_cast<uint32>(double_value);
150  if (*out_value == new_value)
151    return false;
152  *out_value = new_value;
153  return true;
154}
155
156}  // namespace chromeos
157