1 /*
2 * Copyright (c) 2025 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 <securec.h>
16 #include <stdio.h>
17 #include "softbus_error_code.h"
18 #include "softbus_napi_utils.h"
19
20 typedef struct {
21 int32_t errorCode;
22 const char *errorMessage;
23 } NapiSoftbusErrEntry;
24
25 typedef struct {
26 int32_t cErrCode;
27 int32_t jsErrCode;
28 } NapiSoftbusErrCMapJs;
29
30 const NapiSoftbusErrCMapJs ERRCODE_C_JS_MAP[] = {
31 { SOFTBUS_ACCESS_TOKEN_DENIED, COMMON_ACCESS_TOKEN_DENIED },
32 { SOFTBUS_CONN_BR_DISABLE_ERR, NAPI_SOFTBUS_LINK_DISABLED },
33 { SOFTBUS_INVALID_PARAM, COMMON_INVALID_PARAM },
34 { SOFTBUS_TRANS_INVALID_CHANNEL_ID, NAPI_SOFTBUS_CHANNEL_UNAVAILABLE },
35 { SOFTBUS_CONN_OPEN_PROXY_TIMEOUT, NAPI_SOFTBUS_OPEN_OPERATION_FAILED },
36 { SOFTBUS_TRANS_BR_PROXY_DATA_TOO_LONG, NAPI_SOFTBUS_DATA_TOO_LONG },
37 { SOFTBUS_TRANS_BR_PROXY_TOKENID_ERR, NAPI_SOFTBUS_CALL_IS_RESTRICTED },
38 { SOFTBUS_CONN_BR_UNDERLAY_WRITE_FAIL, NAPI_SOFTBUS_SEND_OPERATION_FAILED },
39 { SOFTBUS_CONN_BR_UNDERLAY_CONNECT_FAIL, NAPI_SOFTBUS_DEVICE_NOT_PAIRED },
40 { SOFTBUS_TRANS_BR_PROXY_CALLER_RESTRICTED, NAPI_SOFTBUS_CALL_IS_RESTRICTED },
41 { SOFTBUS_CONN_BR_UNPAIRED, NAPI_SOFTBUS_DEVICE_NOT_PAIRED },
42 { SOFTBUS_TRANS_SESSION_OPENING, NAPI_SOFTBUS_CHANNEL_REOPEN },
43 { SOFTBUS_TRANS_BR_PROXY_INVALID_PARAM, NAPI_SOFTBUS_INVALID_PARAM },
44 };
45
46 const NapiSoftbusErrEntry ERRCODE_MSG_MAP[] = {
47 { COMMON_ACCESS_TOKEN_DENIED,
48 "BusinessError 201:Permission denied. need permission: ohos.permission.ACCESS_BLUETOOTH." },
49 { COMMON_INVALID_PARAM, "BusinessError 401:Parameter error." },
50 { NAPI_SOFTBUS_LINK_DISABLED, "BusinessError 32390001: BR is disabled." },
51 { NAPI_SOFTBUS_DEVICE_NOT_PAIRED, "BusinessError 32390002: Device not paired." },
52 { NAPI_SOFTBUS_PROFILE_NOT_SUPPORT, "BusinessError 32390003: Profile not supported" },
53 { NAPI_SOFTBUS_CHANNEL_UNAVAILABLE, "BusinessError 32390004: ChannelId is invalid or unavailable" },
54 { NAPI_SOFTBUS_CHANNEL_REOPEN, "BusinessError 32390005: The channel is repeatedly opened." },
55 { NAPI_SOFTBUS_INVALID_PARAM, "BusinessError 32390006: Parameter error." },
56 { NAPI_SOFTBUS_INTERNAL_ERROR, "BusinessError 32390100: Internal error, It is can be ignored." },
57 { NAPI_SOFTBUS_CALL_IS_RESTRICTED, "BusinessError 32390101: Call is restricted." },
58 { NAPI_SOFTBUS_OPEN_OPERATION_FAILED,
59 "BusinessError 32390102: Operation failed or Connection timed out." },
60 { NAPI_SOFTBUS_DATA_TOO_LONG, "BusinessError 32390103: Data too long." },
61 { NAPI_SOFTBUS_SEND_OPERATION_FAILED, "BusinessError 32390104: Send failed." },
62 { NAPI_SOFTBUS_UNKNOWN_ERR, "BusinessError 30200000: unknow error" },
63 };
64
GetErrMsgByErrCode(int32_t errCode)65 const char *GetErrMsgByErrCode(int32_t errCode)
66 {
67 size_t mapSize = sizeof(ERRCODE_MSG_MAP) / sizeof(ERRCODE_MSG_MAP[0]);
68 for (size_t i = 0; i < mapSize; ++i) {
69 if (ERRCODE_MSG_MAP[i].errorCode == errCode) {
70 return ERRCODE_MSG_MAP[i].errorMessage;
71 }
72 }
73 return NULL;
74 }
75
CreateBusinessError(napi_env env,int32_t errCode)76 static napi_value CreateBusinessError(napi_env env, int32_t errCode)
77 {
78 const char *commMsg = GetErrMsgByErrCode(errCode);
79 napi_value result = NULL;
80 if (commMsg == NULL) {
81 napi_get_undefined(env, &result);
82 return result;
83 }
84
85 napi_value message = NULL;
86 napi_create_string_utf8(env, commMsg, NAPI_AUTO_LENGTH, &message);
87
88 napi_value code = NULL;
89 napi_create_int32(env, errCode, &code);
90
91 napi_value businessError = NULL;
92 napi_create_object(env, &businessError);
93 napi_set_named_property(env, businessError, "code", code);
94 napi_set_named_property(env, businessError, "message", message);
95 return businessError;
96 }
97
NapiTransConvertErr(int32_t err)98 static int32_t NapiTransConvertErr(int32_t err)
99 {
100 size_t mapSize = sizeof(ERRCODE_C_JS_MAP) / sizeof(ERRCODE_C_JS_MAP[0]);
101 for (size_t i = 0; i < mapSize; ++i) {
102 if (err == ERRCODE_C_JS_MAP[i].cErrCode) {
103 return ERRCODE_C_JS_MAP[i].jsErrCode;
104 }
105 }
106
107 return NAPI_SOFTBUS_INTERNAL_ERROR;
108 }
109
ThrowBusinessError(napi_env env,int32_t errCode,bool isThrow)110 static void ThrowBusinessError(napi_env env, int32_t errCode, bool isThrow)
111 {
112 #define MAX_ERROR_CODE_LEN 50
113 const char *commMsg = GetErrMsgByErrCode(errCode);
114 char str[MAX_ERROR_CODE_LEN] = {0};
115 int32_t ret = sprintf_s(str, sizeof(str), "%d", errCode);
116 if (ret < 0) {
117 return;
118 }
119 napi_throw_error(env, str, commMsg);
120 }
121
ThrowErrFromC2Js(napi_env env,int32_t err)122 void ThrowErrFromC2Js(napi_env env, int32_t err)
123 {
124 if (err == SOFTBUS_OK) {
125 return;
126 }
127 int32_t jsRet = NapiTransConvertErr(err);
128 ThrowBusinessError(env, jsRet, true);
129 }
130
GetBusinessError(napi_env env,int32_t errCode)131 napi_value GetBusinessError(napi_env env, int32_t errCode)
132 {
133 napi_value businessError = NULL;
134 int32_t jsRet = NapiTransConvertErr(errCode);
135 businessError = CreateBusinessError(env, jsRet);
136 return businessError;
137 }