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