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