1 /*
2 * Copyright (C) 2023 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 "satellite_control.h"
17
18 #include "cellular_call_hisysevent.h"
19 #include "cellular_call_register.h"
20 #include "module_service_utils.h"
21 #include "securec.h"
22 #include "standardize_utils.h"
23
24 namespace OHOS {
25 namespace Telephony {
26
~SatelliteControl()27 SatelliteControl::~SatelliteControl()
28 {
29 ReleaseAllConnection();
30 }
31
Dial(const CellularCallInfo & callInfo,bool isEcc)32 int32_t SatelliteControl::Dial(const CellularCallInfo &callInfo, bool isEcc)
33 {
34 TELEPHONY_LOGI("DialSatellite start");
35 DelayedSingleton<CellularCallHiSysEvent>::GetInstance()->SetCallParameterInfo(
36 callInfo.slotId, static_cast<int32_t>(callInfo.callType), callInfo.videoState);
37 int32_t ret = DialPreJudgment(callInfo, false);
38 if (ret != TELEPHONY_SUCCESS) {
39 return ret;
40 }
41 StandardizeUtils standardizeUtils;
42 // Remove the phone number separator
43 std::string newPhoneNum = standardizeUtils.RemoveSeparatorsPhoneNumber(callInfo.phoneNum);
44
45 CLIRMode clirMode = CLIRMode::DEFAULT;
46 if (IsNeedExecuteMMI(callInfo.slotId, newPhoneNum, clirMode, false)) {
47 TELEPHONY_LOGI("DialSatellite return, mmi code type.");
48 return RETURN_TYPE_MMI;
49 }
50
51 std::lock_guard<std::recursive_mutex> lock(connectionMapMutex_);
52 if (!CanCall(connectionMap_)) {
53 TELEPHONY_LOGE("DialSatellite return, error type: call state error.");
54 CellularCallHiSysEvent::WriteDialCallFaultEvent(callInfo.slotId, static_cast<int32_t>(callInfo.callType),
55 callInfo.videoState, CALL_ERR_CALL_COUNTS_EXCEED_LIMIT, "DSatellite dial call state error");
56 return CALL_ERR_CALL_COUNTS_EXCEED_LIMIT;
57 }
58
59 return EncapsulateDialCommon(callInfo.slotId, newPhoneNum, clirMode);
60 }
61
EncapsulateDialCommon(int32_t slotId,const std::string & phoneNum,CLIRMode & clirMode)62 int32_t SatelliteControl::EncapsulateDialCommon(int32_t slotId, const std::string &phoneNum, CLIRMode &clirMode)
63 {
64 pendingPhoneNumber_ = phoneNum;
65 DialRequestStruct dialRequest;
66 /**
67 * <idx>: integer type;
68 * call identification number as described in 3GPP TS 22.030 [19] subclause 4.5.5.1
69 * this number can be used in +CHLD command operations
70 * <dir>:
71 */
72 dialRequest.phoneNum = phoneNum;
73
74 /**
75 * <n> (parameter sets the adjustment for outgoing calls):
76 * 0 presentation indicator is used according to the subscription of the CLIR service
77 * 1 CLIR invocation
78 * 2 CLIR suppression
79 */
80 dialRequest.clirMode = clirMode;
81
82 /**
83 * An example of voice group call service request usage:
84 * ATD*17*753#500; (originate voice group call with the priority level 3)
85 * OK (voice group call setup was successful)
86 */
87 CellularCallConnectionSatellite satelliteConnection;
88 return satelliteConnection.DialRequest(slotId, dialRequest);
89 }
90
HangUp(const CellularCallInfo & callInfo,CallSupplementType type)91 int32_t SatelliteControl::HangUp(const CellularCallInfo &callInfo, CallSupplementType type)
92 {
93 TELEPHONY_LOGI("HangUp start");
94 switch (type) {
95 case CallSupplementType::TYPE_DEFAULT: {
96 // Match the session connection according to the phone number string
97 std::lock_guard<std::recursive_mutex> lock(connectionMapMutex_);
98 auto pConnection = FindConnectionByIndex<SatelliteConnectionMap &, CellularCallConnectionSatellite *>(
99 connectionMap_, callInfo.index);
100 if (pConnection == nullptr) {
101 TELEPHONY_LOGE("HangUp, error type: connection is null");
102 CellularCallHiSysEvent::WriteHangUpFaultEvent(
103 callInfo.slotId, callInfo.callId, CALL_ERR_CALL_CONNECTION_NOT_EXIST, "HangUp pConnection is null");
104 return CALL_ERR_CALL_CONNECTION_NOT_EXIST;
105 }
106
107 if (DelayedSingleton<CellularCallRegister>::GetInstance() != nullptr) {
108 DelayedSingleton<CellularCallRegister>::GetInstance()->ReportSingleCallInfo(
109 pConnection->GetCallReportInfo(), TelCallState::CALL_STATUS_DISCONNECTING);
110 }
111 return pConnection->HangUpRequest(callInfo.slotId);
112 }
113 default: {
114 TELEPHONY_LOGE("HangUp warring, type is invalid");
115 CellularCallHiSysEvent::WriteHangUpFaultEvent(
116 callInfo.slotId, callInfo.callId, TELEPHONY_ERR_ARGUMENT_INVALID, "HangUp type is invalid");
117 return TELEPHONY_ERR_ARGUMENT_INVALID;
118 }
119 }
120 }
121
Answer(const CellularCallInfo & callInfo)122 int32_t SatelliteControl::Answer(const CellularCallInfo &callInfo)
123 {
124 TELEPHONY_LOGI("SatelliteControl::Answer start");
125 std::lock_guard<std::recursive_mutex> lock(connectionMapMutex_);
126 auto pConnection = FindConnectionByIndex<SatelliteConnectionMap &, CellularCallConnectionSatellite *>(
127 connectionMap_, callInfo.index);
128 if (pConnection == nullptr) {
129 TELEPHONY_LOGE("Answer return, error type: connection is null");
130 CellularCallHiSysEvent::WriteAnswerCallFaultEvent(callInfo.slotId, callInfo.callId, callInfo.videoState,
131 CALL_ERR_CALL_CONNECTION_NOT_EXIST, "get connection data is null");
132 return CALL_ERR_CALL_CONNECTION_NOT_EXIST;
133 }
134 // There is an active call when you call, or third party call waiting
135 if (IsInState(connectionMap_, TelCallState::CALL_STATUS_ACTIVE) ||
136 pConnection->GetStatus() == TelCallState::CALL_STATUS_WAITING) {
137 TELEPHONY_LOGI("Answer there is an active call when you call, or third party call waiting");
138 auto con = FindConnectionByState<SatelliteConnectionMap &, CellularCallConnectionSatellite *>(
139 connectionMap_, TelCallState::CALL_STATUS_ACTIVE);
140 if (con != nullptr) {
141 TELEPHONY_LOGI("Answer: There is an active session currently, and it needs to hold");
142 con->HangUpRequest(callInfo.slotId);
143 } else {
144 TELEPHONY_LOGE("Answer return, error type: con is null, there are no active calls");
145 }
146 }
147
148 if (pConnection->GetStatus() == TelCallState::CALL_STATUS_INCOMING ||
149 pConnection->GetStatus() == TelCallState::CALL_STATUS_ALERTING ||
150 pConnection->GetStatus() == TelCallState::CALL_STATUS_WAITING) {
151 return pConnection->AnswerRequest(callInfo.slotId);
152 }
153
154 TELEPHONY_LOGE("SatelliteControl::Answer return, error type: call state error, phone not ringing.");
155 CellularCallHiSysEvent::WriteAnswerCallFaultEvent(callInfo.slotId, callInfo.callId, callInfo.videoState,
156 CALL_ERR_CALL_STATE, "call state error phone not ringing");
157 return CALL_ERR_CALL_STATE;
158 }
159
Reject(const CellularCallInfo & callInfo)160 int32_t SatelliteControl::Reject(const CellularCallInfo &callInfo)
161 {
162 TELEPHONY_LOGI("SatelliteControl::Reject start");
163 std::lock_guard<std::recursive_mutex> lock(connectionMapMutex_);
164 auto pConnection = FindConnectionByIndex<SatelliteConnectionMap &, CellularCallConnectionSatellite *>(
165 connectionMap_, callInfo.index);
166 if (pConnection == nullptr) {
167 TELEPHONY_LOGE("SatelliteControl::Reject, error type: connection is null");
168 CellularCallHiSysEvent::WriteHangUpFaultEvent(
169 callInfo.slotId, callInfo.callId, CALL_ERR_CALL_CONNECTION_NOT_EXIST, "Reject pConnection is null");
170 return CALL_ERR_CALL_CONNECTION_NOT_EXIST;
171 }
172 if (!pConnection->IsRingingState()) {
173 TELEPHONY_LOGE("CSControl::Reject return, error type: call state error, phone not ringing.");
174 CellularCallHiSysEvent::WriteHangUpFaultEvent(
175 callInfo.slotId, callInfo.callId, CALL_ERR_CALL_STATE, "Reject call state error phone not ringing");
176 return CALL_ERR_CALL_STATE;
177 }
178 if (DelayedSingleton<CellularCallRegister>::GetInstance() != nullptr) {
179 DelayedSingleton<CellularCallRegister>::GetInstance()->ReportSingleCallInfo(
180 pConnection->GetCallReportInfo(), TelCallState::CALL_STATUS_DISCONNECTING);
181 }
182 return pConnection->RejectRequest(callInfo.slotId);
183 }
184
ReportSatelliteCallsData(int32_t slotId,const SatelliteCurrentCallList & callInfoList)185 int32_t SatelliteControl::ReportSatelliteCallsData(int32_t slotId, const SatelliteCurrentCallList &callInfoList)
186 {
187 std::lock_guard<std::recursive_mutex> lock(connectionMapMutex_);
188 if (callInfoList.callSize <= 0) {
189 return ReportHangUpInfo(slotId);
190 } else if (callInfoList.callSize > 0 && connectionMap_.empty()) {
191 return ReportIncomingInfo(slotId, callInfoList);
192 } else if (callInfoList.callSize > 0 && !connectionMap_.empty()) {
193 return ReportUpdateInfo(slotId, callInfoList);
194 }
195 return TELEPHONY_ERROR;
196 }
197
ReportUpdateInfo(int32_t slotId,const SatelliteCurrentCallList & callInfoList)198 int32_t SatelliteControl::ReportUpdateInfo(int32_t slotId, const SatelliteCurrentCallList &callInfoList)
199 {
200 TELEPHONY_LOGD("ReportUpdateInfo entry");
201 CallsReportInfo callsReportInfo;
202 for (int32_t i = 0; i < callInfoList.callSize; ++i) {
203 CallReportInfo reportInfo = EncapsulationCallReportInfo(slotId, callInfoList.calls[i]);
204
205 auto pConnection = FindConnectionByIndex<SatelliteConnectionMap &, CellularCallConnectionSatellite *>(
206 connectionMap_, callInfoList.calls[i].index);
207 if (pConnection == nullptr) {
208 CellularCallConnectionSatellite connection;
209 connection.SetOrUpdateCallReportInfo(reportInfo);
210 connection.SetFlag(true);
211 connection.SetIndex(callInfoList.calls[i].index);
212 connection.SetNumber(callInfoList.calls[i].number);
213 SetConnectionData(connectionMap_, callInfoList.calls[i].index, connection);
214 } else {
215 pConnection->SetFlag(true);
216 pConnection->SetIndex(callInfoList.calls[i].index);
217 pConnection->SetOrUpdateCallReportInfo(reportInfo);
218 pConnection->SetNumber(callInfoList.calls[i].number);
219 }
220 callsReportInfo.callVec.push_back(reportInfo);
221 }
222 callsReportInfo.slotId = slotId;
223 DeleteConnection(callsReportInfo, callInfoList);
224 if (DelayedSingleton<CellularCallRegister>::GetInstance() == nullptr) {
225 TELEPHONY_LOGE("ReportUpdateInfo return, GetInstance() is nullptr.");
226 return TELEPHONY_ERR_LOCAL_PTR_NULL;
227 }
228 if (!isIgnoredIncomingCall_) {
229 DelayedSingleton<CellularCallRegister>::GetInstance()->ReportCallsInfo(callsReportInfo);
230 }
231 return TELEPHONY_SUCCESS;
232 }
233
DeleteConnection(CallsReportInfo & callsReportInfo,const SatelliteCurrentCallList & callInfoList)234 void SatelliteControl::DeleteConnection(CallsReportInfo &callsReportInfo, const SatelliteCurrentCallList &callInfoList)
235 {
236 TELEPHONY_LOGI("DeleteConnection entry");
237 auto it = connectionMap_.begin();
238 while (it != connectionMap_.end()) {
239 CallReportInfo callReportInfo = it->second.GetCallReportInfo();
240 if (!it->second.GetFlag()) {
241 callReportInfo.state = TelCallState::CALL_STATUS_DISCONNECTED;
242 callsReportInfo.callVec.push_back(callReportInfo);
243 connectionMap_.erase(it++);
244 GetCallFailReason(callsReportInfo.slotId, connectionMap_);
245 } else {
246 it->second.SetFlag(false);
247 ++it;
248 }
249 }
250 }
251
EncapsulationCallReportInfo(int32_t slotId,const SatelliteCurrentCall & callInfo)252 CallReportInfo SatelliteControl::EncapsulationCallReportInfo(int32_t slotId, const SatelliteCurrentCall &callInfo)
253 {
254 CallReportInfo callReportInfo;
255 if (memset_s(&callReportInfo, sizeof(callReportInfo), 0, sizeof(callReportInfo)) != EOK) {
256 TELEPHONY_LOGE("EncapsulationCallReportInfo return, memset_s fail.");
257 return callReportInfo;
258 }
259 size_t cpyLen = strlen(callInfo.number.c_str()) + 1;
260 if (cpyLen > static_cast<size_t>(kMaxNumberLen + 1)) {
261 TELEPHONY_LOGE("EncapsulationCallReportInfo return, strcpy_s fail.");
262 return callReportInfo;
263 }
264 if (strcpy_s(callReportInfo.accountNum, cpyLen, callInfo.number.c_str()) != EOK) {
265 TELEPHONY_LOGE("EncapsulationCallReportInfo return, strcpy_s fail.");
266 return callReportInfo;
267 }
268 callReportInfo.index = callInfo.index;
269 callReportInfo.accountId = slotId;
270 callReportInfo.voiceDomain = callInfo.voiceDomain;
271 callReportInfo.state = static_cast<TelCallState>(callInfo.state);
272 callReportInfo.callType = CallType::TYPE_SATELLITE;
273 callReportInfo.callMode = VideoStateType::TYPE_VOICE;
274 callReportInfo.mpty = callInfo.mpty;
275 return callReportInfo;
276 }
277
ReportIncomingInfo(int32_t slotId,const SatelliteCurrentCallList & callInfoList)278 int32_t SatelliteControl::ReportIncomingInfo(int32_t slotId, const SatelliteCurrentCallList &callInfoList)
279 {
280 TELEPHONY_LOGI("ReportIncomingInfo entry");
281 CallsReportInfo callsReportInfo;
282 for (int32_t i = 0; i < callInfoList.callSize; ++i) {
283 CallReportInfo cellularCallReportInfo = EncapsulationCallReportInfo(slotId, callInfoList.calls[i]);
284
285 CellularCallConnectionSatellite connection;
286 connection.SetStatus(static_cast<TelCallState>(callInfoList.calls[i].state));
287 connection.SetIndex(callInfoList.calls[i].index);
288 connection.SetOrUpdateCallReportInfo(cellularCallReportInfo);
289 connection.SetNumber(callInfoList.calls[i].number);
290 SetConnectionData(connectionMap_, callInfoList.calls[i].index, connection);
291
292 callsReportInfo.callVec.push_back(cellularCallReportInfo);
293 }
294 if (DelayedSingleton<CellularCallRegister>::GetInstance() == nullptr) {
295 TELEPHONY_LOGE("ReportIncomingInfo return, GetInstance() is nullptr.");
296 return TELEPHONY_ERR_ARGUMENT_INVALID;
297 }
298 callsReportInfo.slotId = slotId;
299 if (!DelayedSingleton<CellularCallRegister>::GetInstance()->IsCallManagerCallBackRegistered() &&
300 callsReportInfo.callVec.size() != 0 && callsReportInfo.callVec[0].state == TelCallState::CALL_STATUS_INCOMING) {
301 isIgnoredIncomingCall_ = true;
302 } else {
303 DelayedSingleton<CellularCallRegister>::GetInstance()->ReportCallsInfo(callsReportInfo);
304 }
305 return TELEPHONY_SUCCESS;
306 }
307
ReportHangUpInfo(int32_t slotId)308 int32_t SatelliteControl::ReportHangUpInfo(int32_t slotId)
309 {
310 TELEPHONY_LOGD("ReportHangUpInfo entry");
311 CallsReportInfo callsReportInfo;
312 for (auto &it : connectionMap_) {
313 CallReportInfo callReportInfo = it.second.GetCallReportInfo();
314 callReportInfo.state = TelCallState::CALL_STATUS_DISCONNECTED;
315 callReportInfo.accountId = slotId;
316 callsReportInfo.callVec.push_back(callReportInfo);
317 GetCallFailReason(slotId, connectionMap_);
318 }
319 if (connectionMap_.empty()) {
320 TELEPHONY_LOGI("connectionMap_ is empty");
321 CallReportInfo reportInfo;
322 reportInfo.state = TelCallState::CALL_STATUS_DISCONNECTED;
323 reportInfo.accountId = slotId;
324 callsReportInfo.callVec.push_back(reportInfo);
325 }
326 if (DelayedSingleton<CellularCallRegister>::GetInstance() == nullptr) {
327 TELEPHONY_LOGE("ReportHangUpInfo return, GetInstance() is nullptr.");
328 return TELEPHONY_ERR_LOCAL_PTR_NULL;
329 }
330 callsReportInfo.slotId = slotId;
331 if (isIgnoredIncomingCall_) {
332 isIgnoredIncomingCall_ = false;
333 } else {
334 DelayedSingleton<CellularCallRegister>::GetInstance()->ReportCallsInfo(callsReportInfo);
335 }
336 ReleaseAllConnection();
337 return TELEPHONY_SUCCESS;
338 }
339
ReleaseAllConnection()340 void SatelliteControl::ReleaseAllConnection()
341 {
342 TELEPHONY_LOGI("ReleaseAllConnection entry");
343 std::lock_guard<std::recursive_mutex> lock(connectionMapMutex_);
344 connectionMap_.clear();
345 }
346
GetConnectionMap()347 SatelliteConnectionMap SatelliteControl::GetConnectionMap()
348 {
349 TELEPHONY_LOGI("GetConnectionMap entry");
350 std::lock_guard<std::recursive_mutex> lock(connectionMapMutex_);
351 return connectionMap_;
352 }
353
ReportHangUp(const std::vector<CellularCallInfo> & infos,int32_t slotId)354 int32_t SatelliteControl::ReportHangUp(const std::vector<CellularCallInfo> &infos, int32_t slotId)
355 {
356 CallsReportInfo callsReportInfo;
357 callsReportInfo.slotId = slotId;
358 for (const auto &info : infos) {
359 if (info.callType == CallType::TYPE_SATELLITE && info.slotId == slotId) {
360 CallReportInfo satelliteCallReportInfo;
361 if (memset_s(satelliteCallReportInfo.accountNum, kMaxNumberLen + 1, 0, kMaxNumberLen + 1) != EOK) {
362 TELEPHONY_LOGE("memset_s fail");
363 return TELEPHONY_ERR_MEMSET_FAIL;
364 }
365 if (memcpy_s(satelliteCallReportInfo.accountNum, kMaxNumberLen, info.phoneNum, kMaxNumberLen) != EOK) {
366 TELEPHONY_LOGE("memcpy_s fail");
367 return TELEPHONY_ERR_MEMCPY_FAIL;
368 }
369 satelliteCallReportInfo.index = info.index;
370 satelliteCallReportInfo.accountId = info.slotId;
371 satelliteCallReportInfo.callType = CallType::TYPE_SATELLITE;
372 satelliteCallReportInfo.callMode = VideoStateType::TYPE_VOICE;
373 satelliteCallReportInfo.state = TelCallState::CALL_STATUS_DISCONNECTED;
374 callsReportInfo.callVec.push_back(satelliteCallReportInfo);
375 }
376 }
377 if (DelayedSingleton<CellularCallRegister>::GetInstance() == nullptr) {
378 TELEPHONY_LOGE("CellularCallRegister instance is nullptr");
379 return TELEPHONY_ERR_LOCAL_PTR_NULL;
380 }
381 DelayedSingleton<CellularCallRegister>::GetInstance()->ReportCallsInfo(callsReportInfo);
382 ReleaseAllConnection();
383 return TELEPHONY_SUCCESS;
384 }
385
HoldCall(int32_t slotId)386 int32_t SatelliteControl::HoldCall(int32_t slotId)
387 {
388 return TELEPHONY_ERROR;
389 }
390
UnHoldCall(int32_t slotId)391 int32_t SatelliteControl::UnHoldCall(int32_t slotId)
392 {
393 return TELEPHONY_ERROR;
394 }
395
SwitchCall(int32_t slotId)396 int32_t SatelliteControl::SwitchCall(int32_t slotId)
397 {
398 return TELEPHONY_ERROR;
399 }
400
CombineConference(int32_t slotId)401 int32_t SatelliteControl::CombineConference(int32_t slotId)
402 {
403 return TELEPHONY_ERROR;
404 }
405
HangUpAllConnection(int32_t slotId)406 int32_t SatelliteControl::HangUpAllConnection(int32_t slotId)
407 {
408 TELEPHONY_LOGI("HangUpAllConnection entry");
409 CellularCallConnectionSatellite connection;
410 // The AT command for hanging up all calls is the same as the AT command for rejecting calls,
411 // so the reject interface is reused.
412 connection.RejectRequest(slotId);
413 return TELEPHONY_SUCCESS;
414 }
415
ReportCallsData(int32_t slotId,const CallInfoList & callInfoList)416 int32_t SatelliteControl::ReportCallsData(int32_t slotId, const CallInfoList &callInfoList)
417 {
418 return TELEPHONY_ERROR;
419 }
420
ExecutePostDial(int32_t slotId,int64_t callId)421 int32_t SatelliteControl::ExecutePostDial(int32_t slotId, int64_t callId)
422 {
423 TELEPHONY_LOGI("ExecutePostDial entry");
424 std::lock_guard<std::recursive_mutex> lock(connectionMapMutex_);
425 if (connectionMap_.empty()) {
426 TELEPHONY_LOGE("connectionMap_ is empty.");
427 return TELEPHONY_ERROR;
428 }
429 auto pConnection = FindConnectionByIndex<SatelliteConnectionMap &,
430 CellularCallConnectionSatellite *>(connectionMap_, callId);
431 if (pConnection == nullptr) {
432 return TELEPHONY_ERR_LOCAL_PTR_NULL;
433 }
434 char currentChar;
435 PostDialCallState state = pConnection->ProcessNextChar(slotId, currentChar);
436 switch (state) {
437 case PostDialCallState::POST_DIAL_CALL_STARTED:
438 DelayedSingleton<CellularCallRegister>::GetInstance()->ReportPostDialChar(currentChar);
439 break;
440 case PostDialCallState::POST_DIAL_CALL_DELAY:
441 DelayedSingleton<CellularCallRegister>::GetInstance()->ReportPostDialDelay(
442 pConnection->GetLeftPostDialCallString());
443 break;
444 default:
445 break;
446 }
447 return TELEPHONY_SUCCESS;
448 }
449
PostDialProceed(const CellularCallInfo & callInfo,const bool proceed)450 int32_t SatelliteControl::PostDialProceed(const CellularCallInfo &callInfo, const bool proceed)
451 {
452 TELEPHONY_LOGI("PostDialProceed entry");
453 std::string networkAddress;
454 std::string postDialString;
455 StandardizeUtils standardizeUtils;
456 standardizeUtils.ExtractAddressAndPostDial(callInfo.phoneNum, networkAddress, postDialString);
457 std::lock_guard<std::recursive_mutex> lock(connectionMapMutex_);
458 auto pConnection = FindConnectionByIndex<SatelliteConnectionMap &, CellularCallConnectionSatellite *>(
459 connectionMap_, callInfo.index);
460 if (pConnection == nullptr) {
461 TELEPHONY_LOGE("cs pConnection is nullptr!");
462 return TELEPHONY_ERR_LOCAL_PTR_NULL;
463 }
464 if (proceed) {
465 ExecutePostDial(callInfo.slotId, pConnection->GetIndex());
466 } else {
467 pConnection->SetPostDialCallState(PostDialCallState::POST_DIAL_CALL_CANCELED);
468 }
469 return TELEPHONY_SUCCESS;
470 }
471 } // namespace Telephony
472 } // namespace OHOS
473