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.
5 #include "chromeos/network/device_state.h"
7 #include "base/logging.h"
8 #include "base/metrics/histogram.h"
9 #include "base/strings/stringprintf.h"
10 #include "base/values.h"
11 #include "third_party/cros_system_api/dbus/service_constants.h"
15 DeviceState::DeviceState(const std::string
& path
)
16 : ManagedState(MANAGED_TYPE_DEVICE
, path
),
17 provider_requires_roaming_(false),
18 support_network_scan_(false),
20 sim_lock_enabled_(false),
22 eap_authentication_completed_(false) {
25 DeviceState::~DeviceState() {
28 bool DeviceState::PropertyChanged(const std::string
& key
,
29 const base::Value
& value
) {
30 // All property values get stored in |properties_|.
31 properties_
.SetWithoutPathExpansion(key
, value
.DeepCopy());
33 if (ManagedStatePropertyChanged(key
, value
))
35 if (key
== shill::kAddressProperty
) {
36 return GetStringValue(key
, value
, &mac_address_
);
37 } else if (key
== shill::kScanningProperty
) {
38 return GetBooleanValue(key
, value
, &scanning_
);
39 } else if (key
== shill::kSupportNetworkScanProperty
) {
40 return GetBooleanValue(key
, value
, &support_network_scan_
);
41 } else if (key
== shill::kProviderRequiresRoamingProperty
) {
42 return GetBooleanValue(key
, value
, &provider_requires_roaming_
);
43 } else if (key
== shill::kHomeProviderProperty
) {
44 const base::DictionaryValue
* dict
= NULL
;
45 if (!value
.GetAsDictionary(&dict
))
47 std::string home_provider_country
;
48 std::string home_provider_name
;
49 dict
->GetStringWithoutPathExpansion(shill::kOperatorCountryKey
,
50 &home_provider_country
);
51 dict
->GetStringWithoutPathExpansion(shill::kOperatorNameKey
,
53 // Set home_provider_id_
54 if (!home_provider_name
.empty() && !home_provider_country
.empty()) {
55 home_provider_id_
= base::StringPrintf(
57 home_provider_name
.c_str(),
58 home_provider_country
.c_str());
60 dict
->GetStringWithoutPathExpansion(shill::kOperatorCodeKey
,
62 LOG(WARNING
) << "Carrier ID not defined, using code instead: "
66 } else if (key
== shill::kTechnologyFamilyProperty
) {
67 return GetStringValue(key
, value
, &technology_family_
);
68 } else if (key
== shill::kCarrierProperty
) {
69 return GetStringValue(key
, value
, &carrier_
);
70 } else if (key
== shill::kFoundNetworksProperty
) {
71 const base::ListValue
* list
= NULL
;
72 if (!value
.GetAsList(&list
))
74 CellularScanResults parsed_results
;
75 if (!network_util::ParseCellularScanResults(*list
, &parsed_results
))
77 scan_results_
.swap(parsed_results
);
79 } else if (key
== shill::kSIMLockStatusProperty
) {
80 const base::DictionaryValue
* dict
= NULL
;
81 if (!value
.GetAsDictionary(&dict
))
84 // Return true if at least one of the property values changed.
85 bool property_changed
= false;
86 const base::Value
* out_value
= NULL
;
87 if (!dict
->GetWithoutPathExpansion(shill::kSIMLockRetriesLeftProperty
,
90 if (GetUInt32Value(shill::kSIMLockRetriesLeftProperty
,
91 *out_value
, &sim_retries_left_
))
92 property_changed
= true;
94 if (!dict
->GetWithoutPathExpansion(shill::kSIMLockTypeProperty
,
97 if (GetStringValue(shill::kSIMLockTypeProperty
,
98 *out_value
, &sim_lock_type_
))
99 property_changed
= true;
101 if (!dict
->GetWithoutPathExpansion(shill::kSIMLockEnabledProperty
,
104 if (GetBooleanValue(shill::kSIMLockEnabledProperty
,
105 *out_value
, &sim_lock_enabled_
))
106 property_changed
= true;
108 return property_changed
;
109 } else if (key
== shill::kMeidProperty
) {
110 return GetStringValue(key
, value
, &meid_
);
111 } else if (key
== shill::kImeiProperty
) {
112 return GetStringValue(key
, value
, &imei_
);
113 } else if (key
== shill::kIccidProperty
) {
114 return GetStringValue(key
, value
, &iccid_
);
115 } else if (key
== shill::kMdnProperty
) {
116 return GetStringValue(key
, value
, &mdn_
);
117 } else if (key
== shill::kSIMPresentProperty
) {
118 return GetBooleanValue(key
, value
, &sim_present_
);
119 } else if (key
== shill::kEapAuthenticationCompletedProperty
) {
120 return GetBooleanValue(key
, value
, &eap_authentication_completed_
);
125 bool DeviceState::InitialPropertiesReceived(
126 const base::DictionaryValue
& properties
) {
129 bool locked
= !sim_lock_type_
.empty();
130 UMA_HISTOGRAM_BOOLEAN("Cellular.SIMLocked", locked
);
135 std::string
DeviceState::GetFormattedMacAddress() const {
136 if (mac_address_
.size() % 2 != 0)
139 for (size_t i
= 0; i
< mac_address_
.size(); ++i
) {
140 if ((i
!= 0) && (i
% 2 == 0))
141 result
.push_back(':');
142 result
.push_back(mac_address_
[i
]);
147 bool DeviceState::IsSimAbsent() const {
148 return technology_family_
== shill::kTechnologyFamilyGsm
&& !sim_present_
;
151 } // namespace chromeos