1 /*
2 * Copyright (C) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "stk_controller.h"
17
18 #include "ability_manager_client.h"
19 #include "bundle_mgr_proxy.h"
20 #include "common_event_data.h"
21 #include "common_event_manager.h"
22 #include "common_event_publish_info.h"
23 #include "common_event_support.h"
24 #include "extension_ability_info.h"
25 #ifdef CORE_SERVICE_SUPPORT_ESIM
26 #include "esim_controller.h"
27 #endif
28 #include "tel_ril_types.h"
29 #include "if_system_ability_manager.h"
30 #include "iservice_registry.h"
31 #include "parameters.h"
32 #include "radio_event.h"
33 #include "system_ability_definition.h"
34 #include "telephony_errors.h"
35 #include "telephony_log_wrapper.h"
36 #include "telephony_ext_wrapper.h"
37
38 namespace OHOS {
39 namespace Telephony {
40 namespace {
41 const int32_t ICC_CARD_STATE_ABSENT = 0;
42 const int32_t ICC_CARD_STATE_PRESENT = 1;
43 const int32_t WAIT_TIME_SECOND = 2; // Set the timeout for sending the stk command
44 const int32_t PARAMETER_LENGTH = 128;
45 const int64_t DELAY_TIME = 3000;
46 const int32_t MAX_RETRY_COUNT = 10;
47 const int32_t REFRESH_RESULT_FILE_UPDATE = 0;
48 const std::string PARAM_SLOTID = "slotId";
49 const std::string PARAM_MSG_CMD = "msgCmd";
50 const std::string PARAM_CARD_STATUS = "cardStatus";
51 const std::string PARAM_ALPHA_STRING = "alphaString";
52 const std::string PARAM_REFRESH_RESULT = "refreshResult";
53 const std::string STK_BUNDLE = "const.telephony.stk_bundle_name";
54 const std::string ABILITY_NAME = "ServiceExtAbility";
55 const std::string DEFAULT_BUNDLE = "";
56 } // namespace
57
StkController(const std::weak_ptr<Telephony::ITelRilManager> & telRilManager,const std::weak_ptr<Telephony::SimStateManager> & simStateManager,int32_t slotId)58 StkController::StkController(const std::weak_ptr<Telephony::ITelRilManager> &telRilManager,
59 const std::weak_ptr<Telephony::SimStateManager> &simStateManager, int32_t slotId)
60 : TelEventHandler("StkController"), telRilManager_(telRilManager), simStateManager_(simStateManager),
61 slotId_(slotId)
62 {}
63
~StkController()64 StkController::~StkController()
65 {
66 UnSubscribeListeners();
67 }
68
Init()69 void StkController::Init()
70 {
71 stkBundleName_ = initStkBudleName();
72 RegisterEvents();
73 if (TELEPHONY_EXT_WRAPPER.initBip_ != nullptr) {
74 TELEPHONY_EXT_WRAPPER.initBip_(slotId_);
75 }
76 InitListener();
77 }
78
UnSubscribeListeners()79 void StkController::UnSubscribeListeners()
80 {
81 if (bundleScanFinishedSubscriber_ != nullptr &&
82 CommonEventManager::UnSubscribeCommonEvent(bundleScanFinishedSubscriber_)) {
83 bundleScanFinishedSubscriber_ = nullptr;
84 TELEPHONY_LOGI("Unsubscribe Bundle Scan Finished success");
85 }
86 if (statusChangeListener_ != nullptr) {
87 auto samgrProxy = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
88 if (samgrProxy != nullptr) {
89 samgrProxy->UnSubscribeSystemAbility(OHOS::COMMON_EVENT_SERVICE_ID, statusChangeListener_);
90 statusChangeListener_ = nullptr;
91 TELEPHONY_LOGI("Unsubscribe COMMON_EVENT_SERVICE_ID success");
92 }
93 }
94 }
95
InitListener()96 void StkController::InitListener()
97 {
98 auto samgrProxy = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
99 statusChangeListener_ = new (std::nothrow) SystemAbilityStatusChangeListener(*this);
100 if (samgrProxy == nullptr || statusChangeListener_ == nullptr) {
101 TELEPHONY_LOGE("samgrProxy or statusChangeListener_ is nullptr");
102 return;
103 }
104 auto ret = samgrProxy->SubscribeSystemAbility(COMMON_EVENT_SERVICE_ID, statusChangeListener_);
105 TELEPHONY_LOGI("SubscribeSystemAbility COMMON_EVENT_SERVICE_ID result is %{public}d", ret);
106 }
107
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)108 void StkController::SystemAbilityStatusChangeListener::OnAddSystemAbility(int32_t systemAbilityId,
109 const std::string &deviceId)
110 {
111 switch (systemAbilityId) {
112 case COMMON_EVENT_SERVICE_ID: {
113 TELEPHONY_LOGI("COMMON_EVENT_SERVICE_ID is running");
114 handler_.SubscribeBundleScanFinished();
115 break;
116 }
117 default:
118 TELEPHONY_LOGE("systemAbilityId is invalid");
119 break;
120 }
121 }
122
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)123 void StkController::SystemAbilityStatusChangeListener::OnRemoveSystemAbility(int32_t systemAbilityId,
124 const std::string &deviceId)
125 {
126 switch (systemAbilityId) {
127 case COMMON_EVENT_SERVICE_ID: {
128 handler_.UnSubscribeListeners();
129 TELEPHONY_LOGI("COMMON_EVENT_SERVICE_ID stopped");
130 break;
131 }
132 default:
133 TELEPHONY_LOGE("systemAbilityId is invalid");
134 break;
135 }
136 }
137
SubscribeBundleScanFinished()138 void StkController::SubscribeBundleScanFinished()
139 {
140 if (bundleScanFinishedSubscriber_ != nullptr) {
141 TELEPHONY_LOGW("Bundle Scan Finished has Subscribed");
142 return;
143 }
144 MatchingSkills matchingSkills;
145 matchingSkills.AddEvent(BUNDLE_SCAN_FINISHED_EVENT);
146 CommonEventSubscribeInfo subscriberInfo(matchingSkills);
147 subscriberInfo.SetThreadMode(CommonEventSubscribeInfo::COMMON);
148 bundleScanFinishedSubscriber_ = std::make_shared<BundleScanFinishedEventSubscriber>(subscriberInfo, *this);
149 if (CommonEventManager::SubscribeCommonEvent(bundleScanFinishedSubscriber_)) {
150 TELEPHONY_LOGI("Subscribe Bundle Scan Finished success");
151 } else {
152 bundleScanFinishedSubscriber_ = nullptr;
153 TELEPHONY_LOGE("Subscribe Bundle Scan Finished fail");
154 }
155 }
156
OnReceiveEvent(const CommonEventData & data)157 void StkController::BundleScanFinishedEventSubscriber::OnReceiveEvent(const CommonEventData &data)
158 {
159 OHOS::EventFwk::Want want = data.GetWant();
160 std::string action = want.GetAction();
161 TELEPHONY_LOGI("action = %{public}s", action.c_str());
162 if (action == BUNDLE_SCAN_FINISHED_EVENT) {
163 handler_.OnReceiveBms();
164 }
165 }
166
OnReceiveBms()167 void StkController::OnReceiveBms()
168 {
169 if (!retryWant_.GetStringParam(PARAM_MSG_CMD).empty() && !isProactiveCommandSucc) {
170 if (remainTryCount_ == 0) {
171 remainTryCount_ = MAX_RETRY_COUNT;
172 TELEPHONY_LOGI("OnReceiveBms retry send stkdata");
173 SendEvent(StkController::RETRY_SEND_RIL_PROACTIVE_COMMAND, 0, DELAY_TIME);
174 } else {
175 remainTryCount_ = MAX_RETRY_COUNT;
176 }
177 }
178 }
179
initStkBudleName()180 std::string StkController::initStkBudleName()
181 {
182 char bundleName[PARAMETER_LENGTH] = { 0 };
183 GetParameter(STK_BUNDLE.c_str(), DEFAULT_BUNDLE.c_str(), bundleName, PARAMETER_LENGTH);
184 return bundleName;
185 }
186
GetBundleMgr()187 sptr<OHOS::IRemoteObject> StkController::GetBundleMgr()
188 {
189 OHOS::sptr<OHOS::ISystemAbilityManager> systemAbilityManager =
190 OHOS::SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
191 if (systemAbilityManager == nullptr) {
192 TELEPHONY_LOGE("Failed to get ability mgr.");
193 return nullptr;
194 }
195 return systemAbilityManager->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
196 }
197
RegisterEvents()198 void StkController::RegisterEvents()
199 {
200 std::shared_ptr<ITelRilManager> telRilManager = telRilManager_.lock();
201 if (telRilManager == nullptr) {
202 TELEPHONY_LOGE("StkController[%{public}d]::RegisterEvents() telRilManager is nullptr", slotId_);
203 return;
204 }
205 std::shared_ptr<SimStateManager> simStateManager = simStateManager_.lock();
206 if (simStateManager == nullptr) {
207 TELEPHONY_LOGE("StkController[%{public}d]::RegisterEvents() simStateManager is nullptr", slotId_);
208 return;
209 }
210 simStateManager->RegisterCoreNotify(shared_from_this(), RadioEvent::RADIO_SIM_STATE_CHANGE);
211 telRilManager->RegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_STK_SESSION_END, nullptr);
212 telRilManager->RegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_STK_PROACTIVE_COMMAND, nullptr);
213 telRilManager->RegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_STK_ALPHA_NOTIFY, nullptr);
214 telRilManager->RegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_STK_EVENT_NOTIFY, nullptr);
215 telRilManager->RegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_STK_CALL_SETUP, nullptr);
216 telRilManager->RegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_ICC_REFRESH, nullptr);
217 telRilManager->RegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_STATE_CHANGED, nullptr);
218 }
219
UnRegisterEvents()220 void StkController::UnRegisterEvents()
221 {
222 std::shared_ptr<ITelRilManager> telRilManager = telRilManager_.lock();
223 if (telRilManager == nullptr) {
224 TELEPHONY_LOGE("StkController[%{public}d]::UnRegisterEvents() telRilManager is nullptr", slotId_);
225 return;
226 }
227 std::shared_ptr<SimStateManager> simStateManager = simStateManager_.lock();
228 if (simStateManager == nullptr) {
229 TELEPHONY_LOGE("StkController[%{public}d]::UnRegisterEvents() simStateManager is nullptr", slotId_);
230 return;
231 }
232 simStateManager->UnRegisterCoreNotify(shared_from_this(), RadioEvent::RADIO_SIM_STATE_CHANGE);
233 telRilManager->UnRegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_STK_SESSION_END);
234 telRilManager->UnRegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_STK_PROACTIVE_COMMAND);
235 telRilManager->UnRegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_STK_ALPHA_NOTIFY);
236 telRilManager->UnRegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_STK_EVENT_NOTIFY);
237 telRilManager->UnRegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_STK_CALL_SETUP);
238 telRilManager->UnRegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_ICC_REFRESH);
239 telRilManager->UnRegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_STATE_CHANGED);
240 }
241
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)242 void StkController::ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event)
243 {
244 if (event == nullptr) {
245 TELEPHONY_LOGE("StkController[%{public}d]::ProcessEvent() event is nullptr", slotId_);
246 return;
247 }
248 uint32_t id = event->GetInnerEventId();
249 switch (id) {
250 case RadioEvent::RADIO_SIM_STATE_CHANGE:
251 OnIccStateChanged(event);
252 break;
253 case RadioEvent::RADIO_STK_SESSION_END:
254 OnSendRilSessionEnd(event);
255 break;
256 case RadioEvent::RADIO_STK_PROACTIVE_COMMAND:
257 OnSendRilProactiveCommand(event);
258 break;
259 case RadioEvent::RADIO_STK_ALPHA_NOTIFY:
260 OnSendRilAlphaNotify(event);
261 break;
262 case RadioEvent::RADIO_STK_EVENT_NOTIFY:
263 OnSendRilEventNotify(event);
264 break;
265 case RadioEvent::RADIO_STK_CALL_SETUP:
266 TELEPHONY_LOGI("StkController[%{public}d]::ProcessEvent(),"
267 " event notify command supplied all the information needed for set up call processing", slotId_);
268 break;
269 case RadioEvent::RADIO_ICC_REFRESH:
270 OnIccRefresh(event);
271 break;
272 case RadioEvent::RADIO_STK_SEND_TERMINAL_RESPONSE:
273 OnSendTerminalResponseResult(event);
274 break;
275 case RadioEvent::RADIO_STK_SEND_ENVELOPE:
276 OnSendEnvelopeCmdResult(event);
277 break;
278 case RadioEvent::RADIO_STK_IS_READY:
279 TELEPHONY_LOGI("StkController[%{public}d]::ProcessEvent() SimStkIsReady done", slotId_);
280 break;
281 case RadioEvent::RADIO_STK_SEND_CALL_SETUP_REQUEST_RESULT:
282 OnSendCallSetupRequestResult(event);
283 break;
284 case StkController::RETRY_SEND_RIL_PROACTIVE_COMMAND:
285 RetrySendRilProactiveCommand();
286 break;
287 default:
288 ProcessEventExt(id, event);
289 break;
290 }
291 }
292
ProcessEventExt(uint32_t id,const AppExecFwk::InnerEvent::Pointer & event)293 void StkController::ProcessEventExt(uint32_t id, const AppExecFwk::InnerEvent::Pointer &event)
294 {
295 switch (id) {
296 case RadioEvent::RADIO_STATE_CHANGED:
297 OnRadioStateChanged(event);
298 break;
299 default:
300 TELEPHONY_LOGE("StkController[%{public}d]::ProcessEvent() unknown event", slotId_);
301 break;
302 }
303 }
304
OnIccStateChanged(const AppExecFwk::InnerEvent::Pointer & event)305 void StkController::OnIccStateChanged(const AppExecFwk::InnerEvent::Pointer &event)
306 {
307 std::shared_ptr<SimStateManager> simStateManager = simStateManager_.lock();
308 if (simStateManager == nullptr) {
309 TELEPHONY_LOGE("StkController[%{public}d]::OnIccStateChanged() simStateManager is nullptr", slotId_);
310 return;
311 }
312 int32_t newState =
313 static_cast<int32_t>(simStateManager->GetSimIccStatus()) >
314 ICC_CARD_STATE_ABSENT
315 ? ICC_CARD_STATE_PRESENT
316 : ICC_CARD_STATE_ABSENT;
317 int32_t oldState = iccCardState_;
318 iccCardState_ = newState;
319 TELEPHONY_LOGI("StkController[%{public}d]::OnIccStateChanged(), oldState: %{public}d newState: %{public}d",
320 slotId_, oldState, newState);
321 if (oldState == ICC_CARD_STATE_PRESENT && newState == ICC_CARD_STATE_ABSENT) {
322 AAFwk::Want want;
323 want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_STK_CARD_STATE_CHANGED);
324 want.SetParam(PARAM_SLOTID, slotId_);
325 want.SetParam(PARAM_CARD_STATUS, iccCardState_);
326 bool publishResult = PublishStkEvent(want);
327 TELEPHONY_LOGI("StkController[%{public}d]::OnIccStateChanged() publishResult = %{public}d",
328 slotId_, publishResult);
329 } else if (oldState == ICC_CARD_STATE_ABSENT && newState == ICC_CARD_STATE_PRESENT) {
330 TELEPHONY_LOGI("StkController[%{public}d]::OnIccStateChanged(), call SimStkIsReady()", slotId_);
331 auto event = AppExecFwk::InnerEvent::Get(RadioEvent::RADIO_STK_IS_READY);
332 if (event == nullptr) {
333 TELEPHONY_LOGE("StkController[%{public}d]::OnIccStateChanged() event is nullptr", slotId_);
334 return;
335 }
336 event->SetOwner(shared_from_this());
337 std::shared_ptr<ITelRilManager> telRilManager = telRilManager_.lock();
338 if (telRilManager == nullptr) {
339 TELEPHONY_LOGE("StkController[%{public}d]::OnIccStateChanged() telRilManager is nullptr", slotId_);
340 return;
341 }
342 telRilManager->SimStkIsReady(slotId_, event);
343 }
344 }
345
OnSendRilSessionEnd(const AppExecFwk::InnerEvent::Pointer & event)346 void StkController::OnSendRilSessionEnd(const AppExecFwk::InnerEvent::Pointer &event)
347 {
348 AAFwk::Want want;
349 want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_STK_SESSION_END);
350 want.SetParam(PARAM_SLOTID, slotId_);
351 bool publishResult = PublishStkEvent(want);
352 TELEPHONY_LOGI("StkController[%{public}d]::OnSendRilSessionEnd() publishResult = %{public}d",
353 slotId_, publishResult);
354 }
355
SafeSubstr(const std::string & str,size_t pos,size_t len)356 std::string SafeSubstr(const std::string& str, size_t pos, size_t len)
357 {
358 if (pos >= str.length()) {
359 TELEPHONY_LOGE("string pos abnormal. str: %{public}s pos: %{public}zu, len: %{public}zu",
360 str.c_str(), pos, len);
361 return "";
362 }
363
364 if (pos + len > str.length()) {
365 TELEPHONY_LOGI("string len abnormal: str: %{public}s pos: %{public}zu, len: %{public}zu",
366 str.c_str(), pos, len);
367 len = str.length() - pos;
368 }
369
370 return str.substr(pos, len);
371 }
372
HandleStkBipCmd(const std::string & cmdData)373 void StkController::HandleStkBipCmd(const std::string &cmdData)
374 {
375 std::string commandLen = SafeSubstr(cmdData, STK_CMD_CMD_LEN_INDEX, STK_CMD_TYPE_LEN);
376 uint32_t typeOffset;
377 if (commandLen == "") {
378 return;
379 } else if (commandLen == STK_CMD_CMD_LEN_81) {
380 typeOffset = STK_CMD_TYPE_81_INDEX;
381 } else if (commandLen == STK_CMD_CMD_LEN_82) {
382 typeOffset = STK_CMD_TYPE_82_INDEX;
383 } else if (commandLen == STK_CMD_CMD_LEN_83) {
384 typeOffset = STK_CMD_TYPE_83_INDEX;
385 } else {
386 typeOffset = STK_CMD_TYPE_80_INDEX;
387 }
388
389 std::string commandType = SafeSubstr(cmdData, typeOffset, STK_CMD_TYPE_LEN);
390 if (commandType == STK_BIP_CMD_OPEN_CHANNEL || commandType == STK_BIP_CMD_SEND_DATA ||
391 commandType == STK_BIP_CMD_RECEVIE_DATA || commandType == STK_BIP_CMD_GET_CHANNEL_STATUS ||
392 commandType == STK_BIP_CMD_CLOSE_CHANNEL || commandType == STK_BIP_CMD_SET_UP_EVENT_LIST) {
393 if (TELEPHONY_EXT_WRAPPER.sendEvent_ &&
394 TELEPHONY_EXT_WRAPPER.sendEvent_(std::make_shared<std::string>(cmdData), slotId_)) {
395 TELEPHONY_LOGI("sendEvent_. slotId_ [%{public}d]", slotId_);
396 }
397 }
398 }
399
OnSendRilProactiveCommand(const AppExecFwk::InnerEvent::Pointer & event)400 void StkController::OnSendRilProactiveCommand(const AppExecFwk::InnerEvent::Pointer &event)
401 {
402 auto stkData = event->GetSharedObject<std::string>();
403 if (stkData == nullptr) {
404 TELEPHONY_LOGE("StkController[%{public}d]::OnSendRilProactiveCommand() stkData is nullptr", slotId_);
405 return;
406 }
407
408 std::string cmdData = (std::string)*stkData;
409 HandleStkBipCmd(cmdData);
410
411 #ifdef CORE_SERVICE_SUPPORT_ESIM
412 if (EsimController::GetInstance().ChecIsVerifyBindCommand(cmdData)) {
413 EsimController::GetInstance().ProcessCommandMessage(slotId_, cmdData);
414 return;
415 }
416 #endif
417
418 AAFwk::Want want;
419 want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_STK_COMMAND);
420 want.SetParam(PARAM_SLOTID, slotId_);
421 want.SetParam(PARAM_MSG_CMD, cmdData);
422 bool publishResult = PublishStkEvent(want);
423 TELEPHONY_LOGI("StkController[%{public}d]::OnSendRilProactiveCommand() stkData = %{public}s "
424 "publishResult = %{public}d", slotId_, cmdData.c_str(), publishResult);
425 if (!publishResult) {
426 retryWant_ = want;
427 remainTryCount_ = MAX_RETRY_COUNT;
428 SendEvent(StkController::RETRY_SEND_RIL_PROACTIVE_COMMAND, 0, DELAY_TIME);
429 return;
430 }
431 isProactiveCommandSucc = true;
432 remainTryCount_ = 0;
433 }
434
RetrySendRilProactiveCommand()435 void StkController::RetrySendRilProactiveCommand()
436 {
437 remainTryCount_--;
438 TELEPHONY_LOGI("StkController[%{public}d], remainTryCount_ is %{public}d", slotId_, remainTryCount_);
439 if (remainTryCount_ > 0) {
440 if (!PublishStkEvent(retryWant_)) {
441 SendEvent(StkController::RETRY_SEND_RIL_PROACTIVE_COMMAND, 0, DELAY_TIME);
442 return;
443 }
444 TELEPHONY_LOGI("StkController[%{public}d] retry sucess", slotId_);
445 isProactiveCommandSucc = true;
446 remainTryCount_ = 0;
447 return;
448 }
449 TELEPHONY_LOGI("StkController[%{public}d] stop retry", slotId_);
450 }
451
OnSendRilAlphaNotify(const AppExecFwk::InnerEvent::Pointer & event)452 void StkController::OnSendRilAlphaNotify(const AppExecFwk::InnerEvent::Pointer &event)
453 {
454 auto alphaData = event->GetSharedObject<std::string>();
455 if (alphaData == nullptr) {
456 TELEPHONY_LOGE("StkController[%{public}d]::OnSendRilAlphaNotify() alphaData is nullptr", slotId_);
457 return;
458 }
459 std::string cmdData = (std::string)*alphaData;
460 AAFwk::Want want;
461 want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_STK_ALPHA_IDENTIFIER);
462 want.SetParam(PARAM_SLOTID, slotId_);
463 want.SetParam(PARAM_ALPHA_STRING, cmdData);
464 bool publishResult = PublishStkEvent(want);
465 TELEPHONY_LOGI("StkController[%{public}d]::OnSendRilAlphaNotify() alphaData = %{public}s "
466 "publishResult = %{public}d", slotId_, cmdData.c_str(), publishResult);
467 }
468
OnSendRilEventNotify(const AppExecFwk::InnerEvent::Pointer & event)469 void StkController::OnSendRilEventNotify(const AppExecFwk::InnerEvent::Pointer &event)
470 {
471 auto eventData = event->GetSharedObject<std::string>();
472 if (eventData == nullptr) {
473 TELEPHONY_LOGE("StkController[%{public}d]::OnSendRilEventNotify() eventData is nullptr", slotId_);
474 return;
475 }
476 std::string cmdData = (std::string)*eventData;
477 AAFwk::Want want;
478 want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_STK_COMMAND);
479 want.SetParam(PARAM_SLOTID, slotId_);
480 want.SetParam(PARAM_MSG_CMD, cmdData);
481 bool publishResult = PublishStkEvent(want);
482 TELEPHONY_LOGI("StkController[%{public}d]::OnSendRilEventNotify() eventData = %{public}s "
483 "publishResult = %{public}d", slotId_, cmdData.c_str(), publishResult);
484 }
485
OnIccRefresh(const AppExecFwk::InnerEvent::Pointer & event)486 void StkController::OnIccRefresh(const AppExecFwk::InnerEvent::Pointer &event)
487 {
488 auto refreshResult = event->GetSharedObject<int32_t>();
489 int32_t result = REFRESH_RESULT_FILE_UPDATE;
490 if (refreshResult == nullptr) {
491 TELEPHONY_LOGE("StkController[%{public}d]::OnIccRefresh() refreshResult is nullptr", slotId_);
492 } else {
493 result = (int32_t)*refreshResult;
494 }
495 AAFwk::Want want;
496 want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_STK_CARD_STATE_CHANGED);
497 want.SetParam(PARAM_SLOTID, slotId_);
498 want.SetParam(PARAM_CARD_STATUS, ICC_CARD_STATE_PRESENT);
499 want.SetParam(PARAM_REFRESH_RESULT, result);
500 bool publishResult = PublishStkEvent(want);
501 TELEPHONY_LOGI("StkController[%{public}d]::OnIccRefresh() refresh result = %{public}d publishResult = %{public}d",
502 slotId_, result, publishResult);
503 }
504
PublishStkEvent(AAFwk::Want & want)505 bool StkController::PublishStkEvent(AAFwk::Want &want)
506 {
507 if (stkBundleName_.empty()) {
508 TELEPHONY_LOGE("stkBundleName_ is empty");
509 return false;
510 }
511 if (!CheckIsSystemApp(stkBundleName_)) {
512 TELEPHONY_LOGE("is not system app");
513 return false;
514 }
515 AppExecFwk::ElementName element("", stkBundleName_, ABILITY_NAME);
516 want.SetElement(element);
517 int32_t accountId = -1;
518 auto ret = AAFwk::AbilityManagerClient::GetInstance()->StartExtensionAbility(
519 want, nullptr, accountId, AppExecFwk::ExtensionAbilityType::SERVICE);
520 return ret == 0;
521 }
522
CheckIsSystemApp(const std::string & bundleName)523 bool StkController::CheckIsSystemApp(const std::string &bundleName)
524 {
525 sptr<OHOS::IRemoteObject> remoteObject = GetBundleMgr();
526 if (remoteObject == nullptr) {
527 TELEPHONY_LOGE("error to get bundleMgr");
528 return false;
529 }
530 sptr<AppExecFwk::IBundleMgr> iBundleMgr = OHOS::iface_cast<AppExecFwk::IBundleMgr>(remoteObject);
531 if (iBundleMgr == nullptr) {
532 TELEPHONY_LOGE("iBundleMgr is null");
533 return false;
534 }
535 OHOS::AppExecFwk::BundleInfo info;
536 info.applicationInfo.isSystemApp = false;
537 if (!iBundleMgr->GetBundleInfo(
538 bundleName, OHOS::AppExecFwk::GET_BUNDLE_DEFAULT, info, AppExecFwk::Constants::ALL_USERID)) {
539 TELEPHONY_LOGE("Failed to get bundleInfo from bundleMgr");
540 } else {
541 TELEPHONY_LOGI("isSystemApp =%{public}d", info.applicationInfo.isSystemApp);
542 }
543 return info.applicationInfo.isSystemApp;
544 }
545
SendTerminalResponseCmd(const std::string & strCmd)546 int32_t StkController::SendTerminalResponseCmd(const std::string &strCmd)
547 {
548 auto event = AppExecFwk::InnerEvent::Get(RadioEvent::RADIO_STK_SEND_TERMINAL_RESPONSE);
549 if (event == nullptr) {
550 TELEPHONY_LOGE("StkController[%{public}d]::SendTerminalResponseCmd() event is nullptr", slotId_);
551 return TELEPHONY_ERR_LOCAL_PTR_NULL;
552 }
553 event->SetOwner(shared_from_this());
554 std::shared_ptr<ITelRilManager> telRilManager = telRilManager_.lock();
555 if (telRilManager == nullptr) {
556 TELEPHONY_LOGE("StkController[%{public}d]::SendTerminalResponseCmd() telRilManager is nullptr", slotId_);
557 return TELEPHONY_ERR_LOCAL_PTR_NULL;
558 }
559
560 std::unique_lock<std::mutex> terminalResponselock(stkMutex_);
561 terminalResponseResult_ = 0;
562 responseFinished_ = false;
563 telRilManager->SendTerminalResponseCmd(slotId_, strCmd, event);
564 while (!responseFinished_) {
565 TELEPHONY_LOGI("StkController[%{public}d]::SendTerminalResponseCmd() wait for the response to finish", slotId_);
566 if (stkCv_.wait_for(terminalResponselock, std::chrono::seconds(WAIT_TIME_SECOND)) == std::cv_status::timeout) {
567 TELEPHONY_LOGE("StkController[%{public}d]::SendTerminalResponseCmd() wait timeout", slotId_);
568 break;
569 }
570 }
571 if (!responseFinished_) {
572 TELEPHONY_LOGE("ril cmd fail");
573 return TELEPHONY_ERR_RIL_CMD_FAIL;
574 }
575 return TELEPHONY_SUCCESS;
576 }
577
SendEnvelopeCmd(const std::string & strCmd)578 int32_t StkController::SendEnvelopeCmd(const std::string &strCmd)
579 {
580 auto event = AppExecFwk::InnerEvent::Get(RadioEvent::RADIO_STK_SEND_ENVELOPE);
581 if (event == nullptr) {
582 TELEPHONY_LOGE("StkController[%{public}d]::SendEnvelopeCmd() event is nullptr", slotId_);
583 return TELEPHONY_ERR_LOCAL_PTR_NULL;
584 }
585 event->SetOwner(shared_from_this());
586 std::shared_ptr<ITelRilManager> telRilManager = telRilManager_.lock();
587 if (telRilManager == nullptr) {
588 TELEPHONY_LOGE("StkController[%{public}d]::SendEnvelopeCmd() telRilManager is nullptr", slotId_);
589 return TELEPHONY_ERR_LOCAL_PTR_NULL;
590 }
591
592 std::unique_lock<std::mutex> envelopelock(stkMutex_);
593 envelopeResponseResult_ = 0;
594 responseFinished_ = false;
595 telRilManager->SendEnvelopeCmd(slotId_, strCmd, event);
596 while (!responseFinished_) {
597 TELEPHONY_LOGI("StkController[%{public}d]::SendEnvelopeCmd() wait for the response to finish", slotId_);
598 if (stkCv_.wait_for(envelopelock, std::chrono::seconds(WAIT_TIME_SECOND)) == std::cv_status::timeout) {
599 TELEPHONY_LOGE("StkController[%{public}d]::SendEnvelopeCmd() wait timeout", slotId_);
600 break;
601 }
602 }
603 if (!responseFinished_) {
604 TELEPHONY_LOGE("ril cmd fail");
605 return TELEPHONY_ERR_RIL_CMD_FAIL;
606 }
607 return TELEPHONY_SUCCESS;
608 }
609
SendCallSetupRequestResult(bool accept)610 int32_t StkController::SendCallSetupRequestResult(bool accept)
611 {
612 auto event = AppExecFwk::InnerEvent::Get(RadioEvent::RADIO_STK_SEND_CALL_SETUP_REQUEST_RESULT);
613 if (event == nullptr) {
614 TELEPHONY_LOGE("StkController[%{public}d]::SendCallSetupRequestResult() event is nullptr", slotId_);
615 return TELEPHONY_ERR_FAIL;
616 }
617 event->SetOwner(shared_from_this());
618 std::shared_ptr<ITelRilManager> telRilManager = telRilManager_.lock();
619 if (telRilManager == nullptr) {
620 TELEPHONY_LOGE("StkController[%{public}d]::SendCallSetupRequestResult() telRilManager is nullptr", slotId_);
621 return TELEPHONY_ERR_FAIL;
622 }
623
624 std::unique_lock<std::mutex> callSetupRequestlock(stkMutex_);
625 callSetupResponseResult_ = TELEPHONY_ERR_FAIL;
626 responseFinished_ = false;
627 telRilManager->SendCallSetupRequestResult(slotId_, accept, event);
628 while (!responseFinished_) {
629 TELEPHONY_LOGI(
630 "StkController[%{public}d]::SendCallSetupRequestResult() wait for the response to finish", slotId_);
631 if (stkCv_.wait_for(callSetupRequestlock, std::chrono::seconds(WAIT_TIME_SECOND)) == std::cv_status::timeout) {
632 TELEPHONY_LOGE("StkController[%{public}d]::SendCallSetupRequestResult() wait timeout", slotId_);
633 responseFinished_ = true;
634 }
635 }
636 return callSetupResponseResult_;
637 }
638
OnSendTerminalResponseResult(const AppExecFwk::InnerEvent::Pointer & event)639 void StkController::OnSendTerminalResponseResult(const AppExecFwk::InnerEvent::Pointer &event)
640 {
641 if (event == nullptr) {
642 TELEPHONY_LOGE("StkController[%{public}d]::OnSendTerminalResponseResult() event is nullptr", slotId_);
643 return;
644 }
645 std::shared_ptr<RadioResponseInfo> response = event->GetSharedObject<RadioResponseInfo>();
646 if (response == nullptr) {
647 TELEPHONY_LOGE("StkController[%{public}d]::OnSendTerminalResponseResult() response is nullptr", slotId_);
648 return;
649 }
650 terminalResponseResult_ = response->error == ErrType::NONE;
651 TELEPHONY_LOGI("StkController[%{public}d]::OnSendTerminalResponseResult(), result = %{public}d",
652 slotId_, terminalResponseResult_);
653 responseFinished_ = true;
654 stkCv_.notify_one();
655 }
656
OnSendEnvelopeCmdResult(const AppExecFwk::InnerEvent::Pointer & event)657 void StkController::OnSendEnvelopeCmdResult(const AppExecFwk::InnerEvent::Pointer &event)
658 {
659 if (event == nullptr) {
660 TELEPHONY_LOGE("StkController[%{public}d]::OnSendEnvelopeCmdResult() event is nullptr", slotId_);
661 return;
662 }
663 std::shared_ptr<RadioResponseInfo> response = event->GetSharedObject<RadioResponseInfo>();
664 if (response == nullptr) {
665 TELEPHONY_LOGE("StkController[%{public}d]::OnSendEnvelopeCmdResult() response is nullptr", slotId_);
666 return;
667 }
668 envelopeResponseResult_ = response->error == ErrType::NONE;
669 TELEPHONY_LOGI("StkController[%{public}d]::OnSendEnvelopeCmdResult(), result = %{public}d",
670 slotId_, envelopeResponseResult_);
671 responseFinished_ = true;
672 stkCv_.notify_one();
673 }
674
OnSendCallSetupRequestResult(const AppExecFwk::InnerEvent::Pointer & event)675 void StkController::OnSendCallSetupRequestResult(const AppExecFwk::InnerEvent::Pointer &event)
676 {
677 if (event == nullptr) {
678 TELEPHONY_LOGE("StkController[%{public}d]::OnSendCallSetupRequestResult() event is nullptr", slotId_);
679 return;
680 }
681 std::shared_ptr<RadioResponseInfo> response = event->GetSharedObject<RadioResponseInfo>();
682 if (response == nullptr) {
683 TELEPHONY_LOGE("StkController[%{public}d]::OnSendCallSetupRequestResult() response is nullptr", slotId_);
684 return;
685 }
686 callSetupResponseResult_ = response->error == ErrType::NONE ? TELEPHONY_ERR_SUCCESS : TELEPHONY_ERR_FAIL;
687 TELEPHONY_LOGI("StkController[%{public}d]::OnSendCallSetupRequestResult(), result = %{public}d",
688 slotId_, callSetupResponseResult_);
689 responseFinished_ = true;
690 stkCv_.notify_one();
691 }
692
OnRadioStateChanged(const AppExecFwk::InnerEvent::Pointer & event)693 void StkController::OnRadioStateChanged(const AppExecFwk::InnerEvent::Pointer &event)
694 {
695 std::shared_ptr<Int32Parcel> object = event->GetSharedObject<Int32Parcel>();
696 if (object == nullptr) {
697 TELEPHONY_LOGE("StkController[%{public}d]::OnRadioStateChanged object is nullptr", slotId_);
698 return;
699 }
700
701 int32_t radioState = object->data;
702 if (radioState == CORE_SERVICE_POWER_NOT_AVAILABLE) {
703 TELEPHONY_LOGI("StkController[%{public}d]::OnRadioStateChanged radioState: -1, iccCardState: %{public}d "
704 "set to absent", slotId_, iccCardState_);
705 iccCardState_ = ICC_CARD_STATE_ABSENT;
706 }
707 }
708
709 } // namespace Telephony
710 } // namespace OHOS
711