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 }