1 /*
2  * Copyright (c) 2024 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 #include "string_ex.h"
16 #include "singleton.h"
17 #include "call_manager_client.h"
18 #include "system_ability_definition.h"
19 #include "telephony_types.h"
20 #include "string_wrapper.h"
21 #include "bool_wrapper.h"
22 #include "ability_manager_client.h"
23 #include "telephony_errors.h"
24 #include "call_manager_errors.h"
25 
26 #include "telephony_call_log.h"
27 #include "telephony_call_impl.h"
28 
29 using namespace OHOS::Telephony;
30 
31 namespace OHOS {
32 namespace Telephony {
ConvertCJErrCode(int32_t errCode)33     static int32_t ConvertCJErrCode(int32_t errCode)
34     {
35         LOGI("The original error code is displayed: %{public}d", errCode);
36         switch (errCode) {
37             case TELEPHONY_ERR_ARGUMENT_MISMATCH:
38             case TELEPHONY_ERR_ARGUMENT_INVALID:
39             case TELEPHONY_ERR_ARGUMENT_NULL:
40             case TELEPHONY_ERR_SLOTID_INVALID:
41                 // 83000001
42                 return CJ_ERROR_TELEPHONY_ARGUMENT_ERROR;
43             case TELEPHONY_ERR_DESCRIPTOR_MISMATCH:
44             case TELEPHONY_ERR_WRITE_DESCRIPTOR_TOKEN_FAIL:
45             case TELEPHONY_ERR_WRITE_DATA_FAIL:
46             case TELEPHONY_ERR_WRITE_REPLY_FAIL:
47             case TELEPHONY_ERR_READ_DATA_FAIL:
48             case TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL:
49             case TELEPHONY_ERR_REGISTER_CALLBACK_FAIL:
50             case TELEPHONY_ERR_CALLBACK_ALREADY_REGISTERED:
51             case TELEPHONY_ERR_UNINIT:
52             case TELEPHONY_ERR_UNREGISTER_CALLBACK_FAIL:
53                 // 83000002
54                 return CJ_ERROR_TELEPHONY_SERVICE_ERROR;
55             case TELEPHONY_ERR_VCARD_FILE_INVALID:
56             case TELEPHONY_ERR_FAIL:
57             case TELEPHONY_ERR_MEMCPY_FAIL:
58             case TELEPHONY_ERR_MEMSET_FAIL:
59             case TELEPHONY_ERR_STRCPY_FAIL:
60             case TELEPHONY_ERR_LOCAL_PTR_NULL:
61             case TELEPHONY_ERR_SUBSCRIBE_BROADCAST_FAIL:
62             case TELEPHONY_ERR_PUBLISH_BROADCAST_FAIL:
63             case TELEPHONY_ERR_ADD_DEATH_RECIPIENT_FAIL:
64             case TELEPHONY_ERR_STRTOINT_FAIL:
65             case TELEPHONY_ERR_RIL_CMD_FAIL:
66             case TELEPHONY_ERR_DATABASE_WRITE_FAIL:
67             case TELEPHONY_ERR_DATABASE_READ_FAIL:
68             case TELEPHONY_ERR_UNKNOWN_NETWORK_TYPE:
69             case CALL_ERR_INVALID_VIDEO_STATE:
70                 // 83000003
71                 return CJ_ERROR_TELEPHONY_SYSTEM_ERROR;
72             case TELEPHONY_ERR_NO_SIM_CARD:
73                 // 83000004
74                 return CJ_ERROR_TELEPHONY_NO_SIM_CARD;
75             case TELEPHONY_ERR_AIRPLANE_MODE_ON:
76                 // 83000005
77                 return CJ_ERROR_TELEPHONY_AIRPLANE_MODE_ON;
78             case TELEPHONY_ERR_NETWORK_NOT_IN_SERVICE:
79                 // 83000006
80                 return CJ_ERROR_TELEPHONY_NETWORK_NOT_IN_SERVICE;
81             case TELEPHONY_ERR_PERMISSION_ERR:
82                 // 201
83                 return CJ_ERROR_TELEPHONY_PERMISSION_DENIED;
84             case TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API:
85                 // 202
86                 return CJ_ERROR_TELEPHONY_PERMISSION_DENIED;
87             default:
88                 return errCode;
89         }
90     }
91 
IsRinging(int32_t * errCode)92     bool TelephonyCallImpl::IsRinging(int32_t *errCode)
93     {
94         bool result = true;
95         int32_t err = DelayedSingleton<CallManagerClient>::GetInstance()->IsRinging(result);
96         *errCode = ConvertCJErrCode(err);
97         return result;
98     }
99 
FormatPhoneNumberToE164(char * cPhoneNumber,char * cCountryCode,int32_t * errCode)100     char* TelephonyCallImpl::FormatPhoneNumberToE164(char *cPhoneNumber, char *cCountryCode, int32_t *errCode)
101     {
102         std::u16string formatNumber = u"";
103         std::string tmpCountryCode = cCountryCode;
104         std::string tmpPhoneNumber = cPhoneNumber;
105         std::u16string phoneNumber = Str8ToStr16(tmpPhoneNumber);
106         std::u16string countryCode = Str8ToStr16(tmpCountryCode);
107         int32_t err = DelayedSingleton<CallManagerClient>::GetInstance()->FormatPhoneNumber(
108             phoneNumber, countryCode, formatNumber);
109         *errCode = ConvertCJErrCode(err);
110         std::string result = Str16ToStr8(formatNumber);
111         return MallocCString(result);
112     }
113 
MakeCall(char * phoneNumber)114     int32_t TelephonyCallImpl::MakeCall(char* phoneNumber)
115     {
116         AAFwk::Want want;
117         AppExecFwk::ElementName element("", "com.ohos.contacts", "com.ohos.contacts.MainAbility");
118         want.SetElement(element);
119         AAFwk::WantParams wantParams;
120         wantParams.SetParam("phoneNumber", AAFwk::String::Box(std::string(phoneNumber)));
121         wantParams.SetParam("pageFlag", AAFwk::String::Box("page_flag_edit_before_calling"));
122         wantParams.SetParam(AAFwk::Want::PARAM_BACK_TO_OTHER_MISSION_STACK, AAFwk::Boolean::Box(true));
123         want.SetParams(wantParams);
124         int32_t err = AAFwk::AbilityManagerClient::GetInstance()->StartAbility(want);
125         return ConvertCJErrCode(err);
126     }
127 
IsValidSlotId(int32_t slotId)128     static bool IsValidSlotId(int32_t slotId)
129     {
130         return ((slotId >= DEFAULT_SIM_SLOT_ID) && (slotId < SIM_SLOT_COUNT));
131     }
132 
IsEmergencyPhoneNumber(char * cPhoneNumber,int32_t slotId,int32_t * errCode)133     bool TelephonyCallImpl::IsEmergencyPhoneNumber(char *cPhoneNumber, int32_t slotId, int32_t* errCode)
134     {
135         if (!IsValidSlotId(slotId)) {
136             *errCode = ConvertCJErrCode(TELEPHONY_ERR_SLOTID_INVALID);
137             return false;
138         }
139         std::string temPhoneNumber = cPhoneNumber;
140         std::u16string phoneNumberU16 = Str8ToStr16(temPhoneNumber);
141         bool result = false;
142         int32_t err = DelayedSingleton<CallManagerClient>::GetInstance()->IsEmergencyPhoneNumber(
143             phoneNumberU16, slotId, result);
144         *errCode = ConvertCJErrCode(err);
145         return result;
146     }
147 
HasCall()148     bool TelephonyCallImpl::HasCall()
149     {
150         return DelayedSingleton<CallManagerClient>::GetInstance()->HasCall();
151     }
152 
GetCallState()153     int32_t TelephonyCallImpl::GetCallState()
154     {
155         return DelayedSingleton<CallManagerClient>::GetInstance()->GetCallState();
156     }
157 
Init()158     void TelephonyCallImpl::Init()
159     {
160         DelayedSingleton<CallManagerClient>::GetInstance()->Init(TELEPHONY_CALL_MANAGER_SYS_ABILITY_ID);
161     }
162 
DialCall(char * phoneNumber,DialCallOptions options)163     int32_t TelephonyCallImpl::DialCall(char *phoneNumber, DialCallOptions options)
164     {
165         OHOS::AppExecFwk::PacMap dialInfo;
166         dialInfo.PutIntValue("accountId", options.accountId);
167         dialInfo.PutIntValue("videoState", options.videoState);
168         dialInfo.PutIntValue("dialScene", options.dialScene);
169         dialInfo.PutIntValue("dialType", options.dialType);
170         std::string temPhoneNumber = phoneNumber;
171         int32_t err = DelayedSingleton<CallManagerClient>::GetInstance()->DialCall(
172             Str8ToStr16(temPhoneNumber), dialInfo);
173         return ConvertCJErrCode(err);
174     }
175 
HasVoiceCapability()176     bool TelephonyCallImpl::HasVoiceCapability()
177     {
178         return DelayedSingleton<CallManagerClient>::GetInstance()->HasVoiceCapability();
179     }
180 
FormatPhoneNumber(char * cPhoneNumber,char * cCountryCode,int32_t * errCode)181     char* TelephonyCallImpl::FormatPhoneNumber(char *cPhoneNumber, char *cCountryCode, int32_t *errCode)
182     {
183         std::u16string formatNumber = u"";
184         std::string tmpPhoneNumber = cPhoneNumber;
185         std::string tmpCountryCode = cCountryCode;
186         std::u16string phoneNumber = Str8ToStr16(tmpPhoneNumber);
187         std::u16string countryCode = Str8ToStr16(tmpCountryCode);
188         int32_t err = DelayedSingleton<CallManagerClient>::GetInstance()->FormatPhoneNumber(
189             phoneNumber, countryCode, formatNumber);
190         *errCode = ConvertCJErrCode(err);
191         std::string result = Str16ToStr8(formatNumber);
192         return MallocCString(result);
193     }
194 }
195 }