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