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