* Copyright (c) 2025 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "sms_utils.h"
#include "enum_convert_for_js.h"
#include "napi_util.h"
#include "sms_service_manager_client.h"
#include "state_registry_errors.h"
#include "telephony_types.h"
namespace OHOS {
namespace Telephony {
char* MallocCString(const std::string& origin)
{
if (origin.empty()) {
return nullptr;
}
auto len = origin.length() + 1;
if (len > 10000) {
return nullptr;
}
char* res = static_cast<char*>(malloc(sizeof(char) * len));
if (res == nullptr) {
return nullptr;
}
return std::char_traits<char>::copy(res, origin.c_str(), len);
}
bool CreateCommonArgumentErrorCodeForCj(int32_t errorCode, int32_t& error)
{
bool flag = true;
switch (errorCode) {
case TELEPHONY_ERR_ARGUMENT_MISMATCH:
case TELEPHONY_ERR_ARGUMENT_INVALID:
case TELEPHONY_ERR_ARGUMENT_NULL:
case TELEPHONY_ERR_SLOTID_INVALID:
error = JS_ERROR_TELEPHONY_ARGUMENT_ERROR;
break;
default:
flag = false;
break;
}
return flag;
}
bool CreateCommonServiceErrorCodeForCj(int32_t errorCode, int32_t& error)
{
bool flag = true;
switch (errorCode) {
case TELEPHONY_ERR_DESCRIPTOR_MISMATCH:
case TELEPHONY_ERR_WRITE_DESCRIPTOR_TOKEN_FAIL:
case TELEPHONY_ERR_WRITE_DATA_FAIL:
case TELEPHONY_ERR_WRITE_REPLY_FAIL:
case TELEPHONY_ERR_READ_DATA_FAIL:
case TELEPHONY_ERR_IPC_CONNECT_STUB_FAIL:
case TELEPHONY_ERR_REGISTER_CALLBACK_FAIL:
case TELEPHONY_ERR_CALLBACK_ALREADY_REGISTERED:
case TELEPHONY_ERR_UNINIT:
case TELEPHONY_ERR_UNREGISTER_CALLBACK_FAIL:
error = JS_ERROR_TELEPHONY_SERVICE_ERROR;
break;
default:
flag = false;
break;
}
return flag;
}
bool CreateCommonSystemErrorCodeForCj(int32_t errorCode, int32_t& error)
{
bool flag = true;
switch (errorCode) {
case TELEPHONY_ERR_FAIL:
case TELEPHONY_ERR_MEMCPY_FAIL:
case TELEPHONY_ERR_MEMSET_FAIL:
case TELEPHONY_ERR_STRCPY_FAIL:
case TELEPHONY_ERR_LOCAL_PTR_NULL:
case TELEPHONY_ERR_SUBSCRIBE_BROADCAST_FAIL:
case TELEPHONY_ERR_PUBLISH_BROADCAST_FAIL:
case TELEPHONY_ERR_ADD_DEATH_RECIPIENT_FAIL:
case TELEPHONY_ERR_STRTOINT_FAIL:
case TELEPHONY_ERR_RIL_CMD_FAIL:
case TELEPHONY_ERR_DATABASE_WRITE_FAIL:
case TELEPHONY_ERR_DATABASE_READ_FAIL:
case TELEPHONY_ERR_UNKNOWN_NETWORK_TYPE:
error = JS_ERROR_TELEPHONY_SYSTEM_ERROR;
break;
case TELEPHONY_ERR_NO_SIM_CARD:
error = JS_ERROR_TELEPHONY_NO_SIM_CARD;
break;
case TELEPHONY_ERR_ILLEGAL_USE_OF_SYSTEM_API:
error = JS_ERROR_ILLEGAL_USE_OF_SYSTEM_API;
break;
case TELEPHONY_ERR_AIRPLANE_MODE_ON:
error = JS_ERROR_TELEPHONY_AIRPLANE_MODE_ON;
break;
case TELEPHONY_ERR_NETWORK_NOT_IN_SERVICE:
error = JS_ERROR_TELEPHONY_NETWORK_NOT_IN_SERVICE;
break;
default:
flag = false;
break;
}
return flag;
}
bool CreateCommonErrorCodeForCj(int32_t errorCode, int32_t& error)
{
if ((errorCode < COMMON_ERR_OFFSET || errorCode >= CALL_ERR_OFFSET)) {
return false;
}
if (CreateCommonArgumentErrorCodeForCj(errorCode, error) || CreateCommonServiceErrorCodeForCj(errorCode, error) ||
CreateCommonSystemErrorCodeForCj(errorCode, error)) {
return true;
}
return false;
}
bool CreateParameterErrorCodeForCj(int32_t errorCode, int32_t& error)
{
bool flag = true;
switch (errorCode) {
case ERROR_SERVICE_UNAVAILABLE:
case ERROR_NATIVE_API_EXECUTE_FAIL:
error = JS_ERROR_TELEPHONY_SYSTEM_ERROR;
break;
case ERROR_PARAMETER_COUNTS_INVALID:
case ERROR_PARAMETER_TYPE_INVALID:
error = JS_ERROR_TELEPHONY_INVALID_INPUT_PARAMETER;
break;
case ERROR_SLOT_ID_INVALID:
error = JS_ERROR_TELEPHONY_ARGUMENT_ERROR;
break;
default:
flag = false;
break;
}
return flag;
}
bool CreateCommonCallErrorCodeForCj(int32_t errorCode, int32_t& error)
{
bool flag = true;
switch (errorCode) {
case TELEPHONY_CALL_ERR_NUMBER_OUT_OF_RANGE:
case TELEPHONY_CALL_ERR_PHONE_NUMBER_EMPTY:
case TELEPHONY_CALL_ERR_FORMAT_PHONE_NUMBER_FAILED:
error = JS_ERROR_TELEPHONY_ARGUMENT_ERROR;
break;
case TELEPHONY_CALL_ERR_PARAMETER_OUT_OF_RANGE:
case TELEPHONY_CALL_ERR_INVALID_SLOT_ID:
error = JS_ERROR_TELEPHONY_ARGUMENT_ERROR;
break;
case TELEPHONY_CALL_ERR_CONFERENCE_CALL_EXCEED_LIMIT:
error = JS_ERROR_TELEPHONY_CONFERENCE_EXCEED_LIMIT;
break;
case TELEPHONY_CALL_ERR_CONFERENCE_CALL_IS_NOT_ACTIVE:
error = JS_ERROR_TELEPHONY_CONFERENCE_CALL_NOT_ACTIVE;
break;
case TELEPHONY_CALL_ERR_CALL_COUNTS_EXCEED_LIMIT:
error = JS_ERROR_TELEPHONY_CALL_COUNTS_EXCEED_LIMIT;
break;
case TELEPHONY_CALL_ERR_CALL_IS_NOT_ACTIVATED:
case TELEPHONY_CALL_ERR_ILLEGAL_CALL_OPERATION:
case TELEPHONY_CALL_ERR_AUDIO_SETTING_MUTE_FAILED:
case TELEPHONY_CALL_ERR_CALL_IS_NOT_ON_HOLDING:
case TELEPHONY_CALL_ERR_PHONE_CALLS_TOO_FEW:
case TELEPHONY_CALL_ERR_VIDEO_ILLEGAL_CALL_TYPE:
case TELEPHONY_CALL_ERR_CONFERENCE_NOT_EXISTS:
case TELEPHONY_CALL_ERR_CONFERENCE_SEPERATE_FAILED:
case TELEPHONY_CALL_ERR_EMERGENCY_UNSUPPORT_CONFERENCEABLE:
case TELEPHONY_CALL_ERR_VOLTE_NOT_SUPPORT:
case TELEPHONY_CALL_ERR_VOLTE_PROVISIONING_DISABLED:
error = JS_ERROR_TELEPHONY_SYSTEM_ERROR;
break;
case TELEPHONY_CALL_ERR_DIAL_IS_BUSY:
error = JS_ERROR_TELEPHONY_DIAL_IS_BUSY;
break;
default:
flag = false;
break;
}
return flag;
}
bool CreateVideoCallErrorCodeForCj(int32_t errorCode, int32_t& error)
{
bool flag = true;
switch (errorCode) {
case TELEPHONY_CALL_ERR_VIDEO_ILLEGAL_MEDIA_TYPE:
case TELEPHONY_CALL_ERR_VIDEO_IN_PROGRESS:
case TELEPHONY_CALL_ERR_VIDEO_ILLEAGAL_SCENARIO:
case TELEPHONY_CALL_ERR_VIDEO_MODE_CHANGE_NOTIFY_FAILED:
case TELEPHONY_CALL_ERR_VIDEO_NOT_SUPPORTED:
case TELEPHONY_CALL_ERR_SETTING_AUDIO_DEVICE_FAILED:
case TELEPHONY_CALL_ERR_VIDEO_INVALID_COORDINATES:
case TELEPHONY_CALL_ERR_VIDEO_INVALID_ZOOM:
case TELEPHONY_CALL_ERR_VIDEO_INVALID_ROTATION:
case TELEPHONY_CALL_ERR_VIDEO_INVALID_CAMERA_ID:
case TELEPHONY_CALL_ERR_INVALID_PATH:
case TELEPHONY_CALL_ERR_CAMERA_NOT_TURNED_ON:
case TELEPHONY_CALL_ERR_INVALID_DIAL_SCENE:
case TELEPHONY_CALL_ERR_INVALID_VIDEO_STATE:
case TELEPHONY_CALL_ERR_UNKNOW_DIAL_TYPE:
error = JS_ERROR_TELEPHONY_SYSTEM_ERROR;
break;
default:
flag = false;
break;
}
return flag;
}
bool CreateSupplementServiceCallErrorCodeForCj(int32_t errorCode, int32_t& error)
{
bool flag = true;
switch (errorCode) {
case TELEPHONY_CALL_ERR_INVALID_RESTRICTION_TYPE:
case TELEPHONY_CALL_ERR_INVALID_RESTRICTION_MODE:
case TELEPHONY_CALL_ERR_INVALID_TRANSFER_TYPE:
case TELEPHONY_CALL_ERR_INVALID_TRANSFER_SETTING_TYPE:
error = JS_ERROR_TELEPHONY_ARGUMENT_ERROR;
break;
case TELEPHONY_CALL_ERR_FUNCTION_NOT_SUPPORTED:
error = JS_ERROR_DEVICE_NOT_SUPPORT_THIS_API;
break;
case TELEPHONY_CALL_ERR_INVALID_TRANSFER_TIME:
case TELEPHONY_CALL_ERR_NAPI_INTERFACE_FAILED:
case TELEPHONY_CALL_ERR_CALLBACK_ALREADY_EXIST:
case TELEPHONY_CALL_ERR_RESOURCE_UNAVAILABLE:
error = JS_ERROR_TELEPHONY_SYSTEM_ERROR;
break;
case TELEPHONY_CALL_ERR_UT_NO_CONNECTION:
error = JS_ERROR_CALL_UT_NO_CONNECTION;
break;
default:
flag = false;
break;
}
return flag;
}
bool CreateCallErrorCodeForCj(int32_t errorCode, int32_t& error)
{
if ((errorCode < CALL_ERR_OFFSET || errorCode >= CELLULAR_DATA_ERR_OFFSET)) {
return false;
}
if (CreateCommonCallErrorCodeForCj(errorCode, error) || CreateVideoCallErrorCodeForCj(errorCode, error) ||
CreateSupplementServiceCallErrorCodeForCj(errorCode, error)) {
return true;
}
return false;
}
bool CreateDataErrorCodeForCj(int32_t errorCode, int32_t& error)
{
if ((errorCode < CELLULAR_DATA_ERR_OFFSET || errorCode >= SMS_MMS_ERR_OFFSET)) {
return false;
}
bool flag = true;
switch (errorCode) {
case TELEPHONY_CELLULAR_DATA_INVALID_PARAM:
error = JS_ERROR_CELLULAR_DATA_BASE_ERROR;
break;
default:
flag = false;
break;
}
return flag;
}
bool CreateNetworkSearchErrorCodeForCj(int32_t errorCode, int32_t& error)
{
if ((errorCode < CORE_SERVICE_NETWORK_SEARCH_ERR_OFFSET || errorCode >= CORE_SERVICE_CORE_ERR_OFFSET)) {
return false;
}
bool flag = true;
switch (errorCode) {
case CORE_SERVICE_SEND_CALLBACK_FAILED:
case CORE_SERVICE_RADIO_PROTOCOL_TECH_UNKNOWN:
error = JS_ERROR_TELEPHONY_SYSTEM_ERROR;
break;
default:
flag = false;
break;
}
return flag;
}
bool CreateVcardErrorCodeForCj(int32_t errorCode, int32_t& error)
{
bool flag = true;
switch (errorCode) {
case TELEPHONY_ERR_VCARD_FILE_INVALID:
error = JS_ERROR_TELEPHONY_SYSTEM_ERROR;
break;
default:
flag = false;
break;
}
return flag;
}
bool CreateSimErrorCodeForCj(int32_t errorCode, int32_t& error)
{
if ((errorCode < CORE_SERVICE_SIM_ERR_OFFSET || errorCode >= CORE_SERVICE_NETWORK_SEARCH_ERR_OFFSET)) {
return false;
}
bool flag = true;
switch (errorCode) {
case CORE_SERVICE_SIM_CARD_IS_NOT_ACTIVE:
error = JS_ERROR_SIM_CARD_IS_NOT_ACTIVE;
break;
case CORE_ERR_SIM_CARD_LOAD_FAILED:
case CORE_ERR_SIM_CARD_UPDATE_FAILED:
error = JS_ERROR_SIM_CARD_OPERATION_ERROR;
break;
case CORE_ERR_OPERATOR_KEY_NOT_EXIT:
case CORE_ERR_OPERATOR_CONF_NOT_EXIT:
error = JS_ERROR_OPERATOR_CONFIG_ERROR;
break;
default:
flag = false;
break;
}
return flag;
}
bool CreateSmsErrorCodeForCj(int32_t errorCode, int32_t& error)
{
if ((errorCode < SMS_MMS_ERR_OFFSET || errorCode >= STATE_REGISTRY_ERR_OFFSET)) {
return false;
}
bool flag = true;
switch (errorCode) {
case TELEPHONY_SMS_MMS_DECODE_DATA_EMPTY:
case TELEPHONY_SMS_MMS_UNKNOWN_SIM_MESSAGE_STATUS:
case TELEPHONY_SMS_MMS_MESSAGE_LENGTH_OUT_OF_RANGE:
error = JS_ERROR_TELEPHONY_SYSTEM_ERROR;
break;
default:
flag = false;
break;
}
return flag;
}
bool CreateObserverErrorCodeForCj(int32_t errorCode, int32_t& error)
{
if ((errorCode < STATE_REGISTRY_ERR_OFFSET || errorCode >= NET_MANAGER_ERR_OFFSET)) {
return false;
}
bool flag = true;
switch (errorCode) {
case TELEPHONY_STATE_REGISTRY_SLODID_ERROR:
error = JS_ERROR_TELEPHONY_ARGUMENT_ERROR;
break;
case TELEPHONY_STATE_REGISTRY_PERMISSION_DENIED:
error = JS_ERROR_TELEPHONY_PERMISSION_DENIED;
break;
case TELEPHONY_STATE_REGISTRY_DATA_NOT_EXIST:
case TELEPHONY_STATE_UNREGISTRY_DATA_NOT_EXIST:
case TELEPHONY_STATE_REGISTRY_DATA_EXIST:
case TELEPHONY_STATE_REGISTRY_NOT_IMPLEMENTED:
error = JS_ERROR_TELEPHONY_SYSTEM_ERROR;
break;
default:
flag = false;
break;
}
return flag;
}
int32_t ConverErrorCodeForCj(int32_t errorCode)
{
int32_t error = 0;
if (errorCode == TELEPHONY_ERR_SUCCESS) {
return JS_ERROR_TELEPHONY_SUCCESS;
}
if (CreateParameterErrorCodeForCj(errorCode, error)) {
return error;
}
if (!CreateCommonErrorCodeForCj(errorCode, error) && !CreateCallErrorCodeForCj(errorCode, error) &&
!CreateDataErrorCodeForCj(errorCode, error) && !CreateNetworkSearchErrorCodeForCj(errorCode, error) &&
!CreateVcardErrorCodeForCj(errorCode, error) && !CreateSimErrorCodeForCj(errorCode, error) &&
!CreateSmsErrorCodeForCj(errorCode, error) && !CreateObserverErrorCodeForCj(errorCode, error)) {
error = JS_ERROR_TELEPHONY_UNKNOW_ERROR;
}
return error;
}
int32_t ConverErrorCodeWithPermissionForCj(int32_t errorCode)
{
if (errorCode == TELEPHONY_ERR_PERMISSION_ERR) {
return JS_ERROR_TELEPHONY_PERMISSION_DENIED;
}
return ConverErrorCodeForCj(errorCode);
}
}
}