blob: 53b5a55f5a9818d000bb9c6561e85aa2575411ca [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
Ben Chanc54afe52014-11-05 10:28:08 -08005#include "shill/cellular/cellular_capability_cdma.h"
Darin Petkovdaf43862011-10-27 11:37:28 +02006
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
Ben Chanc54afe52014-11-05 10:28:08 -080015#include "shill/cellular/cellular.h"
16#include "shill/cellular/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
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -070026namespace Logging {
27static auto kModuleLogScope = ScopeLogger::kCellular;
Paul Stewartf58b28e2015-06-16 13:13:10 -070028static string ObjectID(CellularCapabilityCDMA* c) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -070029 return c->cellular()->GetRpcIdentifier();
30}
31}
32
Darin Petkovac635a82012-01-10 16:51:58 +010033// static
Darin Petkovae0c64e2011-11-15 15:50:27 +010034const char CellularCapabilityCDMA::kPhoneNumber[] = "#777";
35
Paul Stewartf58b28e2015-06-16 13:13:10 -070036CellularCapabilityCDMA::CellularCapabilityCDMA(Cellular* cellular,
37 ProxyFactory* proxy_factory,
38 ModemInfo* modem_info)
Prathmesh Prabhu27526f12013-03-25 19:42:18 -070039 : CellularCapabilityClassic(cellular, proxy_factory, modem_info),
Eric Shienbrood3e20a232012-02-16 11:35:56 -050040 weak_ptr_factory_(this),
Christopher Wiley1582bdd2012-11-15 11:31:14 -080041 activation_starting_(false),
Darin Petkovae0c64e2011-11-15 15:50:27 +010042 activation_state_(MM_MODEM_CDMA_ACTIVATION_STATE_NOT_ACTIVATED),
Darin Petkov184c54e2011-11-15 12:44:39 +010043 registration_state_evdo_(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN),
Prathmesh Prabhu700ff4d2014-01-16 15:59:33 -080044 registration_state_1x_(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -070045 SLOG(this, 2) << "Cellular capability constructed: CDMA";
Darin Petkovae0c64e2011-11-15 15:50:27 +010046}
Darin Petkovdaf43862011-10-27 11:37:28 +020047
Ben Chanf98f00e2014-02-05 14:48:43 -080048CellularCapabilityCDMA::~CellularCapabilityCDMA() {}
49
Eric Shienbrood9a245532012-03-07 14:20:39 -050050void CellularCapabilityCDMA::InitProxies() {
Jason Glasgow82f9ab32012-04-04 14:27:19 -040051 CellularCapabilityClassic::InitProxies();
Darin Petkov184c54e2011-11-15 12:44:39 +010052 proxy_.reset(proxy_factory()->CreateModemCDMAProxy(
Eric Shienbrood9a245532012-03-07 14:20:39 -050053 cellular()->dbus_path(), cellular()->dbus_owner()));
54 proxy_->set_signal_quality_callback(
55 Bind(&CellularCapabilityCDMA::OnSignalQualitySignal,
56 weak_ptr_factory_.GetWeakPtr()));
57 proxy_->set_activation_state_callback(
58 Bind(&CellularCapabilityCDMA::OnActivationStateChangedSignal,
59 weak_ptr_factory_.GetWeakPtr()));
60 proxy_->set_registration_state_callback(
61 Bind(&CellularCapabilityCDMA::OnRegistrationStateChangedSignal,
62 weak_ptr_factory_.GetWeakPtr()));
Darin Petkovdaf43862011-10-27 11:37:28 +020063}
64
Ben Chanf98f00e2014-02-05 14:48:43 -080065string CellularCapabilityCDMA::GetTypeString() const {
66 return kTechnologyFamilyCdma;
67}
68
Paul Stewartf58b28e2015-06-16 13:13:10 -070069void CellularCapabilityCDMA::StartModem(Error* error,
70 const ResultCallback& callback) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -070071 SLOG(this, 2) << __func__;
Eric Shienbrood9a245532012-03-07 14:20:39 -050072 InitProxies();
73
Paul Stewartf58b28e2015-06-16 13:13:10 -070074 CellularTaskList* tasks = new CellularTaskList();
Eric Shienbrood9a245532012-03-07 14:20:39 -050075 ResultCallback cb =
76 Bind(&CellularCapabilityCDMA::StepCompletedCallback,
Thieu Le923006b2012-04-05 16:32:58 -070077 weak_ptr_factory_.GetWeakPtr(), callback, false, tasks);
Eric Shienbrood7fce52c2012-04-13 19:11:02 -040078 if (!cellular()->IsUnderlyingDeviceEnabled())
79 tasks->push_back(Bind(&CellularCapabilityCDMA::EnableModem,
80 weak_ptr_factory_.GetWeakPtr(), cb));
Eric Shienbrood9a245532012-03-07 14:20:39 -050081 tasks->push_back(Bind(&CellularCapabilityCDMA::GetModemStatus,
82 weak_ptr_factory_.GetWeakPtr(), cb));
83 tasks->push_back(Bind(&CellularCapabilityCDMA::GetMEID,
84 weak_ptr_factory_.GetWeakPtr(), cb));
85 tasks->push_back(Bind(&CellularCapabilityCDMA::GetModemInfo,
86 weak_ptr_factory_.GetWeakPtr(), cb));
87 tasks->push_back(Bind(&CellularCapabilityCDMA::FinishEnable,
88 weak_ptr_factory_.GetWeakPtr(), cb));
89
90 RunNextStep(tasks);
91}
92
Eric Shienbrood9a245532012-03-07 14:20:39 -050093void CellularCapabilityCDMA::ReleaseProxies() {
Jason Glasgow82f9ab32012-04-04 14:27:19 -040094 CellularCapabilityClassic::ReleaseProxies();
Darin Petkov721ac932011-11-16 15:43:09 +010095 proxy_.reset();
96}
97
Thieu Le63881a72014-07-28 17:28:36 -070098bool CellularCapabilityCDMA::AreProxiesInitialized() const {
99 return (CellularCapabilityClassic::AreProxiesInitialized() && proxy_.get());
100}
101
Jason Glasgow82f9ab32012-04-04 14:27:19 -0400102bool CellularCapabilityCDMA::AllowRoaming() {
103 return allow_roaming_property();
104}
105
106
Darin Petkov5f316f62011-11-18 12:10:26 +0100107void CellularCapabilityCDMA::OnServiceCreated() {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700108 SLOG(this, 2) << __func__;
Darin Petkov381928f2012-02-02 23:00:12 +0100109 cellular()->service()->SetUsageURL(usage_url_);
Thieu Le71f81a62014-07-11 15:17:47 -0700110 cellular()->service()->SetActivationType(
111 CellularService::kActivationTypeOTASP);
Darin Petkov5f316f62011-11-18 12:10:26 +0100112 HandleNewActivationState(MM_MODEM_CDMA_ACTIVATION_ERROR_NO_ERROR);
113}
114
Paul Stewartf58b28e2015-06-16 13:13:10 -0700115void CellularCapabilityCDMA::UpdateStatus(const DBusPropertiesMap& properties) {
Darin Petkovae0c64e2011-11-15 15:50:27 +0100116 string carrier;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100117 DBusProperties::GetUint32(
118 properties, "activation_state", &activation_state_);
Darin Petkov5f316f62011-11-18 12:10:26 +0100119 // TODO(petkov): For now, get the payment and usage URLs from ModemManager to
120 // match flimflam. In the future, get these from an alternative source (e.g.,
121 // database, carrier-specific properties, etc.).
Prathmesh Prabhu92df6192014-04-29 18:08:08 -0700122 UpdateOnlinePortal(properties);
Ben Chan7fab8972014-08-10 17:14:46 -0700123 uint16_t prl_version;
Prathmesh Prabhu92df6192014-04-29 18:08:08 -0700124 if (DBusProperties::GetUint16(properties, "prl_version", &prl_version))
125 cellular()->set_prl_version(prl_version);
126}
127
128void CellularCapabilityCDMA::UpdateServiceOLP() {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700129 SLOG(this, 3) << __func__;
Prathmesh Prabhu92df6192014-04-29 18:08:08 -0700130 // All OLP changes are routed up to the Home Provider.
131 if (!cellular()->home_provider_info()->IsMobileNetworkOperatorKnown()) {
132 return;
Darin Petkov381928f2012-02-02 23:00:12 +0100133 }
Prathmesh Prabhu92df6192014-04-29 18:08:08 -0700134
Paul Stewartf58b28e2015-06-16 13:13:10 -0700135 const vector<MobileOperatorInfo::OnlinePortal>& olp_list =
Prathmesh Prabhu92df6192014-04-29 18:08:08 -0700136 cellular()->home_provider_info()->olp_list();
137 if (olp_list.empty()) {
138 return;
Darin Petkov381928f2012-02-02 23:00:12 +0100139 }
Prathmesh Prabhu92df6192014-04-29 18:08:08 -0700140
141 if (olp_list.size() > 1) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700142 SLOG(this, 1) << "Found multiple online portals. Choosing the first.";
Darin Petkov381928f2012-02-02 23:00:12 +0100143 }
Prathmesh Prabhu92df6192014-04-29 18:08:08 -0700144 cellular()->service()->SetOLP(olp_list[0].url,
145 olp_list[0].method,
146 olp_list[0].post_data);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100147}
148
149void CellularCapabilityCDMA::SetupConnectProperties(
Paul Stewartf58b28e2015-06-16 13:13:10 -0700150 DBusPropertiesMap* properties) {
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500151 (*properties)[kConnectPropertyPhoneNumber].writer().append_string(
Darin Petkovae0c64e2011-11-15 15:50:27 +0100152 kPhoneNumber);
153}
154
Paul Stewartf58b28e2015-06-16 13:13:10 -0700155void CellularCapabilityCDMA::Activate(const string& carrier,
156 Error* error,
157 const ResultCallback& callback) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700158 SLOG(this, 2) << __func__ << "(" << carrier << ")";
Christopher Wiley1582bdd2012-11-15 11:31:14 -0800159 // We're going to trigger something which leads to an activation.
160 activation_starting_ = true;
Christopher Wiley7d0953e2012-11-16 00:37:10 -0800161 if (cellular()->state() == Cellular::kStateEnabled ||
162 cellular()->state() == Cellular::kStateRegistered) {
Christopher Wiley8a468902012-11-30 11:52:38 -0800163 ActivationResultCallback activation_callback =
Christopher Wiley7d0953e2012-11-16 00:37:10 -0800164 Bind(&CellularCapabilityCDMA::OnActivateReply,
165 weak_ptr_factory_.GetWeakPtr(),
166 callback);
Christopher Wiley8a468902012-11-30 11:52:38 -0800167 proxy_->Activate(carrier, error, activation_callback, kTimeoutActivate);
Christopher Wiley7d0953e2012-11-16 00:37:10 -0800168 } else if (cellular()->state() == Cellular::kStateConnected ||
169 cellular()->state() == Cellular::kStateLinked) {
Christopher Wiley8a468902012-11-30 11:52:38 -0800170 pending_activation_callback_ = callback;
171 pending_activation_carrier_ = carrier;
Samuel Tan0d061192014-07-07 15:45:15 -0700172 cellular()->Disconnect(error, __func__);
Christopher Wiley7d0953e2012-11-16 00:37:10 -0800173 } else {
Paul Stewart34f424e2015-01-16 15:30:20 -0800174 Error::PopulateAndLog(FROM_HERE, error, Error::kInvalidArguments,
Darin Petkova3d3be52011-11-14 21:34:16 +0100175 "Unable to activate in " +
176 Cellular::GetStateString(cellular()->state()));
Christopher Wiley1582bdd2012-11-15 11:31:14 -0800177 activation_starting_ = false;
Darin Petkova3d3be52011-11-14 21:34:16 +0100178 }
Darin Petkovae0c64e2011-11-15 15:50:27 +0100179}
180
Ben Chan7fab8972014-08-10 17:14:46 -0700181void CellularCapabilityCDMA::HandleNewActivationState(uint32_t error) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700182 SLOG(this, 2) << __func__ << "(" << error << ")";
Darin Petkovae0c64e2011-11-15 15:50:27 +0100183 if (!cellular()->service().get()) {
Christopher Wiley7d0953e2012-11-16 00:37:10 -0800184 LOG(ERROR) << "In " << __func__ << "(): service is null.";
Darin Petkovae0c64e2011-11-15 15:50:27 +0100185 return;
186 }
Darin Petkovb9c99332012-01-12 13:13:00 +0100187 cellular()->service()->SetActivationState(
Darin Petkovae0c64e2011-11-15 15:50:27 +0100188 GetActivationStateString(activation_state_));
189 cellular()->service()->set_error(GetActivationErrorString(error));
190}
191
Christopher Wiley8a468902012-11-30 11:52:38 -0800192void CellularCapabilityCDMA::DisconnectCleanup() {
193 CellularCapabilityClassic::DisconnectCleanup();
194 if (pending_activation_callback_.is_null()) {
195 return;
196 }
197 if (cellular()->state() == Cellular::kStateEnabled ||
198 cellular()->state() == Cellular::kStateRegistered) {
199 Error ignored_error;
200 Activate(pending_activation_carrier_,
201 &ignored_error,
202 pending_activation_callback_);
203 } else {
204 Error error;
205 Error::PopulateAndLog(
Paul Stewart34f424e2015-01-16 15:30:20 -0800206 FROM_HERE,
Christopher Wiley8a468902012-11-30 11:52:38 -0800207 &error,
208 Error::kOperationFailed,
209 "Tried to disconnect before activating cellular service and failed");
210 HandleNewActivationState(MM_MODEM_CDMA_ACTIVATION_ERROR_UNKNOWN);
211 activation_starting_ = false;
212 pending_activation_callback_.Run(error);
213 }
214 pending_activation_callback_.Reset();
215 pending_activation_carrier_.clear();
216}
217
Darin Petkovae0c64e2011-11-15 15:50:27 +0100218// static
Ben Chan7fab8972014-08-10 17:14:46 -0700219string CellularCapabilityCDMA::GetActivationStateString(uint32_t state) {
Darin Petkovae0c64e2011-11-15 15:50:27 +0100220 switch (state) {
221 case MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATED:
Ben Chan7ea768e2013-09-20 15:08:40 -0700222 return kActivationStateActivated;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100223 case MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATING:
Ben Chan7ea768e2013-09-20 15:08:40 -0700224 return kActivationStateActivating;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100225 case MM_MODEM_CDMA_ACTIVATION_STATE_NOT_ACTIVATED:
Ben Chan7ea768e2013-09-20 15:08:40 -0700226 return kActivationStateNotActivated;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100227 case MM_MODEM_CDMA_ACTIVATION_STATE_PARTIALLY_ACTIVATED:
Ben Chan7ea768e2013-09-20 15:08:40 -0700228 return kActivationStatePartiallyActivated;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100229 default:
Ben Chan7ea768e2013-09-20 15:08:40 -0700230 return kActivationStateUnknown;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100231 }
232}
233
234// static
Ben Chan7fab8972014-08-10 17:14:46 -0700235string CellularCapabilityCDMA::GetActivationErrorString(uint32_t error) {
Darin Petkovae0c64e2011-11-15 15:50:27 +0100236 switch (error) {
237 case MM_MODEM_CDMA_ACTIVATION_ERROR_WRONG_RADIO_INTERFACE:
Ben Chan7ea768e2013-09-20 15:08:40 -0700238 return kErrorNeedEvdo;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100239 case MM_MODEM_CDMA_ACTIVATION_ERROR_ROAMING:
Ben Chan7ea768e2013-09-20 15:08:40 -0700240 return kErrorNeedHomeNetwork;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100241 case MM_MODEM_CDMA_ACTIVATION_ERROR_COULD_NOT_CONNECT:
242 case MM_MODEM_CDMA_ACTIVATION_ERROR_SECURITY_AUTHENTICATION_FAILED:
243 case MM_MODEM_CDMA_ACTIVATION_ERROR_PROVISIONING_FAILED:
Ben Chan7ea768e2013-09-20 15:08:40 -0700244 return kErrorOtaspFailed;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100245 case MM_MODEM_CDMA_ACTIVATION_ERROR_NO_ERROR:
246 return "";
247 case MM_MODEM_CDMA_ACTIVATION_ERROR_NO_SIGNAL:
248 default:
Ben Chan7ea768e2013-09-20 15:08:40 -0700249 return kErrorActivationFailed;
Darin Petkovae0c64e2011-11-15 15:50:27 +0100250 }
Darin Petkova3d3be52011-11-14 21:34:16 +0100251}
252
Paul Stewartf58b28e2015-06-16 13:13:10 -0700253void CellularCapabilityCDMA::GetMEID(const ResultCallback& callback) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700254 SLOG(this, 2) << __func__;
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800255 if (cellular()->meid().empty()) {
Paul Stewartee6b3d72013-07-12 16:07:51 -0700256 // TODO(petkov): Switch to asynchronous calls (crbug.com/200687).
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800257 cellular()->set_meid(proxy_->MEID());
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700258 SLOG(this, 2) << "MEID: " << cellular()->meid();
Darin Petkovcb547732011-11-09 13:55:26 +0100259 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500260 callback.Run(Error());
Darin Petkovcb547732011-11-09 13:55:26 +0100261}
262
Paul Stewartf58b28e2015-06-16 13:13:10 -0700263void CellularCapabilityCDMA::GetProperties(const ResultCallback& callback) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700264 SLOG(this, 2) << __func__;
Darin Petkov184c54e2011-11-15 12:44:39 +0100265 // No properties.
Eric Shienbrood9a245532012-03-07 14:20:39 -0500266 callback.Run(Error());
Darin Petkov184c54e2011-11-15 12:44:39 +0100267}
268
Christopher Wiley1582bdd2012-11-15 11:31:14 -0800269bool CellularCapabilityCDMA::IsActivating() const {
270 return activation_starting_ ||
271 activation_state_ == MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATING;
272}
273
Ben Chan31ce5642013-11-14 13:37:40 -0800274bool CellularCapabilityCDMA::IsRegistered() const {
Darin Petkovb72cf402011-11-22 14:51:39 +0100275 return registration_state_evdo_ != MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN ||
276 registration_state_1x_ != MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN;
277}
278
Eric Shienbrood7fce52c2012-04-13 19:11:02 -0400279void CellularCapabilityCDMA::SetUnregistered(bool searching) {
280 registration_state_evdo_ = MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN;
281 registration_state_1x_ = MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN;
282}
283
Darin Petkov20c13ec2011-11-09 15:07:15 +0100284string CellularCapabilityCDMA::GetNetworkTechnologyString() const {
Darin Petkov184c54e2011-11-15 12:44:39 +0100285 if (registration_state_evdo_ != MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN) {
Ben Chan7ea768e2013-09-20 15:08:40 -0700286 return kNetworkTechnologyEvdo;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100287 }
Darin Petkov184c54e2011-11-15 12:44:39 +0100288 if (registration_state_1x_ != MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN) {
Ben Chan7ea768e2013-09-20 15:08:40 -0700289 return kNetworkTechnology1Xrtt;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100290 }
291 return "";
292}
293
294string CellularCapabilityCDMA::GetRoamingStateString() const {
Ben Chan7fab8972014-08-10 17:14:46 -0700295 uint32_t state = registration_state_evdo_;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100296 if (state == MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN) {
Darin Petkov184c54e2011-11-15 12:44:39 +0100297 state = registration_state_1x_;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100298 }
299 switch (state) {
300 case MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN:
301 case MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED:
302 break;
303 case MM_MODEM_CDMA_REGISTRATION_STATE_HOME:
Ben Chan7ea768e2013-09-20 15:08:40 -0700304 return kRoamingStateHome;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100305 case MM_MODEM_CDMA_REGISTRATION_STATE_ROAMING:
Ben Chan7ea768e2013-09-20 15:08:40 -0700306 return kRoamingStateRoaming;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100307 default:
308 NOTREACHED();
309 }
Ben Chan7ea768e2013-09-20 15:08:40 -0700310 return kRoamingStateUnknown;
Darin Petkov20c13ec2011-11-09 15:07:15 +0100311}
312
Darin Petkov3e509242011-11-10 14:46:44 +0100313void CellularCapabilityCDMA::GetSignalQuality() {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700314 SLOG(this, 2) << __func__;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500315 SignalQualityCallback callback =
316 Bind(&CellularCapabilityCDMA::OnGetSignalQualityReply,
317 weak_ptr_factory_.GetWeakPtr());
Ben Chanea18c6c2014-09-30 13:08:26 -0700318 proxy_->GetSignalQuality(nullptr, callback, kTimeoutDefault);
Darin Petkov184c54e2011-11-15 12:44:39 +0100319}
320
Eric Shienbrood9a245532012-03-07 14:20:39 -0500321void CellularCapabilityCDMA::GetRegistrationState() {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700322 SLOG(this, 2) << __func__;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500323 RegistrationStateCallback callback =
324 Bind(&CellularCapabilityCDMA::OnGetRegistrationStateReply,
325 weak_ptr_factory_.GetWeakPtr());
Ben Chanea18c6c2014-09-30 13:08:26 -0700326 proxy_->GetRegistrationState(nullptr, callback, kTimeoutDefault);
Darin Petkov184c54e2011-11-15 12:44:39 +0100327}
328
Eric Shienbrood9a245532012-03-07 14:20:39 -0500329void CellularCapabilityCDMA::OnActivateReply(
Paul Stewartf58b28e2015-06-16 13:13:10 -0700330 const ResultCallback& callback, uint32_t status, const Error& error) {
Christopher Wiley1582bdd2012-11-15 11:31:14 -0800331 activation_starting_ = false;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500332 if (error.IsSuccess()) {
333 if (status == MM_MODEM_CDMA_ACTIVATION_ERROR_NO_ERROR) {
334 activation_state_ = MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATING;
Christopher Wiley7d0953e2012-11-16 00:37:10 -0800335 } else {
336 LOG(WARNING) << "Modem activation failed with status: "
337 << GetActivationErrorString(status) << " (" << status << ")";
Eric Shienbrood9a245532012-03-07 14:20:39 -0500338 }
339 HandleNewActivationState(status);
Christopher Wiley7d0953e2012-11-16 00:37:10 -0800340 } else {
341 LOG(ERROR) << "Activate() failed with error: " << error;
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500342 }
Eric Shienbrood9a245532012-03-07 14:20:39 -0500343 callback.Run(error);
Eric Shienbrood5de44ab2011-12-05 10:46:27 -0500344}
345
Eric Shienbrood9a245532012-03-07 14:20:39 -0500346void CellularCapabilityCDMA::OnGetRegistrationStateReply(
Paul Stewartf58b28e2015-06-16 13:13:10 -0700347 uint32_t state_1x, uint32_t state_evdo, const Error& error) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700348 SLOG(this, 2) << __func__;
Eric Shienbrood9a245532012-03-07 14:20:39 -0500349 if (error.IsSuccess())
350 OnRegistrationStateChangedSignal(state_1x, state_evdo);
351}
352
Ben Chan7fab8972014-08-10 17:14:46 -0700353void CellularCapabilityCDMA::OnGetSignalQualityReply(uint32_t quality,
Paul Stewartf58b28e2015-06-16 13:13:10 -0700354 const Error& error) {
Eric Shienbrood9a245532012-03-07 14:20:39 -0500355 if (error.IsSuccess())
356 OnSignalQualitySignal(quality);
357}
358
359void CellularCapabilityCDMA::OnActivationStateChangedSignal(
Ben Chan7fab8972014-08-10 17:14:46 -0700360 uint32_t activation_state,
361 uint32_t activation_error,
Paul Stewartf58b28e2015-06-16 13:13:10 -0700362 const DBusPropertiesMap& status_changes) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700363 SLOG(this, 2) << __func__;
Prathmesh Prabhu9f06c872013-11-21 14:08:23 -0800364 string prop_value;
365
366 if (DBusProperties::GetString(status_changes, "mdn", &prop_value))
367 cellular()->set_mdn(prop_value);
368 if (DBusProperties::GetString(status_changes, "min", &prop_value))
369 cellular()->set_min(prop_value);
370
Prathmesh Prabhu28b4a3b2014-03-28 11:52:09 -0700371 UpdateOnlinePortal(status_changes);
Darin Petkovae0c64e2011-11-15 15:50:27 +0100372 activation_state_ = activation_state;
373 HandleNewActivationState(activation_error);
Darin Petkov184c54e2011-11-15 12:44:39 +0100374}
375
Eric Shienbrood9a245532012-03-07 14:20:39 -0500376void CellularCapabilityCDMA::OnRegistrationStateChangedSignal(
Ben Chan7fab8972014-08-10 17:14:46 -0700377 uint32_t state_1x, uint32_t state_evdo) {
Rebecca Silbersteinc9c31d82014-10-21 15:01:00 -0700378 SLOG(this, 2) << __func__;
Darin Petkov184c54e2011-11-15 12:44:39 +0100379 registration_state_1x_ = state_1x;
380 registration_state_evdo_ = state_evdo;
381 cellular()->HandleNewRegistrationState();
382}
383
Ben Chan7fab8972014-08-10 17:14:46 -0700384void CellularCapabilityCDMA::OnSignalQualitySignal(uint32_t strength) {
Darin Petkov3e509242011-11-10 14:46:44 +0100385 cellular()->HandleNewSignalQuality(strength);
386}
387
Prathmesh Prabhu28b4a3b2014-03-28 11:52:09 -0700388void CellularCapabilityCDMA::UpdateOnlinePortal(
Paul Stewartf58b28e2015-06-16 13:13:10 -0700389 const DBusPropertiesMap& properties) {
Prathmesh Prabhu28b4a3b2014-03-28 11:52:09 -0700390 // Treat the three updates atomically: Only update the serving operator when
391 // all three are known:
392 string olp_url, olp_method, olp_post_data;
393 if (DBusProperties::GetString(properties, "payment_url", &olp_url) &&
394 DBusProperties::GetString(properties,
395 "payment_url_method", &olp_method) &&
396 DBusProperties::GetString(properties,
397 "payment_url_postdata",
398 &olp_post_data)) {
Prathmesh Prabhu92df6192014-04-29 18:08:08 -0700399 cellular()->home_provider_info()->UpdateOnlinePortal(olp_url,
Prathmesh Prabhu8599e052014-04-25 14:20:22 -0700400 olp_method,
401 olp_post_data);
Prathmesh Prabhu28b4a3b2014-03-28 11:52:09 -0700402 }
403}
404
Darin Petkovdaf43862011-10-27 11:37:28 +0200405} // namespace shill