• 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 #include "hril_types.h"
26 #include "if_system_ability_manager.h"
27 #include "iservice_registry.h"
28 #include "parameters.h"
29 #include "radio_event.h"
30 #include "system_ability_definition.h"
31 #include "telephony_errors.h"
32 #include "telephony_log_wrapper.h"
33 
34 namespace OHOS {
35 namespace Telephony {
36 namespace {
37 const int32_t ICC_CARD_STATE_ABSENT = 0;
38 const int32_t ICC_CARD_STATE_PRESENT = 1;
39 const int32_t WAIT_TIME_SECOND = 2; // Set the timeout for sending the stk command
40 const int32_t REFRESH_RESULT_FILE_UPDATE = 0;
41 const int32_t PARAMETER_LENGTH = 128;
42 const int64_t DELAY_TIME = 3000;
43 const int32_t MAX_RETRY_COUNT = 10;
44 const std::string PARAM_SLOTID = "slotId";
45 const std::string PARAM_MSG_CMD = "msgCmd";
46 const std::string PARAM_CARD_STATUS = "cardStatus";
47 const std::string PARAM_ALPHA_STRING = "alphaString";
48 const std::string PARAM_REFRESH_RESULT = "refreshResult";
49 const std::string STK_BUNDLE = "const.telephony.stk_bundle_name";
50 const std::string ABILITY_NAME = "ServiceExtAbility";
51 const std::string DEFAULT_BUNDLE = "";
52 } // namespace
53 
StkController(const std::weak_ptr<Telephony::ITelRilManager> & telRilManager,const std::weak_ptr<Telephony::SimStateManager> & simStateManager,int32_t slotId)54 StkController::StkController(const std::weak_ptr<Telephony::ITelRilManager> &telRilManager,
55     const std::weak_ptr<Telephony::SimStateManager> &simStateManager, int32_t slotId)
56     : TelEventHandler("StkController"), telRilManager_(telRilManager), simStateManager_(simStateManager),
57       slotId_(slotId)
58 {}
59 
Init()60 void StkController::Init()
61 {
62     stkBundleName_ = initStkBudleName();
63     RegisterEvents();
64 }
65 
initStkBudleName()66 std::string StkController::initStkBudleName()
67 {
68     char bundleName[PARAMETER_LENGTH] = { 0 };
69     GetParameter(STK_BUNDLE.c_str(), DEFAULT_BUNDLE.c_str(), bundleName, PARAMETER_LENGTH);
70     return bundleName;
71 }
72 
GetBundleMgr()73 sptr<OHOS::IRemoteObject> StkController::GetBundleMgr()
74 {
75     OHOS::sptr<OHOS::ISystemAbilityManager> systemAbilityManager =
76         OHOS::SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
77     if (systemAbilityManager == nullptr) {
78         TELEPHONY_LOGE("Failed to get ability mgr.");
79         return nullptr;
80     }
81     return systemAbilityManager->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
82 }
83 
RegisterEvents()84 void StkController::RegisterEvents()
85 {
86     std::shared_ptr<ITelRilManager> telRilManager = telRilManager_.lock();
87     if (telRilManager == nullptr) {
88         TELEPHONY_LOGE("StkController[%{public}d]::RegisterEvents() telRilManager is nullptr", slotId_);
89         return;
90     }
91     std::shared_ptr<SimStateManager> simStateManager = simStateManager_.lock();
92     if (simStateManager == nullptr) {
93         TELEPHONY_LOGE("StkController[%{public}d]::RegisterEvents() simStateManager is nullptr", slotId_);
94         return;
95     }
96     simStateManager->RegisterCoreNotify(shared_from_this(), RadioEvent::RADIO_SIM_STATE_CHANGE);
97     telRilManager->RegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_STK_SESSION_END, nullptr);
98     telRilManager->RegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_STK_PROACTIVE_COMMAND, nullptr);
99     telRilManager->RegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_STK_ALPHA_NOTIFY, nullptr);
100     telRilManager->RegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_STK_EVENT_NOTIFY, nullptr);
101     telRilManager->RegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_STK_CALL_SETUP, nullptr);
102     telRilManager->RegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_ICC_REFRESH, nullptr);
103 }
104 
UnRegisterEvents()105 void StkController::UnRegisterEvents()
106 {
107     std::shared_ptr<ITelRilManager> telRilManager = telRilManager_.lock();
108     if (telRilManager == nullptr) {
109         TELEPHONY_LOGE("StkController[%{public}d]::UnRegisterEvents() telRilManager is nullptr", slotId_);
110         return;
111     }
112     std::shared_ptr<SimStateManager> simStateManager = simStateManager_.lock();
113     if (simStateManager == nullptr) {
114         TELEPHONY_LOGE("StkController[%{public}d]::UnRegisterEvents() simStateManager is nullptr", slotId_);
115         return;
116     }
117     simStateManager->UnRegisterCoreNotify(shared_from_this(), RadioEvent::RADIO_SIM_STATE_CHANGE);
118     telRilManager->UnRegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_STK_SESSION_END);
119     telRilManager->UnRegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_STK_PROACTIVE_COMMAND);
120     telRilManager->UnRegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_STK_ALPHA_NOTIFY);
121     telRilManager->UnRegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_STK_EVENT_NOTIFY);
122     telRilManager->UnRegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_STK_CALL_SETUP);
123     telRilManager->UnRegisterCoreNotify(slotId_, shared_from_this(), RadioEvent::RADIO_ICC_REFRESH);
124 }
125 
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)126 void StkController::ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event)
127 {
128     if (event == nullptr) {
129         TELEPHONY_LOGE("StkController[%{public}d]::ProcessEvent() event is nullptr", slotId_);
130         return;
131     }
132     uint32_t id = event->GetInnerEventId();
133     switch (id) {
134         case RadioEvent::RADIO_SIM_STATE_CHANGE:
135             OnIccStateChanged(event);
136             break;
137         case RadioEvent::RADIO_STK_SESSION_END:
138             OnSendRilSessionEnd(event);
139             break;
140         case RadioEvent::RADIO_STK_PROACTIVE_COMMAND:
141             OnSendRilProactiveCommand(event);
142             break;
143         case RadioEvent::RADIO_STK_ALPHA_NOTIFY:
144             OnSendRilAlphaNotify(event);
145             break;
146         case RadioEvent::RADIO_STK_EVENT_NOTIFY:
147             OnSendRilEventNotify(event);
148             break;
149         case RadioEvent::RADIO_STK_CALL_SETUP:
150             TELEPHONY_LOGI("StkController[%{public}d]::ProcessEvent(),"
151                 " event notify command supplied all the information needed for set up call processing", slotId_);
152             break;
153         case RadioEvent::RADIO_ICC_REFRESH:
154             OnIccRefresh(event);
155             break;
156         case RadioEvent::RADIO_STK_SEND_TERMINAL_RESPONSE:
157             OnSendTerminalResponseResult(event);
158             break;
159         case RadioEvent::RADIO_STK_SEND_ENVELOPE:
160             OnSendEnvelopeCmdResult(event);
161             break;
162         case RadioEvent::RADIO_STK_IS_READY:
163             TELEPHONY_LOGI("StkController[%{public}d]::ProcessEvent() SimStkIsReady done", slotId_);
164             break;
165         case RadioEvent::RADIO_STK_SEND_CALL_SETUP_REQUEST_RESULT:
166             OnSendCallSetupRequestResult(event);
167             break;
168         case StkController::RETRY_SEND_RIL_PROACTIVE_COMMAND:
169             RetrySendRilProactiveCommand();
170             break;
171         default:
172             TELEPHONY_LOGE("StkController[%{public}d]::ProcessEvent() unknown event", slotId_);
173             break;
174     }
175 }
176 
OnIccStateChanged(const AppExecFwk::InnerEvent::Pointer & event)177 void StkController::OnIccStateChanged(const AppExecFwk::InnerEvent::Pointer &event)
178 {
179     std::shared_ptr<SimStateManager> simStateManager = simStateManager_.lock();
180     if (simStateManager == nullptr) {
181         TELEPHONY_LOGE("StkController[%{public}d]::OnIccStateChanged() simStateManager is nullptr", slotId_);
182         return;
183     }
184     int32_t newState = simStateManager->HasSimCard() ? ICC_CARD_STATE_PRESENT : ICC_CARD_STATE_ABSENT;
185     int32_t oldState = iccCardState_;
186     iccCardState_ = newState;
187     TELEPHONY_LOGI("StkController[%{public}d]::OnIccStateChanged(), oldState: %{public}d newState: %{public}d",
188         slotId_, oldState, newState);
189     if (oldState == ICC_CARD_STATE_PRESENT && newState == ICC_CARD_STATE_ABSENT) {
190         AAFwk::Want want;
191         want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_STK_CARD_STATE_CHANGED);
192         want.SetParam(PARAM_SLOTID, slotId_);
193         want.SetParam(PARAM_CARD_STATUS, iccCardState_);
194         bool publishResult = PublishStkEvent(want);
195         TELEPHONY_LOGI("StkController[%{public}d]::OnIccStateChanged() publishResult = %{public}d",
196             slotId_, publishResult);
197     } else if (oldState == ICC_CARD_STATE_ABSENT && newState == ICC_CARD_STATE_PRESENT) {
198         TELEPHONY_LOGI("StkController[%{public}d]::OnIccStateChanged(), call SimStkIsReady()", slotId_);
199         auto event = AppExecFwk::InnerEvent::Get(RadioEvent::RADIO_STK_IS_READY);
200         if (event == nullptr) {
201             TELEPHONY_LOGE("StkController[%{public}d]::OnIccStateChanged() event is nullptr", slotId_);
202             return;
203         }
204         event->SetOwner(shared_from_this());
205         std::shared_ptr<ITelRilManager> telRilManager = telRilManager_.lock();
206         if (telRilManager == nullptr) {
207             TELEPHONY_LOGE("StkController[%{public}d]::OnIccStateChanged() telRilManager is nullptr", slotId_);
208             return;
209         }
210         telRilManager->SimStkIsReady(slotId_, event);
211     }
212 }
213 
OnSendRilSessionEnd(const AppExecFwk::InnerEvent::Pointer & event)214 void StkController::OnSendRilSessionEnd(const AppExecFwk::InnerEvent::Pointer &event)
215 {
216     AAFwk::Want want;
217     want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_STK_SESSION_END);
218     want.SetParam(PARAM_SLOTID, slotId_);
219     bool publishResult = PublishStkEvent(want);
220     TELEPHONY_LOGI("StkController[%{public}d]::OnSendRilSessionEnd() publishResult = %{public}d",
221         slotId_, publishResult);
222 }
223 
OnSendRilProactiveCommand(const AppExecFwk::InnerEvent::Pointer & event)224 void StkController::OnSendRilProactiveCommand(const AppExecFwk::InnerEvent::Pointer &event)
225 {
226     auto stkData = event->GetSharedObject<std::string>();
227     if (stkData == nullptr) {
228         TELEPHONY_LOGE("StkController[%{public}d]::OnSendRilProactiveCommand() stkData is nullptr", slotId_);
229         return;
230     }
231     std::string cmdData = (std::string)*stkData;
232     AAFwk::Want want;
233     want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_STK_COMMAND);
234     want.SetParam(PARAM_SLOTID, slotId_);
235     want.SetParam(PARAM_MSG_CMD, cmdData);
236     bool publishResult = PublishStkEvent(want);
237     TELEPHONY_LOGI("StkController[%{public}d]::OnSendRilProactiveCommand() stkData = %{public}s "
238         "publishResult = %{public}d", slotId_, cmdData.c_str(), publishResult);
239     if (!publishResult) {
240         retryWant_ = want;
241         remainTryCount_ = MAX_RETRY_COUNT;
242         SendEvent(StkController::RETRY_SEND_RIL_PROACTIVE_COMMAND, 0, DELAY_TIME);
243         return;
244     }
245     remainTryCount_ = 0;
246 }
247 
RetrySendRilProactiveCommand()248 void StkController::RetrySendRilProactiveCommand()
249 {
250     remainTryCount_--;
251     TELEPHONY_LOGI("StkController[%{public}d], remainTryCount_ is %{public}d", slotId_, remainTryCount_);
252     if (remainTryCount_ > 0) {
253         if (!PublishStkEvent(retryWant_)) {
254             SendEvent(StkController::RETRY_SEND_RIL_PROACTIVE_COMMAND, 0, DELAY_TIME);
255             return;
256         }
257         TELEPHONY_LOGI("StkController[%{public}d] retry sucess", slotId_);
258         remainTryCount_ = 0;
259         return;
260     }
261     TELEPHONY_LOGI("StkController[%{public}d] stop retry", slotId_);
262 }
263 
OnSendRilAlphaNotify(const AppExecFwk::InnerEvent::Pointer & event)264 void StkController::OnSendRilAlphaNotify(const AppExecFwk::InnerEvent::Pointer &event)
265 {
266     auto alphaData = event->GetSharedObject<std::string>();
267     if (alphaData == nullptr) {
268         TELEPHONY_LOGE("StkController[%{public}d]::OnSendRilAlphaNotify() alphaData is nullptr", slotId_);
269         return;
270     }
271     std::string cmdData = (std::string)*alphaData;
272     AAFwk::Want want;
273     want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_STK_ALPHA_IDENTIFIER);
274     want.SetParam(PARAM_SLOTID, slotId_);
275     want.SetParam(PARAM_ALPHA_STRING, cmdData);
276     bool publishResult = PublishStkEvent(want);
277     TELEPHONY_LOGI("StkController[%{public}d]::OnSendRilAlphaNotify() alphaData = %{public}s "
278         "publishResult = %{public}d", slotId_, cmdData.c_str(), publishResult);
279 }
280 
OnSendRilEventNotify(const AppExecFwk::InnerEvent::Pointer & event)281 void StkController::OnSendRilEventNotify(const AppExecFwk::InnerEvent::Pointer &event)
282 {
283     auto eventData = event->GetSharedObject<std::string>();
284     if (eventData == nullptr) {
285         TELEPHONY_LOGE("StkController[%{public}d]::OnSendRilEventNotify() eventData is nullptr", slotId_);
286         return;
287     }
288     std::string cmdData = (std::string)*eventData;
289     AAFwk::Want want;
290     want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_STK_COMMAND);
291     want.SetParam(PARAM_SLOTID, slotId_);
292     want.SetParam(PARAM_MSG_CMD, cmdData);
293     bool publishResult = PublishStkEvent(want);
294     TELEPHONY_LOGI("StkController[%{public}d]::OnSendRilEventNotify() eventData = %{public}s "
295         "publishResult = %{public}d", slotId_, cmdData.c_str(), publishResult);
296 }
297 
OnIccRefresh(const AppExecFwk::InnerEvent::Pointer & event)298 void StkController::OnIccRefresh(const AppExecFwk::InnerEvent::Pointer &event)
299 {
300     auto refreshResult = event->GetSharedObject<int32_t>();
301     int32_t result = REFRESH_RESULT_FILE_UPDATE;
302     if (refreshResult == nullptr) {
303         TELEPHONY_LOGE("StkController[%{public}d]::OnIccRefresh() refreshResult is nullptr", slotId_);
304     } else {
305         result = (int32_t)*refreshResult;
306     }
307     AAFwk::Want want;
308     want.SetAction(EventFwk::CommonEventSupport::COMMON_EVENT_STK_CARD_STATE_CHANGED);
309     want.SetParam(PARAM_SLOTID, slotId_);
310     want.SetParam(PARAM_CARD_STATUS, ICC_CARD_STATE_PRESENT);
311     want.SetParam(PARAM_REFRESH_RESULT, result);
312     bool publishResult = PublishStkEvent(want);
313     TELEPHONY_LOGI("StkController[%{public}d]::OnIccRefresh() refresh result = %{public}d publishResult = %{public}d",
314         slotId_, result, publishResult);
315 }
316 
PublishStkEvent(AAFwk::Want & want)317 bool StkController::PublishStkEvent(AAFwk::Want &want)
318 {
319     if (stkBundleName_.empty()) {
320         TELEPHONY_LOGE("stkBundleName_ is empty");
321         return false;
322     }
323     if (!CheckIsSystemApp(stkBundleName_)) {
324         TELEPHONY_LOGE("is not system app");
325         return false;
326     }
327     AppExecFwk::ElementName element("", stkBundleName_, ABILITY_NAME);
328     want.SetElement(element);
329     int32_t accountId = -1;
330     auto ret = AAFwk::AbilityManagerClient::GetInstance()->StartExtensionAbility(
331         want, nullptr, accountId, AppExecFwk::ExtensionAbilityType::SERVICE);
332     return ret == 0;
333 }
334 
CheckIsSystemApp(const std::string & bundleName)335 bool StkController::CheckIsSystemApp(const std::string &bundleName)
336 {
337     sptr<OHOS::IRemoteObject> remoteObject = GetBundleMgr();
338     if (remoteObject == nullptr) {
339         TELEPHONY_LOGE("error to get bundleMgr");
340         return false;
341     }
342     sptr<AppExecFwk::IBundleMgr> iBundleMgr = OHOS::iface_cast<AppExecFwk::IBundleMgr>(remoteObject);
343     if (iBundleMgr == nullptr) {
344         TELEPHONY_LOGE("iBundleMgr is null");
345         return false;
346     }
347     OHOS::AppExecFwk::BundleInfo info;
348     info.applicationInfo.isSystemApp = false;
349     if (!iBundleMgr->GetBundleInfo(
350         bundleName, OHOS::AppExecFwk::GET_BUNDLE_DEFAULT, info, AppExecFwk::Constants::ALL_USERID)) {
351         TELEPHONY_LOGE("Failed to get bundleInfo from bundleMgr");
352     } else {
353         TELEPHONY_LOGI("isSystemApp =%{public}d", info.applicationInfo.isSystemApp);
354     }
355     return info.applicationInfo.isSystemApp;
356 }
357 
SendTerminalResponseCmd(const std::string & strCmd)358 int32_t StkController::SendTerminalResponseCmd(const std::string &strCmd)
359 {
360     auto event = AppExecFwk::InnerEvent::Get(RadioEvent::RADIO_STK_SEND_TERMINAL_RESPONSE);
361     if (event == nullptr) {
362         TELEPHONY_LOGE("StkController[%{public}d]::SendTerminalResponseCmd() event is nullptr", slotId_);
363         return TELEPHONY_ERR_LOCAL_PTR_NULL;
364     }
365     event->SetOwner(shared_from_this());
366     std::shared_ptr<ITelRilManager> telRilManager = telRilManager_.lock();
367     if (telRilManager == nullptr) {
368         TELEPHONY_LOGE("StkController[%{public}d]::SendTerminalResponseCmd() telRilManager is nullptr", slotId_);
369         return TELEPHONY_ERR_LOCAL_PTR_NULL;
370     }
371 
372     std::unique_lock<std::mutex> terminalResponselock(stkMutex_);
373     terminalResponseResult_ = 0;
374     responseFinished_ = false;
375     telRilManager->SendTerminalResponseCmd(slotId_, strCmd, event);
376     while (!responseFinished_) {
377         TELEPHONY_LOGI("StkController[%{public}d]::SendTerminalResponseCmd() wait for the response to finish", slotId_);
378         if (stkCv_.wait_for(terminalResponselock, std::chrono::seconds(WAIT_TIME_SECOND)) == std::cv_status::timeout) {
379             TELEPHONY_LOGE("StkController[%{public}d]::SendTerminalResponseCmd() wait timeout", slotId_);
380             break;
381         }
382     }
383     if (!responseFinished_) {
384         TELEPHONY_LOGE("ril cmd fail");
385         return TELEPHONY_ERR_RIL_CMD_FAIL;
386     }
387     return TELEPHONY_SUCCESS;
388 }
389 
SendEnvelopeCmd(const std::string & strCmd)390 int32_t StkController::SendEnvelopeCmd(const std::string &strCmd)
391 {
392     auto event = AppExecFwk::InnerEvent::Get(RadioEvent::RADIO_STK_SEND_ENVELOPE);
393     if (event == nullptr) {
394         TELEPHONY_LOGE("StkController[%{public}d]::SendEnvelopeCmd() event is nullptr", slotId_);
395         return TELEPHONY_ERR_LOCAL_PTR_NULL;
396     }
397     event->SetOwner(shared_from_this());
398     std::shared_ptr<ITelRilManager> telRilManager = telRilManager_.lock();
399     if (telRilManager == nullptr) {
400         TELEPHONY_LOGE("StkController[%{public}d]::SendEnvelopeCmd() telRilManager is nullptr", slotId_);
401         return TELEPHONY_ERR_LOCAL_PTR_NULL;
402     }
403 
404     std::unique_lock<std::mutex> envelopelock(stkMutex_);
405     envelopeResponseResult_ = 0;
406     responseFinished_ = false;
407     telRilManager->SendEnvelopeCmd(slotId_, strCmd, event);
408     while (!responseFinished_) {
409         TELEPHONY_LOGI("StkController[%{public}d]::SendEnvelopeCmd() wait for the response to finish", slotId_);
410         if (stkCv_.wait_for(envelopelock, std::chrono::seconds(WAIT_TIME_SECOND)) == std::cv_status::timeout) {
411             TELEPHONY_LOGE("StkController[%{public}d]::SendEnvelopeCmd() wait timeout", slotId_);
412             break;
413         }
414     }
415     if (!responseFinished_) {
416         TELEPHONY_LOGE("ril cmd fail");
417         return TELEPHONY_ERR_RIL_CMD_FAIL;
418     }
419     return TELEPHONY_SUCCESS;
420 }
421 
SendCallSetupRequestResult(bool accept)422 int32_t StkController::SendCallSetupRequestResult(bool accept)
423 {
424     auto event = AppExecFwk::InnerEvent::Get(RadioEvent::RADIO_STK_SEND_CALL_SETUP_REQUEST_RESULT);
425     if (event == nullptr) {
426         TELEPHONY_LOGE("StkController[%{public}d]::SendCallSetupRequestResult() event is nullptr", slotId_);
427         return TELEPHONY_ERR_FAIL;
428     }
429     event->SetOwner(shared_from_this());
430     std::shared_ptr<ITelRilManager> telRilManager = telRilManager_.lock();
431     if (telRilManager == nullptr) {
432         TELEPHONY_LOGE("StkController[%{public}d]::SendCallSetupRequestResult() telRilManager is nullptr", slotId_);
433         return TELEPHONY_ERR_FAIL;
434     }
435 
436     std::unique_lock<std::mutex> callSetupRequestlock(stkMutex_);
437     callSetupResponseResult_ = TELEPHONY_ERR_FAIL;
438     responseFinished_ = false;
439     telRilManager->SendCallSetupRequestResult(slotId_, accept, event);
440     while (!responseFinished_) {
441         TELEPHONY_LOGI(
442             "StkController[%{public}d]::SendCallSetupRequestResult() wait for the response to finish", slotId_);
443         if (stkCv_.wait_for(callSetupRequestlock, std::chrono::seconds(WAIT_TIME_SECOND)) == std::cv_status::timeout) {
444             TELEPHONY_LOGE("StkController[%{public}d]::SendCallSetupRequestResult() wait timeout", slotId_);
445             responseFinished_ = true;
446         }
447     }
448     return callSetupResponseResult_;
449 }
450 
OnSendTerminalResponseResult(const AppExecFwk::InnerEvent::Pointer & event)451 void StkController::OnSendTerminalResponseResult(const AppExecFwk::InnerEvent::Pointer &event)
452 {
453     if (event == nullptr) {
454         TELEPHONY_LOGE("StkController[%{public}d]::OnSendTerminalResponseResult() event is nullptr", slotId_);
455         return;
456     }
457     std::shared_ptr<HRilRadioResponseInfo> response = event->GetSharedObject<HRilRadioResponseInfo>();
458     if (response == nullptr) {
459         TELEPHONY_LOGE("StkController[%{public}d]::OnSendTerminalResponseResult() response is nullptr", slotId_);
460         return;
461     }
462     terminalResponseResult_ = response->error == HRilErrType::NONE;
463     TELEPHONY_LOGI("StkController[%{public}d]::OnSendTerminalResponseResult(), result = %{public}d",
464         slotId_, terminalResponseResult_);
465     responseFinished_ = true;
466     stkCv_.notify_one();
467 }
468 
OnSendEnvelopeCmdResult(const AppExecFwk::InnerEvent::Pointer & event)469 void StkController::OnSendEnvelopeCmdResult(const AppExecFwk::InnerEvent::Pointer &event)
470 {
471     if (event == nullptr) {
472         TELEPHONY_LOGE("StkController[%{public}d]::OnSendEnvelopeCmdResult() event is nullptr", slotId_);
473         return;
474     }
475     std::shared_ptr<HRilRadioResponseInfo> response = event->GetSharedObject<HRilRadioResponseInfo>();
476     if (response == nullptr) {
477         TELEPHONY_LOGE("StkController[%{public}d]::OnSendEnvelopeCmdResult() response is nullptr", slotId_);
478         return;
479     }
480     envelopeResponseResult_ = response->error == HRilErrType::NONE;
481     TELEPHONY_LOGI("StkController[%{public}d]::OnSendEnvelopeCmdResult(), result = %{public}d",
482         slotId_, envelopeResponseResult_);
483     responseFinished_ = true;
484     stkCv_.notify_one();
485 }
486 
OnSendCallSetupRequestResult(const AppExecFwk::InnerEvent::Pointer & event)487 void StkController::OnSendCallSetupRequestResult(const AppExecFwk::InnerEvent::Pointer &event)
488 {
489     if (event == nullptr) {
490         TELEPHONY_LOGE("StkController[%{public}d]::OnSendCallSetupRequestResult() event is nullptr", slotId_);
491         return;
492     }
493     std::shared_ptr<HRilRadioResponseInfo> response = event->GetSharedObject<HRilRadioResponseInfo>();
494     if (response == nullptr) {
495         TELEPHONY_LOGE("StkController[%{public}d]::OnSendCallSetupRequestResult() response is nullptr", slotId_);
496         return;
497     }
498     callSetupResponseResult_ = response->error == HRilErrType::NONE ? TELEPHONY_ERR_SUCCESS : TELEPHONY_ERR_FAIL;
499     TELEPHONY_LOGI("StkController[%{public}d]::OnSendCallSetupRequestResult(), result = %{public}d",
500         slotId_, callSetupResponseResult_);
501     responseFinished_ = true;
502     stkCv_.notify_one();
503 }
504 } // namespace Telephony
505 } // namespace OHOS
506