1 /*
2 * Copyright (c) 2021 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 #ifndef DISTRIBUTEDDATAMGR_APPDATAMGR_JSUTILS_H
17 #define DISTRIBUTEDDATAMGR_APPDATAMGR_JSUTILS_H
18
19 #include <iostream>
20 #include <map>
21 #include <string>
22 #include <variant>
23 #include <vector>
24 #include <type_traits>
25
26 #include "log_print.h"
27
28 #include "napi/native_api.h"
29 #include "napi/native_common.h"
30 #include "napi/native_node_api.h"
31
32 namespace OHOS {
33 namespace PreferencesJsKit {
34 namespace JSUtils {
35 constexpr int OK = 0;
36 constexpr int ERR = -1;
37 constexpr int EXCEED_MAX_LENGTH = -2;
38 constexpr int32_t DEFAULT_BUF_SIZE = 1024;
39 constexpr int32_t BUF_CACHE_MARGIN = 4;
40 constexpr int32_t ASYNC_RST_SIZE = 2;
41 constexpr int32_t MAX_VALUE_LENGTH = 8 * 1024;
42 constexpr int32_t SYNC_RESULT_ELEMNT_NUM = 2;
43
44 bool Equals(napi_env env, napi_value value, napi_ref copy);
45
46 int32_t Convert2NativeValue(napi_env env, napi_value jsValue, bool &output);
47 int32_t Convert2NativeValue(napi_env env, napi_value jsValue, float &output);
48 int32_t Convert2NativeValue(napi_env env, napi_value jsValue, double &output);
49 int32_t Convert2NativeValue(napi_env env, napi_value jsValue, int32_t &output);
50 int32_t Convert2NativeValue(napi_env env, napi_value jsValue, int64_t &output);
51 int32_t Convert2NativeValue(napi_env env, napi_value jsValue, std::vector<uint8_t> &output);
52 int32_t Convert2NativeValue(napi_env env, napi_value jsValue, std::string &output);
53 int32_t Convert2NativeValue(napi_env env, napi_value jsValue, std::monostate &value);
54
55 template<typename T> int32_t Convert2NativeValue(napi_env env, napi_value jsValue, std::vector<T> &value);
56
57 template<typename... Types>
58 int32_t Convert2NativeValue(napi_env env, napi_value jsValue, std::variant<Types...> &value);
59
60 napi_value Convert2JSValue(napi_env env, int32_t value);
61 napi_value Convert2JSValue(napi_env env, int64_t value);
62 napi_value Convert2JSValue(napi_env env, uint32_t value);
63 napi_value Convert2JSValue(napi_env env, bool value);
64 napi_value Convert2JSValue(napi_env env, float value);
65 napi_value Convert2JSValue(napi_env env, double value);
66 napi_value Convert2JSValue(napi_env env, const std::vector<uint8_t> &value);
67 napi_value Convert2JSValue(napi_env env, const std::string &value);
68 napi_value Convert2JSValue(napi_env env, const std::monostate &value);
69
70 template<typename T>
71 std::enable_if_t<std::is_class_v<T>, napi_value> Convert2JSValue(napi_env env, const T &value);
72 template<typename T>
73 std::enable_if_t<!std::is_class_v<T>, napi_value> Convert2JSValue(napi_env env, T value);
74
75 template<typename T> napi_value Convert2JSValue(napi_env env, const std::vector<T> &value);
76
77 template<typename... Types> napi_value Convert2JSValue(napi_env env, const std::variant<Types...> &value);
78
GetCPPValue(napi_env env,napi_value jsValue,T & value)79 template<typename T> int32_t GetCPPValue(napi_env env, napi_value jsValue, T &value)
80 {
81 napi_valuetype type;
82 napi_typeof(env, jsValue, &type);
83 LOG_ERROR("parameter type error, jsValue type is %{public}d", type);
84 return napi_invalid_arg;
85 }
86
GetCPPValue(napi_env env,napi_value jsValue,T & value)87 template<typename T, typename First, typename... Types> int32_t GetCPPValue(napi_env env, napi_value jsValue, T &value)
88 {
89 First cValue;
90 auto ret = Convert2NativeValue(env, jsValue, cValue);
91 if (ret == napi_ok) {
92 value = cValue;
93 return ret;
94 }
95 return GetCPPValue<T, Types...>(env, jsValue, value);
96 }
97
GetJSValue(napi_env env,const T & value)98 template<typename T> napi_value GetJSValue(napi_env env, const T &value)
99 {
100 return nullptr;
101 }
102
GetJSValue(napi_env env,const T & value)103 template<typename T, typename First, typename... Types> napi_value GetJSValue(napi_env env, const T &value)
104 {
105 auto *val = std::get_if<First>(&value);
106 if (val != nullptr) {
107 return Convert2JSValue(env, *val);
108 }
109 return GetJSValue<T, Types...>(env, value);
110 }
111 } // namespace JSUtils
112
Convert2NativeValue(napi_env env,napi_value jsValue,std::vector<T> & value)113 template<typename T> int32_t JSUtils::Convert2NativeValue(napi_env env, napi_value jsValue, std::vector<T> &value)
114 {
115 bool isArray = false;
116 napi_is_array(env, jsValue, &isArray);
117 if (!isArray) {
118 return napi_invalid_arg;
119 }
120
121 uint32_t arrLen = 0;
122 napi_get_array_length(env, jsValue, &arrLen);
123 if (arrLen == 0) {
124 return napi_ok;
125 }
126
127 for (size_t i = 0; i < arrLen; ++i) {
128 napi_value element;
129 napi_get_element(env, jsValue, i, &element);
130 T item;
131 auto status = Convert2NativeValue(env, element, item);
132 if (status != napi_ok) {
133 return napi_invalid_arg;
134 }
135 value.push_back(std::move(item));
136 }
137 return napi_ok;
138 }
139
140 template<typename... Types>
Convert2NativeValue(napi_env env,napi_value jsValue,std::variant<Types...> & value)141 int32_t JSUtils::Convert2NativeValue(napi_env env, napi_value jsValue, std::variant<Types...> &value)
142 {
143 return GetCPPValue<decltype(value), Types...>(env, jsValue, value);
144 }
145
Convert2JSValue(napi_env env,const std::vector<T> & value)146 template<typename T> napi_value JSUtils::Convert2JSValue(napi_env env, const std::vector<T> &value)
147 {
148 napi_value jsValue;
149 napi_status status = napi_create_array_with_length(env, value.size(), &jsValue);
150 if (status != napi_ok) {
151 return nullptr;
152 }
153
154 for (size_t i = 0; i < value.size(); ++i) {
155 napi_set_element(env, jsValue, i, Convert2JSValue(env, static_cast<const T &>(value[i])));
156 }
157 return jsValue;
158 }
159
Convert2JSValue(napi_env env,const std::variant<Types...> & value)160 template<typename... Types> napi_value JSUtils::Convert2JSValue(napi_env env, const std::variant<Types...> &value)
161 {
162 return GetJSValue<decltype(value), Types...>(env, value);
163 }
164 } // namespace PreferencesJsKit
165 } // namespace OHOS
166
167 #endif // DISTRIBUTEDDATAMGR_APPDATAMGR_JSUTILS_H
168