blob: 2dcf996399803ad10dbd4df0347253037355835f [file] [log] [blame]
Arman Uguray72fab6a2013-01-10 19:32:42 -08001// Copyright (c) 2013 The Chromium OS 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 "shill/cellular_capability_universal_cdma.h"
6
Ben Chana0ddf462014-02-06 11:32:42 -08007#include <base/strings/string_number_conversions.h>
8#include <base/strings/string_util.h>
Alex Vakulenkoa41ab512014-07-23 14:24:23 -07009#include <base/strings/stringprintf.h>
10#include <chromeos/dbus/service_constants.h>
Arman Uguray72fab6a2013-01-10 19:32:42 -080011
Ben Chan539ab022014-02-03 16:34:57 -080012#include "shill/cellular_bearer.h"
Prathmesh Prabhu3b66bb92014-05-22 11:15:25 -070013#include "shill/cellular_service.h"
Arman Uguray72fab6a2013-01-10 19:32:42 -080014#include "shill/dbus_properties_proxy_interface.h"
Arman Uguray0a3e2792013-01-17 16:31:50 -080015#include "shill/error.h"
Arman Uguray72fab6a2013-01-10 19:32:42 -080016#include "shill/logging.h"
Arman Uguray0a3e2792013-01-17 16:31:50 -080017#include "shill/pending_activation_store.h"
Arman Uguray72fab6a2013-01-10 19:32:42 -080018#include "shill/proxy_factory.h"
19
20#ifdef MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN
21#error "Do not include mm-modem.h"
22#endif
23
24using base::UintToString;
25
26using std::string;
27using std::vector;
28
29namespace shill {
30
31namespace {
32
Arman Ugurayc9673062013-05-13 21:21:53 -070033const char kPhoneNumber[] = "#777";
34const char kPropertyConnectNumber[] = "number";
35
Arman Uguray72fab6a2013-01-10 19:32:42 -080036} // namespace
37
Arman Uguray72fab6a2013-01-10 19:32:42 -080038CellularCapabilityUniversalCDMA::CellularCapabilityUniversalCDMA(
39 Cellular *cellular,
40 ProxyFactory *proxy_factory,
41 ModemInfo *modem_info)
Ben Chanf98f00e2014-02-05 14:48:43 -080042 : CellularCapabilityUniversal(cellular, proxy_factory, modem_info),
Arman Uguray0a3e2792013-01-17 16:31:50 -080043 weak_cdma_ptr_factory_(this),
44 activation_state_(MM_MODEM_CDMA_ACTIVATION_STATE_NOT_ACTIVATED),
Arman Uguray72fab6a2013-01-10 19:32:42 -080045 cdma_1x_registration_state_(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN),
46 cdma_evdo_registration_state_(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN),
47 nid_(0),
48 sid_(0) {
49 SLOG(Cellular, 2) << "Cellular capability constructed: Universal CDMA";
Arman Uguray0a3e2792013-01-17 16:31:50 -080050 // TODO(armansito): Update PRL for activation over cellular.
Arman Uguray72fab6a2013-01-10 19:32:42 -080051 // See crbug.com/197330.
52}
53
Ben Chanf98f00e2014-02-05 14:48:43 -080054CellularCapabilityUniversalCDMA::~CellularCapabilityUniversalCDMA() {}
55
Arman Uguray72fab6a2013-01-10 19:32:42 -080056void CellularCapabilityUniversalCDMA::InitProxies() {
57 SLOG(Cellular, 2) << __func__;
58 modem_cdma_proxy_.reset(
59 proxy_factory()->CreateMM1ModemModemCdmaProxy(cellular()->dbus_path(),
60 cellular()->dbus_owner()));
Arman Uguray0a3e2792013-01-17 16:31:50 -080061 modem_cdma_proxy_->set_activation_state_callback(
62 Bind(&CellularCapabilityUniversalCDMA::OnActivationStateChangedSignal,
63 weak_cdma_ptr_factory_.GetWeakPtr()));
Arman Uguray72fab6a2013-01-10 19:32:42 -080064 CellularCapabilityUniversal::InitProxies();
65}
66
67void CellularCapabilityUniversalCDMA::ReleaseProxies() {
68 SLOG(Cellular, 2) << __func__;
69 modem_cdma_proxy_.reset();
70 CellularCapabilityUniversal::ReleaseProxies();
71}
72
Ben Chanf98f00e2014-02-05 14:48:43 -080073void CellularCapabilityUniversalCDMA::Activate(const string &carrier,
74 Error *error,
75 const ResultCallback &callback) {
Arman Uguray0a3e2792013-01-17 16:31:50 -080076 // Currently activation over the cellular network is not supported using
77 // ModemManager-next. Service activation is currently carried through over
78 // non-cellular networks and only the final step of the OTA activation
79 // procedure ("automatic activation") is performed by this class.
Arman Uguray72fab6a2013-01-10 19:32:42 -080080 OnUnsupportedOperation(__func__, error);
81}
82
83void CellularCapabilityUniversalCDMA::CompleteActivation(Error *error) {
Arman Uguray0a3e2792013-01-17 16:31:50 -080084 SLOG(Cellular, 2) << __func__;
85 if (cellular()->state() < Cellular::kStateEnabled) {
86 Error::PopulateAndLog(error, Error::kInvalidArguments,
87 "Unable to activate in state " +
88 Cellular::GetStateString(cellular()->state()));
89 return;
90 }
91 ActivateAutomatic();
Arman Uguray72fab6a2013-01-10 19:32:42 -080092}
93
Arman Uguray0a3e2792013-01-17 16:31:50 -080094void CellularCapabilityUniversalCDMA::ActivateAutomatic() {
Prathmesh Prabhuf2288212014-05-21 19:19:19 -070095 if (!cellular()->serving_operator_info()->IsMobileNetworkOperatorKnown() ||
96 cellular()->serving_operator_info()->activation_code().empty()) {
Arman Uguray0a3e2792013-01-17 16:31:50 -080097 SLOG(Cellular, 2) << "OTA activation cannot be run in the presence of no "
98 << "activation code.";
99 return;
100 }
Prathmesh Prabhuf2288212014-05-21 19:19:19 -0700101
Arman Uguray0a3e2792013-01-17 16:31:50 -0800102 PendingActivationStore::State state =
103 modem_info()->pending_activation_store()->GetActivationState(
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800104 PendingActivationStore::kIdentifierMEID, cellular()->meid());
Arman Uguray0a3e2792013-01-17 16:31:50 -0800105 if (state == PendingActivationStore::kStatePending) {
106 SLOG(Cellular, 2) << "There's already a pending activation. Ignoring.";
107 return;
108 }
109 if (state == PendingActivationStore::kStateActivated) {
110 SLOG(Cellular, 2) << "A call to OTA activation has already completed "
111 << "successfully. Ignoring.";
112 return;
113 }
114
115 // Mark as pending activation, so that shill can recover if anything fails
116 // during OTA activation.
117 modem_info()->pending_activation_store()->SetActivationState(
118 PendingActivationStore::kIdentifierMEID,
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800119 cellular()->meid(),
Arman Uguray0a3e2792013-01-17 16:31:50 -0800120 PendingActivationStore::kStatePending);
121
122 // Initiate OTA activation.
123 ResultCallback activation_callback =
124 Bind(&CellularCapabilityUniversalCDMA::OnActivateReply,
125 weak_cdma_ptr_factory_.GetWeakPtr(),
126 ResultCallback());
Arman Ugurayf2b4a342013-05-23 18:26:52 -0700127
Arman Uguray0a3e2792013-01-17 16:31:50 -0800128 Error error;
129 modem_cdma_proxy_->Activate(
Prathmesh Prabhuf2288212014-05-21 19:19:19 -0700130 cellular()->serving_operator_info()->activation_code(),
131 &error,
132 activation_callback,
133 kTimeoutActivate);
Arman Uguray0a3e2792013-01-17 16:31:50 -0800134}
135
136void CellularCapabilityUniversalCDMA::UpdatePendingActivationState() {
Arman Uguray72fab6a2013-01-10 19:32:42 -0800137 SLOG(Cellular, 2) << __func__;
Arman Uguray0a3e2792013-01-17 16:31:50 -0800138 if (IsActivated()) {
139 SLOG(Cellular, 3) << "CDMA service activated. Clear store.";
140 modem_info()->pending_activation_store()->RemoveEntry(
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800141 PendingActivationStore::kIdentifierMEID, cellular()->meid());
Arman Uguray0a3e2792013-01-17 16:31:50 -0800142 return;
143 }
144 PendingActivationStore::State state =
145 modem_info()->pending_activation_store()->GetActivationState(
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800146 PendingActivationStore::kIdentifierMEID, cellular()->meid());
Arman Uguray0a3e2792013-01-17 16:31:50 -0800147 if (IsActivating() && state != PendingActivationStore::kStateFailureRetry) {
148 SLOG(Cellular, 3) << "OTA activation in progress. Nothing to do.";
149 return;
150 }
151 switch (state) {
152 case PendingActivationStore::kStateFailureRetry:
153 SLOG(Cellular, 3) << "OTA activation failed. Scheduling a retry.";
154 cellular()->dispatcher()->PostTask(
155 Bind(&CellularCapabilityUniversalCDMA::ActivateAutomatic,
156 weak_cdma_ptr_factory_.GetWeakPtr()));
157 break;
158 case PendingActivationStore::kStateActivated:
159 SLOG(Cellular, 3) << "OTA Activation has completed successfully. "
160 << "Waiting for activation state update to finalize.";
161 break;
162 default:
163 break;
164 }
165}
166
167bool CellularCapabilityUniversalCDMA::IsServiceActivationRequired() const {
168 // If there is no online payment portal information, it's safer to assume
169 // the service does not require activation.
Prathmesh Prabhu3ee2f412014-05-20 17:30:19 -0700170 if (!cellular()->serving_operator_info()->IsMobileNetworkOperatorKnown() ||
171 cellular()->serving_operator_info()->olp_list().empty()) {
Arman Uguray0a3e2792013-01-17 16:31:50 -0800172 return false;
Prathmesh Prabhu3ee2f412014-05-20 17:30:19 -0700173 }
Arman Uguray0a3e2792013-01-17 16:31:50 -0800174
175 // We could also use the MDN to determine whether or not the service is
176 // activated, however, the CDMA ActivatonState property is a more absolute
177 // and fine-grained indicator of activation status.
178 return (activation_state_ == MM_MODEM_CDMA_ACTIVATION_STATE_NOT_ACTIVATED);
179}
180
181bool CellularCapabilityUniversalCDMA::IsActivated() const {
182 return (activation_state_ == MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATED);
Arman Uguray72fab6a2013-01-10 19:32:42 -0800183}
184
185void CellularCapabilityUniversalCDMA::OnServiceCreated() {
186 SLOG(Cellular, 2) << __func__;
Thieu Le71f81a62014-07-11 15:17:47 -0700187 cellular()->service()->SetActivationType(
188 CellularService::kActivationTypeOTASP);
Arman Uguray0a3e2792013-01-17 16:31:50 -0800189 UpdateServiceActivationStateProperty();
Arman Uguray0a3e2792013-01-17 16:31:50 -0800190 HandleNewActivationStatus(MM_CDMA_ACTIVATION_ERROR_NONE);
191 UpdatePendingActivationState();
Arman Uguray72fab6a2013-01-10 19:32:42 -0800192}
193
Arman Uguray0a3e2792013-01-17 16:31:50 -0800194void CellularCapabilityUniversalCDMA::UpdateServiceActivationStateProperty() {
195 bool activation_required = IsServiceActivationRequired();
196 cellular()->service()->SetActivateOverNonCellularNetwork(activation_required);
197 string activation_state;
198 if (IsActivating())
Ben Chan7ea768e2013-09-20 15:08:40 -0700199 activation_state = kActivationStateActivating;
Arman Uguray0a3e2792013-01-17 16:31:50 -0800200 else if (activation_required)
Ben Chan7ea768e2013-09-20 15:08:40 -0700201 activation_state = kActivationStateNotActivated;
Arman Uguray0a3e2792013-01-17 16:31:50 -0800202 else
Ben Chan7ea768e2013-09-20 15:08:40 -0700203 activation_state = kActivationStateActivated;
Arman Uguray0a3e2792013-01-17 16:31:50 -0800204 cellular()->service()->SetActivationState(activation_state);
205}
206
Prathmesh Prabhu92df6192014-04-29 18:08:08 -0700207void CellularCapabilityUniversalCDMA::UpdateServiceOLP() {
Ben Chan07193fd2013-07-12 22:10:55 -0700208 SLOG(Cellular, 2) << __func__;
209
Prathmesh Prabhu92df6192014-04-29 18:08:08 -0700210 // In this case, the Home Provider is trivial. All information comes from the
211 // Serving Operator.
212 if (!cellular()->serving_operator_info()->IsMobileNetworkOperatorKnown()) {
Ben Chan07193fd2013-07-12 22:10:55 -0700213 return;
Prathmesh Prabhu92df6192014-04-29 18:08:08 -0700214 }
Ben Chan07193fd2013-07-12 22:10:55 -0700215
Prathmesh Prabhu92df6192014-04-29 18:08:08 -0700216 const vector<MobileOperatorInfo::OnlinePortal> &olp_list =
217 cellular()->serving_operator_info()->olp_list();
218 if (olp_list.empty()) {
Arman Uguray72fab6a2013-01-10 19:32:42 -0800219 return;
Prathmesh Prabhu92df6192014-04-29 18:08:08 -0700220 }
Arman Uguray72fab6a2013-01-10 19:32:42 -0800221
Prathmesh Prabhu92df6192014-04-29 18:08:08 -0700222 if (olp_list.size() > 1) {
223 SLOG(Cellular, 1) << "Found multiple online portals. Choosing the first.";
224 }
225 string post_data = olp_list[0].post_data;
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800226 ReplaceSubstringsAfterOffset(&post_data, 0, "${esn}", cellular()->esn());
Prathmesh Prabhu92df6192014-04-29 18:08:08 -0700227 ReplaceSubstringsAfterOffset(
228 &post_data, 0, "${mdn}",
229 GetMdnForOLP(cellular()->serving_operator_info()));
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800230 ReplaceSubstringsAfterOffset(&post_data, 0, "${meid}", cellular()->meid());
Arman Ugurayf87fa2f2013-10-16 14:24:56 -0700231 ReplaceSubstringsAfterOffset(&post_data, 0, "${oem}", "GOG2");
Prathmesh Prabhu92df6192014-04-29 18:08:08 -0700232 cellular()->service()->SetOLP(olp_list[0].url, olp_list[0].method, post_data);
Arman Uguray72fab6a2013-01-10 19:32:42 -0800233}
234
235void CellularCapabilityUniversalCDMA::GetProperties() {
236 SLOG(Cellular, 2) << __func__;
237 CellularCapabilityUniversal::GetProperties();
238
239 scoped_ptr<DBusPropertiesProxyInterface> properties_proxy(
240 proxy_factory()->CreateDBusPropertiesProxy(cellular()->dbus_path(),
241 cellular()->dbus_owner()));
242 DBusPropertiesMap properties(
243 properties_proxy->GetAll(MM_DBUS_INTERFACE_MODEM_MODEMCDMA));
244 OnModemCDMAPropertiesChanged(properties, vector<string>());
245}
246
Arman Uguray0a3e2792013-01-17 16:31:50 -0800247void CellularCapabilityUniversalCDMA::OnActivationStateChangedSignal(
Ben Chan7fab8972014-08-10 17:14:46 -0700248 uint32_t activation_state,
249 uint32_t activation_error,
Arman Uguray0a3e2792013-01-17 16:31:50 -0800250 const DBusPropertiesMap &status_changes) {
251 SLOG(Cellular, 2) << __func__;
252
253 activation_state_ =
254 static_cast<MMModemCdmaActivationState>(activation_state);
255
256 string value;
257 if (DBusProperties::GetString(status_changes, "mdn", &value))
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800258 cellular()->set_mdn(value);
Arman Uguray0a3e2792013-01-17 16:31:50 -0800259 if (DBusProperties::GetString(status_changes, "min", &value))
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800260 cellular()->set_min(value);
Arman Uguray0a3e2792013-01-17 16:31:50 -0800261
262 SLOG(Cellular, 2) << "Activation state: "
263 << GetActivationStateString(activation_state_);
264
265 HandleNewActivationStatus(activation_error);
266 UpdatePendingActivationState();
267}
268
269void CellularCapabilityUniversalCDMA::OnActivateReply(
270 const ResultCallback &callback,
271 const Error &error) {
272 SLOG(Cellular, 2) << __func__;
273 if (error.IsSuccess()) {
274 LOG(INFO) << "Activation completed successfully.";
275 modem_info()->pending_activation_store()->SetActivationState(
276 PendingActivationStore::kIdentifierMEID,
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800277 cellular()->meid(),
Arman Uguray0a3e2792013-01-17 16:31:50 -0800278 PendingActivationStore::kStateActivated);
279 } else {
280 LOG(ERROR) << "Activation failed with error: " << error;
281 modem_info()->pending_activation_store()->SetActivationState(
282 PendingActivationStore::kIdentifierMEID,
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800283 cellular()->meid(),
Arman Uguray0a3e2792013-01-17 16:31:50 -0800284 PendingActivationStore::kStateFailureRetry);
285 }
286 UpdatePendingActivationState();
Arman Ugurayf2b4a342013-05-23 18:26:52 -0700287
288 // CellularCapabilityUniversalCDMA::ActivateAutomatic passes a dummy
289 // ResultCallback when it calls Activate on the proxy object, in which case
290 // |callback.is_null()| will return true.
291 if (!callback.is_null())
292 callback.Run(error);
Arman Uguray0a3e2792013-01-17 16:31:50 -0800293}
294
Ben Chan7fab8972014-08-10 17:14:46 -0700295void CellularCapabilityUniversalCDMA::HandleNewActivationStatus(
296 uint32_t error) {
Arman Uguray0a3e2792013-01-17 16:31:50 -0800297 SLOG(Cellular, 2) << __func__ << "(" << error << ")";
298 if (!cellular()->service().get()) {
299 LOG(ERROR) << "In " << __func__ << "(): service is null.";
300 return;
301 }
302 SLOG(Cellular, 2) << "Activation State: " << activation_state_;
303 cellular()->service()->SetActivationState(
304 GetActivationStateString(activation_state_));
305 cellular()->service()->set_error(GetActivationErrorString(error));
Prathmesh Prabhu92df6192014-04-29 18:08:08 -0700306 UpdateServiceOLP();
Arman Uguray0a3e2792013-01-17 16:31:50 -0800307}
308
309// static
310string CellularCapabilityUniversalCDMA::GetActivationStateString(
Ben Chan7fab8972014-08-10 17:14:46 -0700311 uint32_t state) {
Arman Uguray0a3e2792013-01-17 16:31:50 -0800312 switch (state) {
313 case MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATED:
Ben Chan7ea768e2013-09-20 15:08:40 -0700314 return kActivationStateActivated;
Arman Uguray0a3e2792013-01-17 16:31:50 -0800315 case MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATING:
Ben Chan7ea768e2013-09-20 15:08:40 -0700316 return kActivationStateActivating;
Arman Uguray0a3e2792013-01-17 16:31:50 -0800317 case MM_MODEM_CDMA_ACTIVATION_STATE_NOT_ACTIVATED:
Ben Chan7ea768e2013-09-20 15:08:40 -0700318 return kActivationStateNotActivated;
Arman Uguray0a3e2792013-01-17 16:31:50 -0800319 case MM_MODEM_CDMA_ACTIVATION_STATE_PARTIALLY_ACTIVATED:
Ben Chan7ea768e2013-09-20 15:08:40 -0700320 return kActivationStatePartiallyActivated;
Arman Uguray0a3e2792013-01-17 16:31:50 -0800321 default:
Ben Chan7ea768e2013-09-20 15:08:40 -0700322 return kActivationStateUnknown;
Arman Uguray0a3e2792013-01-17 16:31:50 -0800323 }
324}
325
326// static
327string CellularCapabilityUniversalCDMA::GetActivationErrorString(
Ben Chan7fab8972014-08-10 17:14:46 -0700328 uint32_t error) {
Arman Uguray0a3e2792013-01-17 16:31:50 -0800329 switch (error) {
330 case MM_CDMA_ACTIVATION_ERROR_WRONG_RADIO_INTERFACE:
Ben Chan7ea768e2013-09-20 15:08:40 -0700331 return kErrorNeedEvdo;
Arman Uguray0a3e2792013-01-17 16:31:50 -0800332 case MM_CDMA_ACTIVATION_ERROR_ROAMING:
Ben Chan7ea768e2013-09-20 15:08:40 -0700333 return kErrorNeedHomeNetwork;
Arman Uguray0a3e2792013-01-17 16:31:50 -0800334 case MM_CDMA_ACTIVATION_ERROR_COULD_NOT_CONNECT:
335 case MM_CDMA_ACTIVATION_ERROR_SECURITY_AUTHENTICATION_FAILED:
336 case MM_CDMA_ACTIVATION_ERROR_PROVISIONING_FAILED:
Ben Chan7ea768e2013-09-20 15:08:40 -0700337 return kErrorOtaspFailed;
Arman Uguray0a3e2792013-01-17 16:31:50 -0800338 case MM_CDMA_ACTIVATION_ERROR_NONE:
339 return "";
340 case MM_CDMA_ACTIVATION_ERROR_NO_SIGNAL:
341 default:
Ben Chan7ea768e2013-09-20 15:08:40 -0700342 return kErrorActivationFailed;
Arman Uguray0a3e2792013-01-17 16:31:50 -0800343 }
344}
345
Arman Uguray72fab6a2013-01-10 19:32:42 -0800346void CellularCapabilityUniversalCDMA::Register(const ResultCallback &callback) {
347 // TODO(armansito): Remove once 3GPP is implemented in its own class.
348}
349
350void CellularCapabilityUniversalCDMA::RegisterOnNetwork(
351 const string &network_id,
352 Error *error,
353 const ResultCallback &callback) {
354 // TODO(armansito): Remove once 3GPP is implemented in its own class.
355}
356
Arman Uguray0a3e2792013-01-17 16:31:50 -0800357bool CellularCapabilityUniversalCDMA::IsActivating() const {
358 PendingActivationStore::State state =
359 modem_info()->pending_activation_store()->GetActivationState(
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800360 PendingActivationStore::kIdentifierMEID, cellular()->meid());
Arman Uguray0a3e2792013-01-17 16:31:50 -0800361 return (state == PendingActivationStore::kStatePending) ||
362 (state == PendingActivationStore::kStateFailureRetry) ||
363 (activation_state_ == MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATING);
364}
365
Ben Chan31ce5642013-11-14 13:37:40 -0800366bool CellularCapabilityUniversalCDMA::IsRegistered() const {
Ben Chanb2c4a802013-11-14 12:47:52 -0800367 return (cdma_1x_registration_state_ !=
368 MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN ||
369 cdma_evdo_registration_state_ !=
370 MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN);
Arman Uguray72fab6a2013-01-10 19:32:42 -0800371}
372
373void CellularCapabilityUniversalCDMA::SetUnregistered(bool /*searching*/) {
374 cdma_1x_registration_state_ = MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN;
375 cdma_evdo_registration_state_ = MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN;
376}
377
Arman Ugurayc9673062013-05-13 21:21:53 -0700378void CellularCapabilityUniversalCDMA::SetupConnectProperties(
379 DBusPropertiesMap *properties) {
380 (*properties)[kPropertyConnectNumber].writer().append_string(
381 kPhoneNumber);
382}
383
Arman Uguray72fab6a2013-01-10 19:32:42 -0800384void CellularCapabilityUniversalCDMA::RequirePIN(
385 const string &pin, bool require,
386 Error *error, const ResultCallback &callback) {
387 // TODO(armansito): Remove once 3GPP is implemented in its own class.
388}
389
390void CellularCapabilityUniversalCDMA::EnterPIN(
391 const string &pin,
392 Error *error,
393 const ResultCallback &callback) {
394 // TODO(armansito): Remove once 3GPP is implemented in its own class.
395}
396
397void CellularCapabilityUniversalCDMA::UnblockPIN(
398 const string &unblock_code,
399 const string &pin,
400 Error *error,
401 const ResultCallback &callback) {
402 // TODO(armansito): Remove once 3GPP is implemented in its own class.
403}
404
405void CellularCapabilityUniversalCDMA::ChangePIN(
406 const string &old_pin, const string &new_pin,
407 Error *error, const ResultCallback &callback) {
408 // TODO(armansito): Remove once 3GPP is implemented in its own class.
409}
410
Prathmesh Prabhu49ffffd2014-01-09 18:28:55 -0800411void CellularCapabilityUniversalCDMA::Scan(
412 Error *error,
413 const ResultStringmapsCallback &callback) {
Arman Uguray72fab6a2013-01-10 19:32:42 -0800414 // TODO(armansito): Remove once 3GPP is implemented in its own class.
Prathmesh Prabhu49ffffd2014-01-09 18:28:55 -0800415 OnUnsupportedOperation(__func__, error);
Arman Uguray72fab6a2013-01-10 19:32:42 -0800416}
417
418void CellularCapabilityUniversalCDMA::OnSimPathChanged(
419 const string &sim_path) {
420 // TODO(armansito): Remove once 3GPP is implemented in its own class.
421}
422
423string CellularCapabilityUniversalCDMA::GetRoamingStateString() const {
Ben Chan7fab8972014-08-10 17:14:46 -0700424 uint32_t state = cdma_evdo_registration_state_;
Arman Uguray72fab6a2013-01-10 19:32:42 -0800425 if (state == MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN) {
426 state = cdma_1x_registration_state_;
427 }
428 switch (state) {
429 case MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN:
430 case MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED:
431 break;
432 case MM_MODEM_CDMA_REGISTRATION_STATE_HOME:
Ben Chan7ea768e2013-09-20 15:08:40 -0700433 return kRoamingStateHome;
Arman Uguray72fab6a2013-01-10 19:32:42 -0800434 case MM_MODEM_CDMA_REGISTRATION_STATE_ROAMING:
Ben Chan7ea768e2013-09-20 15:08:40 -0700435 return kRoamingStateRoaming;
Arman Uguray72fab6a2013-01-10 19:32:42 -0800436 default:
437 NOTREACHED();
438 }
Ben Chan7ea768e2013-09-20 15:08:40 -0700439 return kRoamingStateUnknown;
Arman Uguray72fab6a2013-01-10 19:32:42 -0800440}
441
442void CellularCapabilityUniversalCDMA::OnDBusPropertiesChanged(
443 const string &interface,
444 const DBusPropertiesMap &changed_properties,
445 const vector<string> &invalidated_properties) {
446 SLOG(Cellular, 2) << __func__ << "(" << interface << ")";
447 if (interface == MM_DBUS_INTERFACE_MODEM_MODEMCDMA) {
448 OnModemCDMAPropertiesChanged(changed_properties, invalidated_properties);
449 } else {
450 CellularCapabilityUniversal::OnDBusPropertiesChanged(
451 interface, changed_properties, invalidated_properties);
452 }
453}
454
455void CellularCapabilityUniversalCDMA::OnModemCDMAPropertiesChanged(
456 const DBusPropertiesMap &properties,
457 const std::vector<std::string> &/*invalidated_properties*/) {
458 SLOG(Cellular, 2) << __func__;
459 string str_value;
460 if (DBusProperties::GetString(properties,
461 MM_MODEM_MODEMCDMA_PROPERTY_MEID,
462 &str_value))
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800463 cellular()->set_meid(str_value);
Arman Uguray72fab6a2013-01-10 19:32:42 -0800464 if (DBusProperties::GetString(properties,
465 MM_MODEM_MODEMCDMA_PROPERTY_ESN,
466 &str_value))
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800467 cellular()->set_esn(str_value);
Arman Uguray72fab6a2013-01-10 19:32:42 -0800468
469 uint32_t sid = sid_;
470 uint32_t nid = nid_;
471 MMModemCdmaRegistrationState state_1x = cdma_1x_registration_state_;
472 MMModemCdmaRegistrationState state_evdo = cdma_evdo_registration_state_;
473 bool registration_changed = false;
474 uint32_t uint_value;
475 if (DBusProperties::GetUint32(
476 properties,
477 MM_MODEM_MODEMCDMA_PROPERTY_CDMA1XREGISTRATIONSTATE,
478 &uint_value)) {
479 state_1x = static_cast<MMModemCdmaRegistrationState>(uint_value);
480 registration_changed = true;
481 }
482 if (DBusProperties::GetUint32(
483 properties,
484 MM_MODEM_MODEMCDMA_PROPERTY_EVDOREGISTRATIONSTATE,
485 &uint_value)) {
486 state_evdo = static_cast<MMModemCdmaRegistrationState>(uint_value);
487 registration_changed = true;
488 }
489 if (DBusProperties::GetUint32(
490 properties,
491 MM_MODEM_MODEMCDMA_PROPERTY_SID,
492 &uint_value)) {
493 sid = uint_value;
494 registration_changed = true;
495 }
496 if (DBusProperties::GetUint32(
497 properties,
498 MM_MODEM_MODEMCDMA_PROPERTY_NID,
499 &uint_value)) {
500 nid = uint_value;
501 registration_changed = true;
502 }
Arman Uguray0a3e2792013-01-17 16:31:50 -0800503 if (DBusProperties::GetUint32(
504 properties,
505 MM_MODEM_MODEMCDMA_PROPERTY_ACTIVATIONSTATE,
506 &uint_value)) {
507 activation_state_ = static_cast<MMModemCdmaActivationState>(uint_value);
508 HandleNewActivationStatus(MM_CDMA_ACTIVATION_ERROR_NONE);
509 }
Arman Uguray72fab6a2013-01-10 19:32:42 -0800510 if (registration_changed)
511 OnCDMARegistrationChanged(state_1x, state_evdo, sid, nid);
512}
513
514void CellularCapabilityUniversalCDMA::OnCDMARegistrationChanged(
515 MMModemCdmaRegistrationState state_1x,
516 MMModemCdmaRegistrationState state_evdo,
517 uint32_t sid, uint32_t nid) {
518 SLOG(Cellular, 2) << __func__
519 << ": state_1x=" << state_1x
520 << ", state_evdo=" << state_evdo;
521 cdma_1x_registration_state_ = state_1x;
522 cdma_evdo_registration_state_ = state_evdo;
523 sid_ = sid;
524 nid_ = nid;
Prathmesh Prabhu8599e052014-04-25 14:20:22 -0700525 cellular()->serving_operator_info()->UpdateSID(UintToString(sid));
526 cellular()->serving_operator_info()->UpdateNID(UintToString(nid));
Arman Uguray72fab6a2013-01-10 19:32:42 -0800527 cellular()->HandleNewRegistrationState();
528}
529
530} // namespace shill