1 /*
2 * Copyright (C) 2022 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
16 #include "napi_rpc_error.h"
17 #include "ipc_debug.h"
18 #include "log_tags.h"
19
20 namespace OHOS {
21 static constexpr OHOS::HiviewDFX::HiLogLabel LOG_LABEL = { LOG_CORE, LOG_ID_IPC_NAPI, "napi_rpc_error" };
22
23 std::map<int, errorInfo> NapiError::napiErrMap_ {
24 {CHECK_PARAM_ERROR, errorInfo{401, "check param error"}},
25 {OS_MMAP_ERROR, errorInfo{1900001, "os mmap function failed"}},
26 {OS_IOCTL_ERROR, errorInfo{1900002, "os ioctl function failed"}},
27 {WRITE_TO_ASHMEM_ERROR, errorInfo{1900003, "write to ashmem failed"}},
28 {READ_FROM_ASHMEM_ERROR, errorInfo{1900004, "read from ashmem failed"}},
29 {ONLY_PROXY_OBJECT_PERMITTED_ERROR, errorInfo{1900005, "only proxy object permitted"}},
30 {ONLY_REMOTE_OBJECT_PERMITTED_ERROR, errorInfo{1900006, "only remote object permitted"}},
31 {COMMUNICATION_ERROR, errorInfo{1900007, "communication failed"}},
32 {PROXY_OR_REMOTE_OBJECT_INVALID_ERROR, errorInfo{1900008, "proxy or remote object is invalid"}},
33 {WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR, errorInfo{1900009, "write data to message sequence failed"}},
34 {READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR, errorInfo{1900010, "read data from message sequence failed"}},
35 {PARCEL_MEMORY_ALLOC_ERROR, errorInfo{1900011, "parcel memory alloc failed"}},
36 {CALL_JS_METHOD_ERROR, errorInfo{1900012, "call js method failed"}},
37 {OS_DUP_ERROR, errorInfo{1900013, "os dup function failed"}}
38 };
39
GetError(napi_env & env) const40 napi_value NapiError::GetError(napi_env& env) const
41 {
42 napi_value napiError = nullptr;
43 if (!IsError()) {
44 napi_get_undefined(env, &napiError);
45 return napiError;
46 }
47
48 napi_value napiCode = nullptr;
49 std::string msg = napiErrMap_[errorCode_].errorMsg;
50 int code = napiErrMap_[errorCode_].errorCode;
51 std::string codeStr = std::to_string(code);
52
53 NAPI_CALL(env, napi_create_string_utf8(env, codeStr.c_str(), codeStr.size(), &napiCode));
54 napi_value napiMsg = nullptr;
55 NAPI_CALL(env, napi_create_string_utf8(env, msg.c_str(), msg.size(), &napiMsg));
56 NAPI_CALL(env, napi_create_error(env, napiCode, napiMsg, &napiError));
57
58 ZLOGD(LOG_LABEL, "throw error code:%{public}d, msg:%{public}s,", code, msg.c_str());
59 return napiError;
60 }
61
ThrowError(napi_env & env,int32_t code)62 napi_value NapiError::ThrowError(napi_env& env, int32_t code)
63 {
64 Error(code);
65 napi_value error = GetError(env);
66 napi_throw(env, error);
67 return nullptr;
68 }
69
EnumClassConstructor(napi_env env,napi_callback_info info)70 napi_value EnumClassConstructor(napi_env env, napi_callback_info info)
71 {
72 size_t argc = 0;
73 napi_value args[1] = {0};
74 napi_value ret = nullptr;
75 void *data = nullptr;
76 napi_status status = napi_get_cb_info(env, info, &argc, args, &ret, &data);
77 NAPI_ASSERT(env, status == napi_ok, "EnumClassConstructor init failed");
78 return ret;
79 }
80
GetNapiInt32(const napi_env & env,int32_t number)81 napi_value GetNapiInt32(const napi_env &env, int32_t number)
82 {
83 napi_value value = nullptr;
84 napi_create_int32(env, number, &value);
85 return value;
86 }
87
NAPIRpcErrorEnumExport(napi_env env,napi_value exports)88 napi_value NapiError::NAPIRpcErrorEnumExport(napi_env env, napi_value exports)
89 {
90 napi_property_descriptor desc[] = {
91 DECLARE_NAPI_STATIC_PROPERTY("CHECK_PARAM_ERROR",
92 GetNapiInt32(env, NapiError::napiErrMap_[CHECK_PARAM_ERROR].errorCode)),
93 DECLARE_NAPI_STATIC_PROPERTY("OS_MMAP_ERROR",
94 GetNapiInt32(env, NapiError::napiErrMap_[OS_MMAP_ERROR].errorCode)),
95 DECLARE_NAPI_STATIC_PROPERTY("OS_IOCTL_ERROR",
96 GetNapiInt32(env, NapiError::napiErrMap_[OS_IOCTL_ERROR].errorCode)),
97 DECLARE_NAPI_STATIC_PROPERTY("WRITE_TO_ASHMEM_ERROR",
98 GetNapiInt32(env, NapiError::napiErrMap_[WRITE_TO_ASHMEM_ERROR].errorCode)),
99 DECLARE_NAPI_STATIC_PROPERTY("READ_FROM_ASHMEM_ERROR",
100 GetNapiInt32(env, NapiError::napiErrMap_[READ_FROM_ASHMEM_ERROR].errorCode)),
101 DECLARE_NAPI_STATIC_PROPERTY("ONLY_PROXY_OBJECT_PERMITTED_ERROR",
102 GetNapiInt32(env, NapiError::napiErrMap_[ONLY_PROXY_OBJECT_PERMITTED_ERROR].errorCode)),
103 DECLARE_NAPI_STATIC_PROPERTY("ONLY_REMOTE_OBJECT_PERMITTED_ERROR", GetNapiInt32(env,
104 NapiError::napiErrMap_[ONLY_REMOTE_OBJECT_PERMITTED_ERROR].errorCode)),
105 DECLARE_NAPI_STATIC_PROPERTY("COMMUNICATION_ERROR",
106 GetNapiInt32(env, NapiError::napiErrMap_[COMMUNICATION_ERROR].errorCode)),
107 DECLARE_NAPI_STATIC_PROPERTY("PROXY_OR_REMOTE_OBJECT_INVALID_ERROR",
108 GetNapiInt32(env, NapiError::napiErrMap_[PROXY_OR_REMOTE_OBJECT_INVALID_ERROR].errorCode)),
109 DECLARE_NAPI_STATIC_PROPERTY("WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR",
110 GetNapiInt32(env, NapiError::napiErrMap_[WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR].errorCode)),
111 DECLARE_NAPI_STATIC_PROPERTY("READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR",
112 GetNapiInt32(env, NapiError::napiErrMap_[READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR].errorCode)),
113 DECLARE_NAPI_STATIC_PROPERTY("PARCEL_MEMORY_ALLOC_ERROR",
114 GetNapiInt32(env, NapiError::napiErrMap_[PARCEL_MEMORY_ALLOC_ERROR].errorCode)),
115 DECLARE_NAPI_STATIC_PROPERTY("CALL_JS_METHOD_ERROR",
116 GetNapiInt32(env, NapiError::napiErrMap_[CALL_JS_METHOD_ERROR].errorCode)),
117 DECLARE_NAPI_STATIC_PROPERTY("OS_DUP_ERROR",
118 GetNapiInt32(env, NapiError::napiErrMap_[OS_DUP_ERROR].errorCode))
119 };
120 napi_value constructor = nullptr;
121 napi_define_class(env, "ErrorCode", NAPI_AUTO_LENGTH, EnumClassConstructor, nullptr,
122 sizeof(desc) / sizeof(*desc), desc, &constructor);
123 napi_set_named_property(env, exports, "ErrorCode", constructor);
124 NAPI_ASSERT(env, constructor != nullptr, "define error enum failed");
125 return exports;
126 }
127 } // OHOS