• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/device_state.h"
6 
7 #include "base/logging.h"
8 #include "base/metrics/histogram.h"
9 #include "base/strings/stringprintf.h"
10 #include "base/values.h"
11 #include "chromeos/network/network_event_log.h"
12 #include "chromeos/network/shill_property_util.h"
13 #include "third_party/cros_system_api/dbus/service_constants.h"
14 
15 namespace chromeos {
16 
DeviceState(const std::string & path)17 DeviceState::DeviceState(const std::string& path)
18     : ManagedState(MANAGED_TYPE_DEVICE, path),
19       allow_roaming_(false),
20       provider_requires_roaming_(false),
21       support_network_scan_(false),
22       scanning_(false),
23       sim_retries_left_(0),
24       sim_lock_enabled_(false),
25       sim_present_(true),
26       eap_authentication_completed_(false) {
27 }
28 
~DeviceState()29 DeviceState::~DeviceState() {
30 }
31 
PropertyChanged(const std::string & key,const base::Value & value)32 bool DeviceState::PropertyChanged(const std::string& key,
33                                   const base::Value& value) {
34   // All property values get stored in |properties_|.
35   properties_.SetWithoutPathExpansion(key, value.DeepCopy());
36 
37   if (ManagedStatePropertyChanged(key, value))
38     return true;
39   if (key == shill::kAddressProperty) {
40     return GetStringValue(key, value, &mac_address_);
41   } else if (key == shill::kScanningProperty) {
42     return GetBooleanValue(key, value, &scanning_);
43   } else if (key == shill::kSupportNetworkScanProperty) {
44     return GetBooleanValue(key, value, &support_network_scan_);
45   } else if (key == shill::kCellularAllowRoamingProperty) {
46     return GetBooleanValue(key, value, &allow_roaming_);
47   } else if (key == shill::kProviderRequiresRoamingProperty) {
48     return GetBooleanValue(key, value, &provider_requires_roaming_);
49   } else if (key == shill::kHomeProviderProperty) {
50     return shill_property_util::GetHomeProviderFromProperty(
51         value, &home_provider_id_);
52   } else if (key == shill::kTechnologyFamilyProperty) {
53     return GetStringValue(key, value, &technology_family_);
54   } else if (key == shill::kCarrierProperty) {
55     return GetStringValue(key, value, &carrier_);
56   } else if (key == shill::kFoundNetworksProperty) {
57     const base::ListValue* list = NULL;
58     if (!value.GetAsList(&list))
59       return false;
60     CellularScanResults parsed_results;
61     if (!network_util::ParseCellularScanResults(*list, &parsed_results))
62       return false;
63     scan_results_.swap(parsed_results);
64     return true;
65   } else if (key == shill::kSIMLockStatusProperty) {
66     const base::DictionaryValue* dict = NULL;
67     if (!value.GetAsDictionary(&dict))
68       return false;
69 
70     // Return true if at least one of the property values changed.
71     bool property_changed = false;
72     const base::Value* out_value = NULL;
73     if (!dict->GetWithoutPathExpansion(shill::kSIMLockRetriesLeftProperty,
74                                        &out_value))
75       return false;
76     if (GetUInt32Value(shill::kSIMLockRetriesLeftProperty,
77                        *out_value, &sim_retries_left_))
78       property_changed = true;
79 
80     if (!dict->GetWithoutPathExpansion(shill::kSIMLockTypeProperty,
81                                        &out_value))
82       return false;
83     if (GetStringValue(shill::kSIMLockTypeProperty,
84                        *out_value, &sim_lock_type_))
85       property_changed = true;
86 
87     if (!dict->GetWithoutPathExpansion(shill::kSIMLockEnabledProperty,
88                                        &out_value))
89       return false;
90     if (GetBooleanValue(shill::kSIMLockEnabledProperty,
91                         *out_value, &sim_lock_enabled_))
92       property_changed = true;
93 
94     return property_changed;
95   } else if (key == shill::kMeidProperty) {
96     return GetStringValue(key, value, &meid_);
97   } else if (key == shill::kImeiProperty) {
98     return GetStringValue(key, value, &imei_);
99   } else if (key == shill::kIccidProperty) {
100     return GetStringValue(key, value, &iccid_);
101   } else if (key == shill::kMdnProperty) {
102     return GetStringValue(key, value, &mdn_);
103   } else if (key == shill::kSIMPresentProperty) {
104     return GetBooleanValue(key, value, &sim_present_);
105   } else if (key == shill::kEapAuthenticationCompletedProperty) {
106     return GetBooleanValue(key, value, &eap_authentication_completed_);
107   } else if (key == shill::kIPConfigsProperty) {
108     // If kIPConfigsProperty changes, clear any previous ip_configs_.
109     // ShillPropertyhandler will request the IPConfig objects which will trigger
110     // calls to IPConfigPropertiesChanged.
111     ip_configs_.Clear();
112     return false;  // No actual state change.
113   }
114   return false;
115 }
116 
InitialPropertiesReceived(const base::DictionaryValue & properties)117 bool DeviceState::InitialPropertiesReceived(
118     const base::DictionaryValue& properties) {
119   // Update UMA stats.
120   if (sim_present_) {
121     bool locked = !sim_lock_type_.empty();
122     UMA_HISTOGRAM_BOOLEAN("Cellular.SIMLocked", locked);
123   }
124   return false;
125 }
126 
IPConfigPropertiesChanged(const std::string & ip_config_path,const base::DictionaryValue & properties)127 void DeviceState::IPConfigPropertiesChanged(
128     const std::string& ip_config_path,
129     const base::DictionaryValue& properties) {
130   base::DictionaryValue* ip_config = NULL;
131   if (ip_configs_.GetDictionaryWithoutPathExpansion(
132           ip_config_path, &ip_config)) {
133     NET_LOG_EVENT("IPConfig Updated: " + ip_config_path, path());
134     ip_config->Clear();
135   } else {
136     NET_LOG_EVENT("IPConfig Added: " + ip_config_path, path());
137     ip_config = new base::DictionaryValue;
138     ip_configs_.SetWithoutPathExpansion(ip_config_path, ip_config);
139   }
140   ip_config->MergeDictionary(&properties);
141 }
142 
IsSimAbsent() const143 bool DeviceState::IsSimAbsent() const {
144   return technology_family_ == shill::kTechnologyFamilyGsm && !sim_present_;
145 }
146 
147 }  // namespace chromeos
148