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, "Failed to call mmap function. Possible causes: Oversized mapping request."}},
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,
38 "Failed to call dup function. Possible causes: The file descriptor has already been closed."}}
39 };
40
GetError(napi_env & env) const41 napi_value NapiError::GetError(napi_env& env) const
42 {
43 napi_value napiError = nullptr;
44 if (!IsError()) {
45 napi_get_undefined(env, &napiError);
46 return napiError;
47 }
48
49 napi_value napiCode = nullptr;
50 std::string msg = napiErrMap_[errorCode_].errorMsg;
51 int code = napiErrMap_[errorCode_].errorCode;
52 std::string codeStr = std::to_string(code);
53
54 NAPI_CALL(env, napi_create_string_utf8(env, codeStr.c_str(), codeStr.size(), &napiCode));
55 napi_value napiMsg = nullptr;
56 NAPI_CALL(env, napi_create_string_utf8(env, msg.c_str(), msg.size(), &napiMsg));
57 NAPI_CALL(env, napi_create_error(env, napiCode, napiMsg, &napiError));
58
59 ZLOGD(LOG_LABEL, "throw error code:%{public}d, msg:%{public}s,", code, msg.c_str());
60 return napiError;
61 }
62
ThrowError(napi_env & env,int32_t code)63 napi_value NapiError::ThrowError(napi_env& env, int32_t code)
64 {
65 Error(code);
66 napi_value error = GetError(env);
67 napi_throw(env, error);
68 return nullptr;
69 }
70
EnumClassConstructor(napi_env env,napi_callback_info info)71 napi_value EnumClassConstructor(napi_env env, napi_callback_info info)
72 {
73 size_t argc = 0;
74 napi_value args[1] = {0};
75 napi_value ret = nullptr;
76 void *data = nullptr;
77 napi_status status = napi_get_cb_info(env, info, &argc, args, &ret, &data);
78 NAPI_ASSERT(env, status == napi_ok, "EnumClassConstructor init failed");
79 return ret;
80 }
81
GetNapiInt32(const napi_env & env,int32_t number)82 napi_value GetNapiInt32(const napi_env &env, int32_t number)
83 {
84 napi_value value = nullptr;
85 napi_create_int32(env, number, &value);
86 return value;
87 }
88
NAPIRpcErrorEnumExport(napi_env env,napi_value exports)89 napi_value NapiError::NAPIRpcErrorEnumExport(napi_env env, napi_value exports)
90 {
91 napi_property_descriptor desc[] = {
92 DECLARE_NAPI_STATIC_PROPERTY("CHECK_PARAM_ERROR",
93 GetNapiInt32(env, NapiError::napiErrMap_[CHECK_PARAM_ERROR].errorCode)),
94 DECLARE_NAPI_STATIC_PROPERTY("OS_MMAP_ERROR",
95 GetNapiInt32(env, NapiError::napiErrMap_[OS_MMAP_ERROR].errorCode)),
96 DECLARE_NAPI_STATIC_PROPERTY("OS_IOCTL_ERROR",
97 GetNapiInt32(env, NapiError::napiErrMap_[OS_IOCTL_ERROR].errorCode)),
98 DECLARE_NAPI_STATIC_PROPERTY("WRITE_TO_ASHMEM_ERROR",
99 GetNapiInt32(env, NapiError::napiErrMap_[WRITE_TO_ASHMEM_ERROR].errorCode)),
100 DECLARE_NAPI_STATIC_PROPERTY("READ_FROM_ASHMEM_ERROR",
101 GetNapiInt32(env, NapiError::napiErrMap_[READ_FROM_ASHMEM_ERROR].errorCode)),
102 DECLARE_NAPI_STATIC_PROPERTY("ONLY_PROXY_OBJECT_PERMITTED_ERROR",
103 GetNapiInt32(env, NapiError::napiErrMap_[ONLY_PROXY_OBJECT_PERMITTED_ERROR].errorCode)),
104 DECLARE_NAPI_STATIC_PROPERTY("ONLY_REMOTE_OBJECT_PERMITTED_ERROR", GetNapiInt32(env,
105 NapiError::napiErrMap_[ONLY_REMOTE_OBJECT_PERMITTED_ERROR].errorCode)),
106 DECLARE_NAPI_STATIC_PROPERTY("COMMUNICATION_ERROR",
107 GetNapiInt32(env, NapiError::napiErrMap_[COMMUNICATION_ERROR].errorCode)),
108 DECLARE_NAPI_STATIC_PROPERTY("PROXY_OR_REMOTE_OBJECT_INVALID_ERROR",
109 GetNapiInt32(env, NapiError::napiErrMap_[PROXY_OR_REMOTE_OBJECT_INVALID_ERROR].errorCode)),
110 DECLARE_NAPI_STATIC_PROPERTY("WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR",
111 GetNapiInt32(env, NapiError::napiErrMap_[WRITE_DATA_TO_MESSAGE_SEQUENCE_ERROR].errorCode)),
112 DECLARE_NAPI_STATIC_PROPERTY("READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR",
113 GetNapiInt32(env, NapiError::napiErrMap_[READ_DATA_FROM_MESSAGE_SEQUENCE_ERROR].errorCode)),
114 DECLARE_NAPI_STATIC_PROPERTY("PARCEL_MEMORY_ALLOC_ERROR",
115 GetNapiInt32(env, NapiError::napiErrMap_[PARCEL_MEMORY_ALLOC_ERROR].errorCode)),
116 DECLARE_NAPI_STATIC_PROPERTY("CALL_JS_METHOD_ERROR",
117 GetNapiInt32(env, NapiError::napiErrMap_[CALL_JS_METHOD_ERROR].errorCode)),
118 DECLARE_NAPI_STATIC_PROPERTY("OS_DUP_ERROR",
119 GetNapiInt32(env, NapiError::napiErrMap_[OS_DUP_ERROR].errorCode))
120 };
121 napi_value constructor = nullptr;
122 napi_define_class(env, "ErrorCode", NAPI_AUTO_LENGTH, EnumClassConstructor, nullptr,
123 sizeof(desc) / sizeof(*desc), desc, &constructor);
124 napi_set_named_property(env, exports, "ErrorCode", constructor);
125 NAPI_ASSERT(env, constructor != nullptr, "define error enum failed");
126 return exports;
127 }
128 } // OHOS