blob: d07b785d5db6500e22e4581281f98bc996d552b5 [file] [log] [blame]
Darin Petkovac635a82012-01-10 16:51:58 +01001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Darin Petkovdaf43862011-10-27 11:37:28 +02002// 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_cdma.h"
6
Jason Glasgow4c0724a2012-04-17 15:47:40 -04007#include <string>
8#include <vector>
9
Eric Shienbrood3e20a232012-02-16 11:35:56 -050010#include <base/bind.h>
Ben Chana0ddf462014-02-06 11:32:42 -080011#include <base/strings/stringprintf.h>
Darin Petkov20c13ec2011-11-09 15:07:15 +010012#include <chromeos/dbus/service_constants.h>
13#include <mm/mm-modem.h>
Darin Petkovdaf43862011-10-27 11:37:28 +020014
15#include "shill/cellular.h"
Darin Petkov184c54e2011-11-15 12:44:39 +010016#include "shill/cellular_service.h"
Christopher Wileyb691efd2012-08-09 13:51:51 -070017#include "shill/logging.h"
Darin Petkovdaf43862011-10-27 11:37:28 +020018#include "shill/proxy_factory.h"
19
Eric Shienbrood3e20a232012-02-16 11:35:56 -050020using base::Bind;
Darin Petkov20c13ec2011-11-09 15:07:15 +010021using std::string;
Jason Glasgow4c0724a2012-04-17 15:47:40 -040022using std::vector;
Darin Petkov20c13ec2011-11-09 15:07:15 +010023
Darin Petkovdaf43862011-10-27 11:37:28 +020024namespace shill {
25
Darin Petkovac635a82012-01-10 16:51:58 +010026// static
Darin Petkovae0c64e2011-11-15 15:50:27 +010027const char CellularCapabilityCDMA::kPhoneNumber[] = "#777";
28
Eric Shienbrood5de44ab2011-12-05 10:46:27 -050029CellularCapabilityCDMA::CellularCapabilityCDMA(Cellular *cellular,
Thieu Lece4483e2013-01-23 15:12:03 -080030 ProxyFactory *proxy_factory,
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070031 ModemInfo *modem_info)
32 : CellularCapabilityClassic(cellular, proxy_factory, modem_info),
Eric Shienbrood3e20a232012-02-16 11:35:56 -050033 weak_ptr_factory_(this),
Christopher Wiley1582bdd2012-11-15 11:31:14 -080034 activation_starting_(false),
Darin Petkovae0c64e2011-11-15 15:50:27 +010035 activation_state_(MM_MODEM_CDMA_ACTIVATION_STATE_NOT_ACTIVATED),
Darin Petkov184c54e2011-11-15 12:44:39 +010036 registration_state_evdo_(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN),
Prathmesh Prabhu700ff4d2014-01-16 15:59:33 -080037 registration_state_1x_(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN) {
Ben Chanfad4a0b2012-04-18 15:49:59 -070038 SLOG(Cellular, 2) << "Cellular capability constructed: CDMA";
Darin Petkovae0c64e2011-11-15 15:50:27 +010039}
Darin Petkovdaf43862011-10-27 11:37:28 +020040
Ben Chanf98f00e2014-02-05 14:48:43 -080041CellularCapabilityCDMA::~CellularCapabilityCDMA() {}
42
Eric Shienbrood9a245532012-03-07 14:20:39 -050043void CellularCapabilityCDMA::InitProxies() {
Jason Glasgow82f9ab32012-04-04 14:27:19 -040044 CellularCapabilityClassic::InitProxies();
Darin Petkov184c54e2011-11-15 12:44:39 +010045 proxy_.reset(proxy_factory()->CreateModemCDMAProxy(
Eric Shienbrood9a245532012-03-07 14:20:39 -050046 cellular()->dbus_path(), cellular()->dbus_owner()));
47 proxy_->set_signal_quality_callback(
48 Bind(&CellularCapabilityCDMA::OnSignalQualitySignal,
49 weak_ptr_factory_.GetWeakPtr()));
50 proxy_->set_activation_state_callback(
51 Bind(&CellularCapabilityCDMA::OnActivationStateChangedSignal,
52 weak_ptr_factory_.GetWeakPtr()));
53 proxy_->set_registration_state_callback(
54 Bind(&CellularCapabilityCDMA::OnRegistrationStateChangedSignal,
55 weak_ptr_factory_.GetWeakPtr()));
Darin Petkovdaf43862011-10-27 11:37:28 +020056}
57
Ben Chanf98f00e2014-02-05 14:48:43 -080058string CellularCapabilityCDMA::GetTypeString() const {
59 return kTechnologyFamilyCdma;
60}
61
Eric Shienbrood9a245532012-03-07 14:20:39 -050062void CellularCapabilityCDMA::StartModem(Error *error,
63 const ResultCallback &callback) {
Ben Chanfad4a0b2012-04-18 15:49:59 -070064 SLOG(Cellular, 2) << __func__;
Eric Shienbrood9a245532012-03-07 14:20:39 -050065 InitProxies();
66
67 CellularTaskList *tasks = new CellularTaskList();
68 ResultCallback cb =
69 Bind(&CellularCapabilityCDMA::StepCompletedCallback,
Thieu Le923006b2012-04-05 16:32:58 -070070 weak_ptr_factory_.GetWeakPtr(), callback, false, tasks);
Eric Shienbrood7fce52c2012-04-13 19:11:02 -040071 if (!cellular()->IsUnderlyingDeviceEnabled())
72 tasks->push_back(Bind(&CellularCapabilityCDMA::EnableModem,
73 weak_ptr_factory_.GetWeakPtr(), cb));
Eric Shienbrood9a245532012-03-07 14:20:39 -050074 tasks->push_back(Bind(&CellularCapabilityCDMA::GetModemStatus,
75 weak_ptr_factory_.GetWeakPtr(), cb));
76 tasks->push_back(Bind(&CellularCapabilityCDMA::GetMEID,
77 weak_ptr_factory_.GetWeakPtr(), cb));
78 tasks->push_back(Bind(&CellularCapabilityCDMA::GetModemInfo,
79 weak_ptr_factory_.GetWeakPtr(), cb));
80 tasks->push_back(Bind(&CellularCapabilityCDMA::FinishEnable,
81 weak_ptr_factory_.GetWeakPtr(), cb));
82
83 RunNextStep(tasks);
84}
85
Eric Shienbrood9a245532012-03-07 14:20:39 -050086void CellularCapabilityCDMA::ReleaseProxies() {
Jason Glasgow82f9ab32012-04-04 14:27:19 -040087 CellularCapabilityClassic::ReleaseProxies();
Darin Petkov721ac932011-11-16 15:43:09 +010088 proxy_.reset();
89}
90
Jason Glasgow82f9ab32012-04-04 14:27:19 -040091bool CellularCapabilityCDMA::AllowRoaming() {
92 return allow_roaming_property();
93}
94
95
Darin Petkov5f316f62011-11-18 12:10:26 +010096void CellularCapabilityCDMA::OnServiceCreated() {
Ben Chanfad4a0b2012-04-18 15:49:59 -070097 SLOG(Cellular, 2) << __func__;
Darin Petkov381928f2012-02-02 23:00:12 +010098 cellular()->service()->SetUsageURL(usage_url_);
Darin Petkov5f316f62011-11-18 12:10:26 +010099 HandleNewActivationState(MM_MODEM_CDMA_ACTIVATION_ERROR_NO_ERROR);
100}
101
Darin Petkovae0c64e2011-11-15 15:50:27 +0100102void CellularCapabilityCDMA::UpdateStatus(const DBusPropertiesMap &properties) {
103 string carrier;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100104 DBusProperties::GetUint32(
105 properties, "activation_state", &activation_state_);
Darin Petkov5f316f62011-11-18 12:10:26 +0100106 // TODO(petkov): For now, get the payment and usage URLs from ModemManager to
107 // match flimflam. In the future, get these from an alternative source (e.g.,
108 // database, carrier-specific properties, etc.).
Prathmesh Prabhu92df6192014-04-29 18:08:08 -0700109 UpdateOnlinePortal(properties);
Ben Chan7fab8972014-08-10 17:14:46 -0700110 uint16_t prl_version;
Prathmesh Prabhu92df6192014-04-29 18:08:08 -0700111 if (DBusProperties::GetUint16(properties, "prl_version", &prl_version))
112 cellular()->set_prl_version(prl_version);
113}
114
115void CellularCapabilityCDMA::UpdateServiceOLP() {
116 SLOG(Cellular, 3) << __func__;
117 // All OLP changes are routed up to the Home Provider.
118 if (!cellular()->home_provider_info()->IsMobileNetworkOperatorKnown()) {
119 return;
Darin Petkov381928f2012-02-02 23:00:12 +0100120 }
Prathmesh Prabhu92df6192014-04-29 18:08:08 -0700121
122 const vector<MobileOperatorInfo::OnlinePortal> &olp_list =
123 cellular()->home_provider_info()->olp_list();
124 if (olp_list.empty()) {
125 return;
Darin Petkov381928f2012-02-02 23:00:12 +0100126 }
Prathmesh Prabhu92df6192014-04-29 18:08:08 -0700127
128 if (olp_list.size() > 1) {
129 SLOG(Cellular, 1) << "Found multiple online portals. Choosing the first.";
Darin Petkov381928f2012-02-02 23:00:12 +0100130 }
Prathmesh Prabhu92df6192014-04-29 18:08:08 -0700131 cellular()->service()->SetOLP(olp_list[0].url,
132 olp_list[0].method,
133 olp_list[0].post_data);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100134}
135
136void CellularCapabilityCDMA::SetupConnectProperties(
137 DBusPropertiesMap *properties) {
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500138 (*properties)[kConnectPropertyPhoneNumber].writer().append_string(
Darin Petkovae0c64e2011-11-15 15:50:27 +0100139 kPhoneNumber);
140}
141
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500142void CellularCapabilityCDMA::Activate(const string &carrier,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500143 Error *error,
144 const ResultCallback &callback) {
Ben Chanfad4a0b2012-04-18 15:49:59 -0700145 SLOG(Cellular, 2) << __func__ << "(" << carrier << ")";
Christopher Wiley1582bdd2012-11-15 11:31:14 -0800146 // We're going to trigger something which leads to an activation.
147 activation_starting_ = true;
Christopher Wiley7d0953e2012-11-16 00:37:10 -0800148 if (cellular()->state() == Cellular::kStateEnabled ||
149 cellular()->state() == Cellular::kStateRegistered) {
Christopher Wiley8a468902012-11-30 11:52:38 -0800150 ActivationResultCallback activation_callback =
Christopher Wiley7d0953e2012-11-16 00:37:10 -0800151 Bind(&CellularCapabilityCDMA::OnActivateReply,
152 weak_ptr_factory_.GetWeakPtr(),
153 callback);
Christopher Wiley8a468902012-11-30 11:52:38 -0800154 proxy_->Activate(carrier, error, activation_callback, kTimeoutActivate);
Christopher Wiley7d0953e2012-11-16 00:37:10 -0800155 } else if (cellular()->state() == Cellular::kStateConnected ||
156 cellular()->state() == Cellular::kStateLinked) {
Christopher Wiley8a468902012-11-30 11:52:38 -0800157 pending_activation_callback_ = callback;
158 pending_activation_carrier_ = carrier;
Samuel Tan0d061192014-07-07 15:45:15 -0700159 cellular()->Disconnect(error, __func__);
Christopher Wiley7d0953e2012-11-16 00:37:10 -0800160 } else {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500161 Error::PopulateAndLog(error, Error::kInvalidArguments,
Darin Petkova3d3be52011-11-14 21:34:16 +0100162 "Unable to activate in " +
163 Cellular::GetStateString(cellular()->state()));
Christopher Wiley1582bdd2012-11-15 11:31:14 -0800164 activation_starting_ = false;
Darin Petkova3d3be52011-11-14 21:34:16 +0100165 }
Darin Petkovae0c64e2011-11-15 15:50:27 +0100166}
167
Ben Chan7fab8972014-08-10 17:14:46 -0700168void CellularCapabilityCDMA::HandleNewActivationState(uint32_t error) {
Christopher Wiley8a468902012-11-30 11:52:38 -0800169 SLOG(Cellular, 2) << __func__ << "(" << error << ")";
Darin Petkovae0c64e2011-11-15 15:50:27 +0100170 if (!cellular()->service().get()) {
Christopher Wiley7d0953e2012-11-16 00:37:10 -0800171 LOG(ERROR) << "In " << __func__ << "(): service is null.";
Darin Petkovae0c64e2011-11-15 15:50:27 +0100172 return;
173 }
Darin Petkovb9c99332012-01-12 13:13:00 +0100174 cellular()->service()->SetActivationState(
Darin Petkovae0c64e2011-11-15 15:50:27 +0100175 GetActivationStateString(activation_state_));
176 cellular()->service()->set_error(GetActivationErrorString(error));
177}
178
Christopher Wiley8a468902012-11-30 11:52:38 -0800179void CellularCapabilityCDMA::DisconnectCleanup() {
180 CellularCapabilityClassic::DisconnectCleanup();
181 if (pending_activation_callback_.is_null()) {
182 return;
183 }
184 if (cellular()->state() == Cellular::kStateEnabled ||
185 cellular()->state() == Cellular::kStateRegistered) {
186 Error ignored_error;
187 Activate(pending_activation_carrier_,
188 &ignored_error,
189 pending_activation_callback_);
190 } else {
191 Error error;
192 Error::PopulateAndLog(
193 &error,
194 Error::kOperationFailed,
195 "Tried to disconnect before activating cellular service and failed");
196 HandleNewActivationState(MM_MODEM_CDMA_ACTIVATION_ERROR_UNKNOWN);
197 activation_starting_ = false;
198 pending_activation_callback_.Run(error);
199 }
200 pending_activation_callback_.Reset();
201 pending_activation_carrier_.clear();
202}
203
Darin Petkovae0c64e2011-11-15 15:50:27 +0100204// static
Ben Chan7fab8972014-08-10 17:14:46 -0700205string CellularCapabilityCDMA::GetActivationStateString(uint32_t state) {
Darin Petkovae0c64e2011-11-15 15:50:27 +0100206 switch (state) {
207 case MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATED:
Ben Chan7ea768e2013-09-20 15:08:40 -0700208 return kActivationStateActivated;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100209 case MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATING:
Ben Chan7ea768e2013-09-20 15:08:40 -0700210 return kActivationStateActivating;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100211 case MM_MODEM_CDMA_ACTIVATION_STATE_NOT_ACTIVATED:
Ben Chan7ea768e2013-09-20 15:08:40 -0700212 return kActivationStateNotActivated;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100213 case MM_MODEM_CDMA_ACTIVATION_STATE_PARTIALLY_ACTIVATED:
Ben Chan7ea768e2013-09-20 15:08:40 -0700214 return kActivationStatePartiallyActivated;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100215 default:
Ben Chan7ea768e2013-09-20 15:08:40 -0700216 return kActivationStateUnknown;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100217 }
218}
219
220// static
Ben Chan7fab8972014-08-10 17:14:46 -0700221string CellularCapabilityCDMA::GetActivationErrorString(uint32_t error) {
Darin Petkovae0c64e2011-11-15 15:50:27 +0100222 switch (error) {
223 case MM_MODEM_CDMA_ACTIVATION_ERROR_WRONG_RADIO_INTERFACE:
Ben Chan7ea768e2013-09-20 15:08:40 -0700224 return kErrorNeedEvdo;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100225 case MM_MODEM_CDMA_ACTIVATION_ERROR_ROAMING:
Ben Chan7ea768e2013-09-20 15:08:40 -0700226 return kErrorNeedHomeNetwork;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100227 case MM_MODEM_CDMA_ACTIVATION_ERROR_COULD_NOT_CONNECT:
228 case MM_MODEM_CDMA_ACTIVATION_ERROR_SECURITY_AUTHENTICATION_FAILED:
229 case MM_MODEM_CDMA_ACTIVATION_ERROR_PROVISIONING_FAILED:
Ben Chan7ea768e2013-09-20 15:08:40 -0700230 return kErrorOtaspFailed;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100231 case MM_MODEM_CDMA_ACTIVATION_ERROR_NO_ERROR:
232 return "";
233 case MM_MODEM_CDMA_ACTIVATION_ERROR_NO_SIGNAL:
234 default:
Ben Chan7ea768e2013-09-20 15:08:40 -0700235 return kErrorActivationFailed;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100236 }
Darin Petkova3d3be52011-11-14 21:34:16 +0100237}
238
Eric Shienbrood9a245532012-03-07 14:20:39 -0500239void CellularCapabilityCDMA::GetMEID(const ResultCallback &callback) {
Ben Chanfad4a0b2012-04-18 15:49:59 -0700240 SLOG(Cellular, 2) << __func__;
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800241 if (cellular()->meid().empty()) {
Paul Stewartee6b3d72013-07-12 16:07:51 -0700242 // TODO(petkov): Switch to asynchronous calls (crbug.com/200687).
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800243 cellular()->set_meid(proxy_->MEID());
244 SLOG(Cellular, 2) << "MEID: " << cellular()->meid();
Darin Petkovcb547732011-11-09 13:55:26 +0100245 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500246 callback.Run(Error());
Darin Petkovcb547732011-11-09 13:55:26 +0100247}
248
Eric Shienbrood9a245532012-03-07 14:20:39 -0500249void CellularCapabilityCDMA::GetProperties(const ResultCallback &callback) {
Ben Chanfad4a0b2012-04-18 15:49:59 -0700250 SLOG(Cellular, 2) << __func__;
Darin Petkov184c54e2011-11-15 12:44:39 +0100251 // No properties.
Eric Shienbrood9a245532012-03-07 14:20:39 -0500252 callback.Run(Error());
Darin Petkov184c54e2011-11-15 12:44:39 +0100253}
254
Christopher Wiley1582bdd2012-11-15 11:31:14 -0800255bool CellularCapabilityCDMA::IsActivating() const {
256 return activation_starting_ ||
257 activation_state_ == MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATING;
258}
259
Ben Chan31ce5642013-11-14 13:37:40 -0800260bool CellularCapabilityCDMA::IsRegistered() const {
Darin Petkovb72cf402011-11-22 14:51:39 +0100261 return registration_state_evdo_ != MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN ||
262 registration_state_1x_ != MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN;
263}
264
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400265void CellularCapabilityCDMA::SetUnregistered(bool searching) {
266 registration_state_evdo_ = MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN;
267 registration_state_1x_ = MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN;
268}
269
Darin Petkov20c13ec2011-11-09 15:07:15 +0100270string CellularCapabilityCDMA::GetNetworkTechnologyString() const {
Darin Petkov184c54e2011-11-15 12:44:39 +0100271 if (registration_state_evdo_ != MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN) {
Ben Chan7ea768e2013-09-20 15:08:40 -0700272 return kNetworkTechnologyEvdo;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100273 }
Darin Petkov184c54e2011-11-15 12:44:39 +0100274 if (registration_state_1x_ != MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN) {
Ben Chan7ea768e2013-09-20 15:08:40 -0700275 return kNetworkTechnology1Xrtt;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100276 }
277 return "";
278}
279
280string CellularCapabilityCDMA::GetRoamingStateString() const {
Ben Chan7fab8972014-08-10 17:14:46 -0700281 uint32_t state = registration_state_evdo_;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100282 if (state == MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN) {
Darin Petkov184c54e2011-11-15 12:44:39 +0100283 state = registration_state_1x_;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100284 }
285 switch (state) {
286 case MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN:
287 case MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED:
288 break;
289 case MM_MODEM_CDMA_REGISTRATION_STATE_HOME:
Ben Chan7ea768e2013-09-20 15:08:40 -0700290 return kRoamingStateHome;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100291 case MM_MODEM_CDMA_REGISTRATION_STATE_ROAMING:
Ben Chan7ea768e2013-09-20 15:08:40 -0700292 return kRoamingStateRoaming;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100293 default:
294 NOTREACHED();
295 }
Ben Chan7ea768e2013-09-20 15:08:40 -0700296 return kRoamingStateUnknown;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100297}
298
Darin Petkov3e509242011-11-10 14:46:44 +0100299void CellularCapabilityCDMA::GetSignalQuality() {
Ben Chanfad4a0b2012-04-18 15:49:59 -0700300 SLOG(Cellular, 2) << __func__;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500301 SignalQualityCallback callback =
302 Bind(&CellularCapabilityCDMA::OnGetSignalQualityReply,
303 weak_ptr_factory_.GetWeakPtr());
304 proxy_->GetSignalQuality(NULL, callback, kTimeoutDefault);
Darin Petkov184c54e2011-11-15 12:44:39 +0100305}
306
Eric Shienbrood9a245532012-03-07 14:20:39 -0500307void CellularCapabilityCDMA::GetRegistrationState() {
Ben Chanfad4a0b2012-04-18 15:49:59 -0700308 SLOG(Cellular, 2) << __func__;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500309 RegistrationStateCallback callback =
310 Bind(&CellularCapabilityCDMA::OnGetRegistrationStateReply,
311 weak_ptr_factory_.GetWeakPtr());
312 proxy_->GetRegistrationState(NULL, callback, kTimeoutDefault);
Darin Petkov184c54e2011-11-15 12:44:39 +0100313}
314
Eric Shienbrood9a245532012-03-07 14:20:39 -0500315void CellularCapabilityCDMA::OnActivateReply(
Ben Chan7fab8972014-08-10 17:14:46 -0700316 const ResultCallback &callback, uint32_t status, const Error &error) {
Christopher Wiley1582bdd2012-11-15 11:31:14 -0800317 activation_starting_ = false;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500318 if (error.IsSuccess()) {
319 if (status == MM_MODEM_CDMA_ACTIVATION_ERROR_NO_ERROR) {
320 activation_state_ = MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATING;
Christopher Wiley7d0953e2012-11-16 00:37:10 -0800321 } else {
322 LOG(WARNING) << "Modem activation failed with status: "
323 << GetActivationErrorString(status) << " (" << status << ")";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500324 }
325 HandleNewActivationState(status);
Christopher Wiley7d0953e2012-11-16 00:37:10 -0800326 } else {
327 LOG(ERROR) << "Activate() failed with error: " << error;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500328 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500329 callback.Run(error);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500330}
331
Eric Shienbrood9a245532012-03-07 14:20:39 -0500332void CellularCapabilityCDMA::OnGetRegistrationStateReply(
Ben Chan7fab8972014-08-10 17:14:46 -0700333 uint32_t state_1x, uint32_t state_evdo, const Error &error) {
Ben Chanfad4a0b2012-04-18 15:49:59 -0700334 SLOG(Cellular, 2) << __func__;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500335 if (error.IsSuccess())
336 OnRegistrationStateChangedSignal(state_1x, state_evdo);
337}
338
Ben Chan7fab8972014-08-10 17:14:46 -0700339void CellularCapabilityCDMA::OnGetSignalQualityReply(uint32_t quality,
Eric Shienbrood9a245532012-03-07 14:20:39 -0500340 const Error &error) {
341 if (error.IsSuccess())
342 OnSignalQualitySignal(quality);
343}
344
345void CellularCapabilityCDMA::OnActivationStateChangedSignal(
Ben Chan7fab8972014-08-10 17:14:46 -0700346 uint32_t activation_state,
347 uint32_t activation_error,
Darin Petkov184c54e2011-11-15 12:44:39 +0100348 const DBusPropertiesMap &status_changes) {
Ben Chanfad4a0b2012-04-18 15:49:59 -0700349 SLOG(Cellular, 2) << __func__;
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800350 string prop_value;
351
352 if (DBusProperties::GetString(status_changes, "mdn", &prop_value))
353 cellular()->set_mdn(prop_value);
354 if (DBusProperties::GetString(status_changes, "min", &prop_value))
355 cellular()->set_min(prop_value);
356
Prathmesh Prabhu28b4a3b2014-03-28 11:52:09 -0700357 UpdateOnlinePortal(status_changes);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100358 activation_state_ = activation_state;
359 HandleNewActivationState(activation_error);
Darin Petkov184c54e2011-11-15 12:44:39 +0100360}
361
Eric Shienbrood9a245532012-03-07 14:20:39 -0500362void CellularCapabilityCDMA::OnRegistrationStateChangedSignal(
Ben Chan7fab8972014-08-10 17:14:46 -0700363 uint32_t state_1x, uint32_t state_evdo) {
Ben Chanfad4a0b2012-04-18 15:49:59 -0700364 SLOG(Cellular, 2) << __func__;
Darin Petkov184c54e2011-11-15 12:44:39 +0100365 registration_state_1x_ = state_1x;
366 registration_state_evdo_ = state_evdo;
367 cellular()->HandleNewRegistrationState();
368}
369
Ben Chan7fab8972014-08-10 17:14:46 -0700370void CellularCapabilityCDMA::OnSignalQualitySignal(uint32_t strength) {
Darin Petkov3e509242011-11-10 14:46:44 +0100371 cellular()->HandleNewSignalQuality(strength);
372}
373
Prathmesh Prabhu28b4a3b2014-03-28 11:52:09 -0700374void CellularCapabilityCDMA::UpdateOnlinePortal(
375 const DBusPropertiesMap &properties) {
376 // Treat the three updates atomically: Only update the serving operator when
377 // all three are known:
378 string olp_url, olp_method, olp_post_data;
379 if (DBusProperties::GetString(properties, "payment_url", &olp_url) &&
380 DBusProperties::GetString(properties,
381 "payment_url_method", &olp_method) &&
382 DBusProperties::GetString(properties,
383 "payment_url_postdata",
384 &olp_post_data)) {
Prathmesh Prabhu92df6192014-04-29 18:08:08 -0700385 cellular()->home_provider_info()->UpdateOnlinePortal(olp_url,
Prathmesh Prabhu8599e052014-04-25 14:20:22 -0700386 olp_method,
387 olp_post_data);
Prathmesh Prabhu28b4a3b2014-03-28 11:52:09 -0700388 }
389}
390
Darin Petkovdaf43862011-10-27 11:37:28 +0200391} // namespace shill