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