1 /*
2 * Copyright (C) 2021-2022 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 "call_policy.h"
17
18 #include "call_dialog.h"
19 #include "call_data_base_helper.h"
20 #include "call_manager_errors.h"
21 #include "call_number_utils.h"
22 #include "core_service_client.h"
23 #include "ims_conference.h"
24 #include "telephony_log_wrapper.h"
25 #include "call_control_manager.h"
26 #include "call_superprivacy_control_manager.h"
27 #include "call_manager_base.h"
28 #include "distributed_communication_manager.h"
29 #include "cellular_call_connection.h"
30
31 namespace OHOS {
32 namespace Telephony {
CallPolicy()33 CallPolicy::CallPolicy() : edmCallPolicy_(std::make_shared<EdmCallPolicy>()) {}
34
~CallPolicy()35 CallPolicy::~CallPolicy() {}
36
DialPolicy(std::u16string & number,AppExecFwk::PacMap & extras,bool isEcc)37 int32_t CallPolicy::DialPolicy(std::u16string &number, AppExecFwk::PacMap &extras, bool isEcc)
38 {
39 DialType dialType = (DialType)extras.GetIntValue("dialType");
40 if (dialType != DialType::DIAL_CARRIER_TYPE && dialType != DialType::DIAL_VOICE_MAIL_TYPE &&
41 dialType != DialType::DIAL_OTT_TYPE && dialType != DialType::DIAL_BLUETOOTH_TYPE) {
42 TELEPHONY_LOGE("dial type invalid! dialType=%{public}d", dialType);
43 return TELEPHONY_ERR_ARGUMENT_INVALID;
44 }
45 std::string phoneNum = Str16ToStr8(number);
46 if (!IsDialingEnable(phoneNum)) {
47 TELEPHONY_LOGE("MDM policy is disabled!");
48 return TELEPHONY_ERR_POLICY_DISABLED;
49 }
50 int32_t accountId = extras.GetIntValue("accountId");
51 if (dialType == DialType::DIAL_CARRIER_TYPE) {
52 if (!DelayedSingleton<CallNumberUtils>::GetInstance()->SelectAccountId(accountId, extras)) {
53 extras.PutIntValue("accountId", 0);
54 TELEPHONY_LOGE("invalid accountId, select accountId to 0");
55 }
56 }
57 CallType callType = (CallType)extras.GetIntValue("callType");
58 if (IsValidCallType(callType) != TELEPHONY_SUCCESS) {
59 return TELEPHONY_ERR_ARGUMENT_INVALID;
60 }
61 DialScene dialScene = (DialScene)extras.GetIntValue("dialScene");
62 if ((dialScene != DialScene::CALL_NORMAL && dialScene != DialScene::CALL_PRIVILEGED &&
63 dialScene != DialScene::CALL_EMERGENCY)) {
64 TELEPHONY_LOGE("invalid dial scene!");
65 return TELEPHONY_ERR_ARGUMENT_INVALID;
66 }
67 VideoStateType videoState = (VideoStateType)extras.GetIntValue("videoState");
68 if (videoState != VideoStateType::TYPE_VOICE && videoState != VideoStateType::TYPE_VIDEO) {
69 TELEPHONY_LOGE("invalid video state!");
70 return TELEPHONY_ERR_ARGUMENT_INVALID;
71 }
72 if (!isEcc) {
73 if (IsVoiceCallValid(videoState) != TELEPHONY_SUCCESS) {
74 return CALL_ERR_CALL_COUNTS_EXCEED_LIMIT;
75 }
76 if (HasNewCall() != TELEPHONY_SUCCESS) {
77 return CALL_ERR_CALL_COUNTS_EXCEED_LIMIT;
78 }
79 bool hasEccCall = false;
80 if (HasEmergencyCall(hasEccCall) == TELEPHONY_ERR_SUCCESS && hasEccCall) {
81 TELEPHONY_LOGE("during emergency call, calling is prohibited");
82 return CALL_ERR_CALL_COUNTS_EXCEED_LIMIT;
83 }
84 }
85 return SuperPrivacyMode(number, extras, isEcc);
86 }
87
SuperPrivacyMode(std::u16string & number,AppExecFwk::PacMap & extras,bool isEcc)88 int32_t CallPolicy::SuperPrivacyMode(std::u16string &number, AppExecFwk::PacMap &extras, bool isEcc)
89 {
90 int32_t accountId = extras.GetIntValue("accountId");
91 CallType callType = (CallType)extras.GetIntValue("callType");
92 int32_t slotId = extras.GetIntValue("accountId");
93 if (isEcc) {
94 return HasNormalCall(isEcc, slotId, callType);
95 }
96 DialScene dialScene = (DialScene)extras.GetIntValue("dialScene");
97 if (dialScene == DialScene::CALL_EMERGENCY) {
98 return HasNormalCall(isEcc, slotId, callType);
99 }
100 bool currentIsSuperPrivacyMode = DelayedSingleton<CallSuperPrivacyControlManager>::GetInstance()->
101 GetCurrentIsSuperPrivacyMode();
102 TELEPHONY_LOGI("call policy currentIsSuperPrivacyMode:%{public}d", currentIsSuperPrivacyMode);
103 if (currentIsSuperPrivacyMode) {
104 int32_t videoState = extras.GetIntValue("videoState");
105 int32_t dialType = extras.GetIntValue("dialType");
106 int32_t dialScene = extras.GetIntValue("dialScene");
107 int32_t spCallType = extras.GetIntValue("callType");
108 DelayedSingleton<CallDialog>::GetInstance()->DialogConnectPrivpacyModeExtension("SUPER_PRIVACY_MODE",
109 number, accountId, videoState, dialType, dialScene, spCallType, true);
110 return CALL_ERR_DIAL_FAILED;
111 }
112 return HasNormalCall(isEcc, slotId, callType);
113 }
HasNormalCall(bool isEcc,int32_t slotId,CallType callType)114 int32_t CallPolicy::HasNormalCall(bool isEcc, int32_t slotId, CallType callType)
115 {
116 if (isEcc || callType == CallType::TYPE_SATELLITE || callType == CallType::TYPE_BLUETOOTH) {
117 return TELEPHONY_SUCCESS;
118 }
119 bool hasSimCard = false;
120 DelayedRefSingleton<CoreServiceClient>::GetInstance().HasSimCard(slotId, hasSimCard);
121 if (!hasSimCard) {
122 TELEPHONY_LOGE("Call failed due to no sim card");
123 DelayedSingleton<CallDialog>::GetInstance()->DialogConnectExtension("CALL_FAILED_NO_SIM_CARD");
124 return TELEPHONY_ERR_NO_SIM_CARD;
125 }
126 bool isAirplaneModeOn = false;
127 int32_t ret = GetAirplaneMode(isAirplaneModeOn);
128 if (ret == TELEPHONY_SUCCESS && isAirplaneModeOn) {
129 TELEPHONY_LOGE("Call failed due to isAirplaneModeOn is true");
130 DelayedSingleton<CallDialog>::GetInstance()->DialogConnectExtension("CALL_FAILED_IN_AIRPLANE_MODE");
131 return TELEPHONY_ERR_AIRPLANE_MODE_ON;
132 }
133 sptr<NetworkState> networkState = nullptr;
134 RegServiceState regStatus = RegServiceState::REG_STATE_UNKNOWN;
135 DelayedRefSingleton<CoreServiceClient>::GetInstance().GetNetworkState(slotId, networkState);
136 if (networkState != nullptr) {
137 regStatus = networkState->GetRegStatus();
138 }
139 if (regStatus != RegServiceState::REG_STATE_IN_SERVICE) {
140 TELEPHONY_LOGE("Call failed due to no service");
141 DelayedSingleton<CallDialog>::GetInstance()->DialogConnectExtension("CALL_FAILED_NO_SERVICE");
142 return TELEPHONY_ERR_NETWORK_NOT_IN_SERVICE;
143 }
144 ImsRegInfo info;
145 DelayedRefSingleton<CoreServiceClient>::GetInstance().GetImsRegStatus(slotId, ImsServiceType::TYPE_VOICE, info);
146 bool isImsRegistered = info.imsRegState == ImsRegState::IMS_REGISTERED;
147 bool isCTSimCard = false;
148 bool isRoaming = networkState->IsRoaming();
149 DelayedRefSingleton<CoreServiceClient>::GetInstance().IsCTSimCard(slotId, isCTSimCard);
150 if (isCTSimCard && !isRoaming && !isImsRegistered && IsCtSimCardSwitchToChnOrMc(slotId)) {
151 TELEPHONY_LOGE("Call failed due to CT card IMS is UNREGISTERED");
152 DelayedSingleton<CallDialog>::GetInstance()->DialogConnectExtension("CALL_FAILED_CTCARD_NO_IMS", slotId);
153 return CALL_ERR_DIAL_FAILED;
154 }
155 return TELEPHONY_SUCCESS;
156 }
157
IsCtSimCardSwitchToChnOrMc(int32_t slotId)158 bool CallPolicy::IsCtSimCardSwitchToChnOrMc(int32_t slotId)
159 {
160 std::string regPlmn = DelayedRefSingleton<CoreServiceClient>::GetInstance().GetResidentNetworkNumeric(slotId);
161 std::u16string hplmn;
162 DelayedRefSingleton<CoreServiceClient>::GetInstance().GetSimOperatorNumeric(slotId, hplmn);
163 std::string simOperator =
164 std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>{}.to_bytes(hplmn);
165 TELEPHONY_LOGI("regPlmn = %{public}s, simOperator = %{public}s", regPlmn.c_str(), simOperator.c_str());
166 if (regPlmn.empty() || simOperator.empty() || regPlmn.length() < MCC_LEN || simOperator.length() < MCC_LEN) {
167 return false;
168 }
169 return (regPlmn.substr(0, MCC_LEN).compare(CHN_MCC) == 0 && simOperator.substr(0, MCC_LEN).compare(CHN_MCC) == 0)
170 || (regPlmn.substr(0, MCC_LEN).compare(MC_MCC) == 0 && simOperator.substr(0, MCC_LEN).compare(MC_MCC) == 0);
171 }
172
GetAirplaneMode(bool & isAirplaneModeOn)173 int32_t CallPolicy::GetAirplaneMode(bool &isAirplaneModeOn)
174 {
175 std::shared_ptr<CallDataBaseHelper> callDataPtr = DelayedSingleton<CallDataBaseHelper>::GetInstance();
176 if (callDataPtr == nullptr) {
177 TELEPHONY_LOGE("callDataPtr is nullptr");
178 return TELEPHONY_ERR_LOCAL_PTR_NULL;
179 }
180 return callDataPtr->GetAirplaneMode(isAirplaneModeOn);
181 }
182
IsVoiceCallValid(VideoStateType videoState)183 int32_t CallPolicy::IsVoiceCallValid(VideoStateType videoState)
184 {
185 if (videoState == VideoStateType::TYPE_VOICE) {
186 sptr<CallBase> ringCall = GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_RINGING);
187 if (ringCall != nullptr && ringCall->GetVideoStateType() == VideoStateType::TYPE_VOICE &&
188 ringCall->GetCallType() != CallType::TYPE_VOIP) {
189 TELEPHONY_LOGE("already has new call ringing!");
190 return CALL_ERR_CALL_COUNTS_EXCEED_LIMIT;
191 }
192 }
193 return TELEPHONY_SUCCESS;
194 }
195
IsValidCallType(CallType callType)196 int32_t CallPolicy::IsValidCallType(CallType callType)
197 {
198 if (callType != CallType::TYPE_CS && callType != CallType::TYPE_IMS && callType != CallType::TYPE_OTT &&
199 callType != CallType::TYPE_SATELLITE && callType != CallType::TYPE_BLUETOOTH) {
200 TELEPHONY_LOGE("invalid call type!");
201 return CALL_ERR_UNKNOW_CALL_TYPE;
202 }
203 return TELEPHONY_SUCCESS;
204 }
205
CanDialMulityCall(AppExecFwk::PacMap & extras,bool isEcc)206 int32_t CallPolicy::CanDialMulityCall(AppExecFwk::PacMap &extras, bool isEcc)
207 {
208 VideoStateType videoState = (VideoStateType)extras.GetIntValue("videoState");
209 int32_t slotId = extras.GetIntValue("accountId");
210 bool enabled = false;
211 DelayedSingleton<CellularCallConnection>::GetInstance()->GetVideoCallWaiting(slotId, enabled);
212 if (!enabled) {
213 if (videoState == VideoStateType::TYPE_VIDEO && HasCellularCallExist()) {
214 TELEPHONY_LOGE("can not dial video call when any call exist!");
215 return CALL_ERR_DIAL_IS_BUSY;
216 }
217 if (!isEcc && videoState == VideoStateType::TYPE_VOICE && HasVideoCall()) {
218 TELEPHONY_LOGE("can not dial video call when any call exist!");
219 return CALL_ERR_DIAL_IS_BUSY;
220 }
221 }
222 if (DelayedSingleton<DistributedCommunicationManager>::GetInstance()->IsConnected() &&
223 DelayedSingleton<DistributedCommunicationManager>::GetInstance()->IsSinkRole() &&
224 HasCellularCallExist()) {
225 TELEPHONY_LOGE("dc-call sink can not dial call when any call exist!");
226 return CALL_ERR_CALL_COUNTS_EXCEED_LIMIT;
227 }
228 return TELEPHONY_SUCCESS;
229 }
230
IsSupportVideoCall(AppExecFwk::PacMap & extras)231 bool CallPolicy::IsSupportVideoCall(AppExecFwk::PacMap &extras)
232 {
233 bool isSupportVideoCall = true;
234 #ifdef ABILITY_CONFIG_SUPPORT
235 isSupportVideoCall = GetCarrierConfig(ITEM_VIDEO_CALL);
236 #endif
237 bool vtEnabled = false;
238 DelayedSingleton<CallNumberUtils>::GetInstance()->IsCarrierVtConfig(extras.GetIntValue("accountId"), vtEnabled);
239 if (!vtEnabled) {
240 isSupportVideoCall = false;
241 return isSupportVideoCall;
242 }
243 DialScene dialScene = (DialScene)extras.GetIntValue("dialScene");
244 if (dialScene != DialScene::CALL_NORMAL) {
245 TELEPHONY_LOGW("emergency call not support video upgrade");
246 isSupportVideoCall = false;
247 }
248 return isSupportVideoCall;
249 }
250
AnswerCallPolicy(int32_t callId,int32_t videoState)251 int32_t CallPolicy::AnswerCallPolicy(int32_t callId, int32_t videoState)
252 {
253 if (videoState != static_cast<int32_t>(VideoStateType::TYPE_VOICE) &&
254 videoState != static_cast<int32_t>(VideoStateType::TYPE_VIDEO)) {
255 TELEPHONY_LOGE("videoState is invalid!");
256 return TELEPHONY_ERR_ARGUMENT_INVALID;
257 }
258 if (!IsCallExist(callId)) {
259 TELEPHONY_LOGE("callId is invalid, callId:%{public}d", callId);
260 return TELEPHONY_ERR_ARGUMENT_INVALID;
261 }
262 TelCallState state = GetCallState(callId);
263 if (state != TelCallState::CALL_STATUS_INCOMING && state != TelCallState::CALL_STATUS_WAITING) {
264 TELEPHONY_LOGE("current call state is:%{public}d, accept call not allowed", state);
265 return CALL_ERR_ILLEGAL_CALL_OPERATION;
266 }
267 return TELEPHONY_SUCCESS;
268 }
269
RejectCallPolicy(int32_t callId)270 int32_t CallPolicy::RejectCallPolicy(int32_t callId)
271 {
272 if (!IsCallExist(callId)) {
273 TELEPHONY_LOGE("callId is invalid, callId:%{public}d", callId);
274 return TELEPHONY_ERR_ARGUMENT_INVALID;
275 }
276 TelCallState state = GetCallState(callId);
277 if (state != TelCallState::CALL_STATUS_INCOMING && state != TelCallState::CALL_STATUS_WAITING) {
278 TELEPHONY_LOGE("current call state is:%{public}d, reject call not allowed", state);
279 return CALL_ERR_ILLEGAL_CALL_OPERATION;
280 }
281 return TELEPHONY_SUCCESS;
282 }
283
HoldCallPolicy(int32_t callId)284 int32_t CallPolicy::HoldCallPolicy(int32_t callId)
285 {
286 sptr<CallBase> call = GetOneCallObject(callId);
287 if (call == nullptr) {
288 TELEPHONY_LOGE("GetOneCallObject failed, this callId is invalid! callId:%{public}d", callId);
289 return TELEPHONY_ERR_ARGUMENT_INVALID;
290 }
291 if (call->GetCallRunningState() != CallRunningState::CALL_RUNNING_STATE_ACTIVE) {
292 TELEPHONY_LOGE("this call is not activated! callId:%{public}d", callId);
293 return CALL_ERR_CALL_IS_NOT_ACTIVATED;
294 }
295 return TELEPHONY_SUCCESS;
296 }
297
UnHoldCallPolicy(int32_t callId)298 int32_t CallPolicy::UnHoldCallPolicy(int32_t callId)
299 {
300 sptr<CallBase> call = GetOneCallObject(callId);
301 if (call == nullptr) {
302 TELEPHONY_LOGE("GetOneCallObject failed, this callId is invalid! callId:%{public}d", callId);
303 return TELEPHONY_ERR_ARGUMENT_INVALID;
304 }
305 if (call->GetCallRunningState() != CallRunningState::CALL_RUNNING_STATE_HOLD) {
306 TELEPHONY_LOGE("this call is not on holding state! callId:%{public}d", callId);
307 return CALL_ERR_CALL_IS_NOT_ON_HOLDING;
308 }
309 return TELEPHONY_SUCCESS;
310 }
311
HangUpPolicy(int32_t callId)312 int32_t CallPolicy::HangUpPolicy(int32_t callId)
313 {
314 if (!IsCallExist(callId)) {
315 TELEPHONY_LOGE("callId is invalid, callId:%{public}d", callId);
316 return TELEPHONY_ERR_ARGUMENT_INVALID;
317 }
318 TelCallState state = GetCallState(callId);
319 if (state == TelCallState::CALL_STATUS_IDLE || state == TelCallState::CALL_STATUS_DISCONNECTING ||
320 state == TelCallState::CALL_STATUS_DISCONNECTED) {
321 TELEPHONY_LOGE("current call state is:%{public}d, hang up call not allowed", state);
322 return CALL_ERR_ILLEGAL_CALL_OPERATION;
323 }
324 return TELEPHONY_SUCCESS;
325 }
326
SwitchCallPolicy(int32_t callId)327 int32_t CallPolicy::SwitchCallPolicy(int32_t callId)
328 {
329 std::list<int32_t> callIdList;
330 if (!IsCallExist(callId)) {
331 TELEPHONY_LOGE("callId is invalid");
332 return TELEPHONY_ERR_ARGUMENT_INVALID;
333 }
334 GetCarrierCallList(callIdList);
335 if (callIdList.size() < onlyTwoCall_) {
336 callIdList.clear();
337 return CALL_ERR_PHONE_CALLS_TOO_FEW;
338 }
339 if (GetCallState(callId) != TelCallState::CALL_STATUS_HOLDING ||
340 IsCallExist(TelCallState::CALL_STATUS_DIALING) || IsCallExist(TelCallState::CALL_STATUS_ALERTING)) {
341 TELEPHONY_LOGE("the call is not on hold, callId:%{public}d", callId);
342 return CALL_ERR_ILLEGAL_CALL_OPERATION;
343 }
344 callIdList.clear();
345 return TELEPHONY_SUCCESS;
346 }
347
VideoCallPolicy(int32_t callId)348 int32_t CallPolicy::VideoCallPolicy(int32_t callId)
349 {
350 TELEPHONY_LOGI("callid %{public}d", callId);
351 sptr<CallBase> callPtr = CallObjectManager::GetOneCallObject(callId);
352 if (callPtr == nullptr) {
353 TELEPHONY_LOGE("callId is invalid, callId:%{public}d", callId);
354 return TELEPHONY_ERR_ARGUMENT_INVALID;
355 }
356 return TELEPHONY_SUCCESS;
357 }
358
StartRttPolicy(int32_t callId)359 int32_t CallPolicy::StartRttPolicy(int32_t callId)
360 {
361 sptr<CallBase> callPtr = CallObjectManager::GetOneCallObject(callId);
362 if (callPtr == nullptr) {
363 TELEPHONY_LOGE("callId is invalid, callId:%{public}d", callId);
364 return CALL_ERR_INVALID_CALLID;
365 }
366 if (callPtr->GetCallType() != CallType::TYPE_IMS) {
367 TELEPHONY_LOGE("calltype is illegal, calltype:%{public}d", callPtr->GetCallType());
368 return CALL_ERR_UNSUPPORTED_NETWORK_TYPE;
369 }
370 TelCallState state = GetCallState(callId);
371 if (state != TelCallState::CALL_STATUS_ACTIVE) {
372 TELEPHONY_LOGE("current call state is:%{public}d, StartRtt not allowed", state);
373 return CALL_ERR_ILLEGAL_CALL_OPERATION;
374 }
375 return TELEPHONY_SUCCESS;
376 }
377
StopRttPolicy(int32_t callId)378 int32_t CallPolicy::StopRttPolicy(int32_t callId)
379 {
380 sptr<CallBase> callPtr = CallObjectManager::GetOneCallObject(callId);
381 if (callPtr == nullptr) {
382 TELEPHONY_LOGE("callId is invalid, callId:%{public}d", callId);
383 return CALL_ERR_INVALID_CALLID;
384 }
385 if (callPtr->GetCallType() != CallType::TYPE_IMS) {
386 TELEPHONY_LOGE("calltype is illegal, calltype:%{public}d", callPtr->GetCallType());
387 return CALL_ERR_UNSUPPORTED_NETWORK_TYPE;
388 }
389 TelCallState state = GetCallState(callId);
390 if (state != TelCallState::CALL_STATUS_ACTIVE) {
391 TELEPHONY_LOGE("current call state is:%{public}d, StopRtt not allowed", state);
392 return CALL_ERR_ILLEGAL_CALL_OPERATION;
393 }
394 return TELEPHONY_SUCCESS;
395 }
396
IsValidSlotId(int32_t slotId)397 int32_t CallPolicy::IsValidSlotId(int32_t slotId)
398 {
399 bool result = DelayedSingleton<CallNumberUtils>::GetInstance()->IsValidSlotId(slotId);
400 if (!result) {
401 TELEPHONY_LOGE("invalid slotId!");
402 return CALL_ERR_INVALID_SLOT_ID;
403 }
404 return TELEPHONY_SUCCESS;
405 }
406
EnableVoLtePolicy(int32_t slotId)407 int32_t CallPolicy::EnableVoLtePolicy(int32_t slotId)
408 {
409 if (IsValidSlotId(slotId) != TELEPHONY_SUCCESS) {
410 TELEPHONY_LOGE("invalid slotId!");
411 return CALL_ERR_INVALID_SLOT_ID;
412 }
413 return TELEPHONY_SUCCESS;
414 }
415
DisableVoLtePolicy(int32_t slotId)416 int32_t CallPolicy::DisableVoLtePolicy(int32_t slotId)
417 {
418 if (IsValidSlotId(slotId) != TELEPHONY_SUCCESS) {
419 TELEPHONY_LOGE("invalid slotId!");
420 return CALL_ERR_INVALID_SLOT_ID;
421 }
422 return TELEPHONY_SUCCESS;
423 }
424
IsVoLteEnabledPolicy(int32_t slotId)425 int32_t CallPolicy::IsVoLteEnabledPolicy(int32_t slotId)
426 {
427 if (IsValidSlotId(slotId) != TELEPHONY_SUCCESS) {
428 TELEPHONY_LOGE("invalid slotId!");
429 return CALL_ERR_INVALID_SLOT_ID;
430 }
431 return TELEPHONY_SUCCESS;
432 }
433
VoNRStatePolicy(int32_t slotId,int32_t state)434 int32_t CallPolicy::VoNRStatePolicy(int32_t slotId, int32_t state)
435 {
436 if (IsValidSlotId(slotId) != TELEPHONY_SUCCESS) {
437 TELEPHONY_LOGE("invalid slotId!");
438 return CALL_ERR_INVALID_SLOT_ID;
439 }
440 if (state != static_cast<int32_t>(VoNRState::VONR_STATE_ON) &&
441 state != static_cast<int32_t>(VoNRState::VONR_STATE_OFF)) {
442 TELEPHONY_LOGE("invalid state!");
443 return TELEPHONY_ERR_ARGUMENT_INVALID;
444 }
445 return TELEPHONY_SUCCESS;
446 }
447
GetCallWaitingPolicy(int32_t slotId)448 int32_t CallPolicy::GetCallWaitingPolicy(int32_t slotId)
449 {
450 if (IsValidSlotId(slotId) != TELEPHONY_SUCCESS) {
451 TELEPHONY_LOGE("invalid slotId!");
452 return CALL_ERR_INVALID_SLOT_ID;
453 }
454 return TELEPHONY_SUCCESS;
455 }
456
SetCallWaitingPolicy(int32_t slotId)457 int32_t CallPolicy::SetCallWaitingPolicy(int32_t slotId)
458 {
459 if (IsValidSlotId(slotId) != TELEPHONY_SUCCESS) {
460 TELEPHONY_LOGE("invalid slotId!");
461 return CALL_ERR_INVALID_SLOT_ID;
462 }
463 return TELEPHONY_SUCCESS;
464 }
465
GetCallRestrictionPolicy(int32_t slotId)466 int32_t CallPolicy::GetCallRestrictionPolicy(int32_t slotId)
467 {
468 if (IsValidSlotId(slotId) != TELEPHONY_SUCCESS) {
469 TELEPHONY_LOGE("invalid slotId!");
470 return CALL_ERR_INVALID_SLOT_ID;
471 }
472 return TELEPHONY_SUCCESS;
473 }
474
SetCallRestrictionPolicy(int32_t slotId)475 int32_t CallPolicy::SetCallRestrictionPolicy(int32_t slotId)
476 {
477 if (IsValidSlotId(slotId) != TELEPHONY_SUCCESS) {
478 TELEPHONY_LOGE("invalid slotId!");
479 return CALL_ERR_INVALID_SLOT_ID;
480 }
481 return TELEPHONY_SUCCESS;
482 }
483
GetCallTransferInfoPolicy(int32_t slotId)484 int32_t CallPolicy::GetCallTransferInfoPolicy(int32_t slotId)
485 {
486 if (IsValidSlotId(slotId) != TELEPHONY_SUCCESS) {
487 TELEPHONY_LOGE("invalid slotId!");
488 return CALL_ERR_INVALID_SLOT_ID;
489 }
490 return TELEPHONY_SUCCESS;
491 }
492
SetCallTransferInfoPolicy(int32_t slotId)493 int32_t CallPolicy::SetCallTransferInfoPolicy(int32_t slotId)
494 {
495 if (IsValidSlotId(slotId) != TELEPHONY_SUCCESS) {
496 TELEPHONY_LOGE("invalid slotId!");
497 return CALL_ERR_INVALID_SLOT_ID;
498 }
499 return TELEPHONY_SUCCESS;
500 }
501
SetCallPreferenceModePolicy(int32_t slotId)502 int32_t CallPolicy::SetCallPreferenceModePolicy(int32_t slotId)
503 {
504 if (IsValidSlotId(slotId) != TELEPHONY_SUCCESS) {
505 TELEPHONY_LOGE("invalid slotId!");
506 return CALL_ERR_INVALID_SLOT_ID;
507 }
508 return TELEPHONY_SUCCESS;
509 }
510
GetImsConfigPolicy(int32_t slotId)511 int32_t CallPolicy::GetImsConfigPolicy(int32_t slotId)
512 {
513 if (IsValidSlotId(slotId) != TELEPHONY_SUCCESS) {
514 TELEPHONY_LOGE("invalid slotId!");
515 return CALL_ERR_INVALID_SLOT_ID;
516 }
517 return TELEPHONY_SUCCESS;
518 }
519
SetImsConfigPolicy(int32_t slotId)520 int32_t CallPolicy::SetImsConfigPolicy(int32_t slotId)
521 {
522 if (IsValidSlotId(slotId) != TELEPHONY_SUCCESS) {
523 TELEPHONY_LOGE("invalid slotId!");
524 return CALL_ERR_INVALID_SLOT_ID;
525 }
526 return TELEPHONY_SUCCESS;
527 }
528
GetImsFeatureValuePolicy(int32_t slotId)529 int32_t CallPolicy::GetImsFeatureValuePolicy(int32_t slotId)
530 {
531 if (IsValidSlotId(slotId) != TELEPHONY_SUCCESS) {
532 TELEPHONY_LOGE("invalid slotId!");
533 return CALL_ERR_INVALID_SLOT_ID;
534 }
535 return TELEPHONY_SUCCESS;
536 }
537
SetImsFeatureValuePolicy(int32_t slotId)538 int32_t CallPolicy::SetImsFeatureValuePolicy(int32_t slotId)
539 {
540 if (IsValidSlotId(slotId) != TELEPHONY_SUCCESS) {
541 TELEPHONY_LOGE("invalid slotId!");
542 return CALL_ERR_INVALID_SLOT_ID;
543 }
544 return TELEPHONY_SUCCESS;
545 }
546
InviteToConferencePolicy(int32_t callId,std::vector<std::string> & numberList)547 int32_t CallPolicy::InviteToConferencePolicy(int32_t callId, std::vector<std::string> &numberList)
548 {
549 if (!IsCallExist(callId)) {
550 TELEPHONY_LOGE("callId is invalid, callId:%{public}d", callId);
551 return TELEPHONY_ERR_ARGUMENT_INVALID;
552 }
553 // check number legality
554 if (numberList.empty()) {
555 TELEPHONY_LOGE("empty phone number list!");
556 return CALL_ERR_PHONE_NUMBER_EMPTY;
557 }
558 for (size_t index = 0; index < numberList.size(); ++index) {
559 if (numberList[index].empty()) {
560 TELEPHONY_LOGE("empty phone number !");
561 return CALL_ERR_PHONE_NUMBER_EMPTY;
562 }
563 if (numberList[index].length() > kMaxNumberLen) {
564 TELEPHONY_LOGE("phone number too long !");
565 return CALL_ERR_NUMBER_OUT_OF_RANGE;
566 }
567 }
568 if (DelayedSingleton<ImsConference>::GetInstance()->GetMainCall() != callId) {
569 TELEPHONY_LOGE("conference with main callId %{public}d not exist", callId);
570 return CALL_ERR_CONFERENCE_NOT_EXISTS;
571 }
572 return TELEPHONY_SUCCESS;
573 }
574
CloseUnFinishedUssdPolicy(int32_t slotId)575 int32_t CallPolicy::CloseUnFinishedUssdPolicy(int32_t slotId)
576 {
577 if (IsValidSlotId(slotId) != TELEPHONY_SUCCESS) {
578 TELEPHONY_LOGE("invalid slotId!");
579 return CALL_ERR_INVALID_SLOT_ID;
580 }
581 return TELEPHONY_SUCCESS;
582 }
583
SetEdmPolicy(bool isDialingTrustlist,const std::vector<std::string> & dialingList,bool isIncomingTrustlist,const std::vector<std::string> & incomingList)584 int32_t CallPolicy::SetEdmPolicy(bool isDialingTrustlist, const std::vector<std::string> &dialingList,
585 bool isIncomingTrustlist, const std::vector<std::string> &incomingList)
586 {
587 return edmCallPolicy_->SetCallPolicy(isDialingTrustlist, dialingList, isIncomingTrustlist, incomingList);
588 }
589
IsDialingEnable(const std::string & phoneNum)590 bool CallPolicy::IsDialingEnable(const std::string &phoneNum)
591 {
592 return edmCallPolicy_->IsDialingEnable(phoneNum);
593 }
594
IsIncomingEnable(const std::string & phoneNum)595 bool CallPolicy::IsIncomingEnable(const std::string &phoneNum)
596 {
597 return edmCallPolicy_->IsIncomingEnable(phoneNum);
598 }
599 } // namespace Telephony
600 } // namespace OHOS
601