• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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