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 #include "js_utils.h"
17
18 #ifndef MAC_PLATFORM
19 #include "securec.h"
20 #endif
21
22 namespace OHOS {
23 namespace PreferencesJsKit {
Convert2NativeValue(napi_env env,napi_value jsValue,std::string & output)24 int32_t JSUtils::Convert2NativeValue(napi_env env, napi_value jsValue, std::string &output)
25 {
26 size_t bufferSize = 0;
27 napi_status status = napi_get_value_string_utf8(env, jsValue, nullptr, 0, &bufferSize);
28 if (status != napi_ok) {
29 LOG_DEBUG("get std::string failed, status = %{public}d", status);
30 return napi_invalid_arg;
31 }
32 if (bufferSize > MAX_VALUE_LENGTH) {
33 LOG_ERROR("string must be less than the limit length.");
34 return EXCEED_MAX_LENGTH;
35 }
36 char *buffer = (char *)malloc(bufferSize + 1);
37 if (buffer == nullptr) {
38 LOG_ERROR("malloc failed, buffer is nullptr.");
39 return ERR;
40 }
41 status = napi_get_value_string_utf8(env, jsValue, buffer, bufferSize + 1, &bufferSize);
42 if (status != napi_ok) {
43 free(buffer);
44 LOG_DEBUG("JSUtils::Convert2NativeValue get jsVal failed, status = %{public}d", status);
45 return napi_invalid_arg;
46 }
47 output = buffer;
48 free(buffer);
49 return napi_ok;
50 }
51
Convert2NativeValue(napi_env env,napi_value jsValue,bool & output)52 int32_t JSUtils::Convert2NativeValue(napi_env env, napi_value jsValue, bool &output)
53 {
54 bool bValue = false;
55 napi_status status = napi_get_value_bool(env, jsValue, &bValue);
56 if (status != napi_ok) {
57 LOG_DEBUG("get bool failed, status = %{public}d", status);
58 return napi_invalid_arg;
59 }
60 output = bValue;
61 return napi_ok;
62 }
63
Convert2NativeValue(napi_env env,napi_value jsValue,double & output)64 int32_t JSUtils::Convert2NativeValue(napi_env env, napi_value jsValue, double &output)
65 {
66 double number = 0.0;
67 napi_status status = napi_get_value_double(env, jsValue, &number);
68 if (status != napi_ok) {
69 LOG_DEBUG("get double failed, status = %{public}d", status);
70 return napi_invalid_arg;
71 }
72 output = number;
73 return napi_ok;
74 }
75
Convert2NativeValue(napi_env env,napi_value jsValue,float & output)76 int32_t JSUtils::Convert2NativeValue(napi_env env, napi_value jsValue, float &output)
77 {
78 LOG_DEBUG("Convert2NativeValue js just support double data not support float");
79 return napi_invalid_arg;
80 }
81
Convert2NativeValue(napi_env env,napi_value jsValue,int32_t & output)82 int32_t JSUtils::Convert2NativeValue(napi_env env, napi_value jsValue, int32_t &output)
83 {
84 LOG_DEBUG("Convert2NativeValue js just support double data not support int32_t");
85 return napi_invalid_arg;
86 }
87
Convert2NativeValue(napi_env env,napi_value jsValue,int64_t & output)88 int32_t JSUtils::Convert2NativeValue(napi_env env, napi_value jsValue, int64_t &output)
89 {
90 LOG_DEBUG("Convert2NativeValue js just support double data not support int64_t");
91 return napi_invalid_arg;
92 }
93
Convert2NativeValue(napi_env env,napi_value jsValue,std::vector<uint8_t> & output)94 int32_t JSUtils::Convert2NativeValue(napi_env env, napi_value jsValue, std::vector<uint8_t> &output)
95 {
96 bool isTypedarray = false;
97 napi_status result = napi_is_typedarray(env, jsValue, &isTypedarray);
98 if (result != napi_ok || !isTypedarray) {
99 LOG_ERROR("napi_is_typedarray fail");
100 return napi_invalid_arg;
101 }
102 napi_typedarray_type type = napi_uint8_array;
103 size_t length = 0;
104 void *data = nullptr;
105 result = napi_get_typedarray_info(env, jsValue, &type, &length, &data, nullptr, nullptr);
106 if (result != napi_ok) {
107 LOG_ERROR("napi_get_typedarray_info fail");
108 return napi_invalid_arg;
109 }
110 if (type != napi_uint8_array) {
111 LOG_ERROR("value is not napi_uint8_array");
112 return napi_invalid_arg;
113 }
114 if (length > MAX_VALUE_LENGTH) {
115 LOG_ERROR("unit8Array must be less than the limit length.");
116 return EXCEED_MAX_LENGTH;
117 }
118 output.clear();
119 if (length > 0) {
120 output.resize(length);
121 output.assign(static_cast<uint8_t*>(data), static_cast<uint8_t*>(data) + length);
122 }
123 return napi_ok;
124 }
125
Convert2NativeValue(napi_env env,napi_value jsValue,std::monostate & value)126 int32_t JSUtils::Convert2NativeValue(napi_env env, napi_value jsValue, std::monostate &value)
127 {
128 napi_value tempValue;
129 napi_get_null(env, &tempValue);
130 bool equal = false;
131 napi_strict_equals(env, jsValue, tempValue, &equal);
132 if (equal) {
133 return napi_ok;
134 }
135 napi_get_undefined(env, &tempValue);
136 napi_strict_equals(env, jsValue, tempValue, &equal);
137 if (equal) {
138 return napi_ok;
139 }
140 LOG_DEBUG("std::monostate is not null");
141 return napi_invalid_arg;
142 }
143
Equals(napi_env env,napi_value value,napi_ref copy)144 bool JSUtils::Equals(napi_env env, napi_value value, napi_ref copy)
145 {
146 if (copy == nullptr) {
147 return (value == nullptr);
148 }
149
150 napi_value copyValue = nullptr;
151 napi_get_reference_value(env, copy, ©Value);
152
153 bool isEquals = false;
154 napi_strict_equals(env, value, copyValue, &isEquals);
155 return isEquals;
156 }
157
Convert2JSValue(napi_env env,int32_t value)158 napi_value JSUtils::Convert2JSValue(napi_env env, int32_t value)
159 {
160 napi_value jsValue;
161 if (napi_create_int32(env, value, &jsValue) != napi_ok) {
162 LOG_DEBUG("Convert int32_t failed");
163 return nullptr;
164 }
165 return jsValue;
166 }
167
Convert2JSValue(napi_env env,uint32_t value)168 napi_value JSUtils::Convert2JSValue(napi_env env, uint32_t value)
169 {
170 napi_value jsValue;
171 if (napi_create_uint32(env, value, &jsValue) != napi_ok) {
172 LOG_DEBUG("Convert uint32_t failed");
173 return nullptr;
174 }
175 return jsValue;
176 }
177
Convert2JSValue(napi_env env,int64_t value)178 napi_value JSUtils::Convert2JSValue(napi_env env, int64_t value)
179 {
180 napi_value jsValue;
181 if (napi_create_int64(env, value, &jsValue) != napi_ok) {
182 LOG_DEBUG("Convert int64_t failed");
183 return nullptr;
184 }
185 return jsValue;
186 }
187
Convert2JSValue(napi_env env,bool value)188 napi_value JSUtils::Convert2JSValue(napi_env env, bool value)
189 {
190 napi_value jsValue;
191 if (napi_get_boolean(env, value, &jsValue) != napi_ok) {
192 LOG_DEBUG("Convert bool failed");
193 return nullptr;
194 }
195 return jsValue;
196 }
197
Convert2JSValue(napi_env env,double value)198 napi_value JSUtils::Convert2JSValue(napi_env env, double value)
199 {
200 napi_value jsValue;
201 if (napi_create_double(env, value, &jsValue) != napi_ok) {
202 LOG_DEBUG("Convert double failed");
203 return nullptr;
204 }
205 return jsValue;
206 }
207
Convert2JSValue(napi_env env,float value)208 napi_value JSUtils::Convert2JSValue(napi_env env, float value)
209 {
210 napi_value jsValue;
211 if (napi_create_double(env, value, &jsValue) != napi_ok) {
212 LOG_DEBUG("Convert float failed");
213 return nullptr;
214 }
215 return jsValue;
216 }
217
Convert2JSValue(napi_env env,const std::vector<uint8_t> & value)218 napi_value JSUtils::Convert2JSValue(napi_env env, const std::vector<uint8_t> &value)
219 {
220 size_t size = value.size();
221 void *data = nullptr;
222 napi_value buffer = nullptr;
223 napi_status ret = napi_create_arraybuffer(env, size, &data, &buffer);
224 if (ret != napi_ok) {
225 LOG_ERROR("napi_create_arraybuffer failed %{public}d", ret);
226 return nullptr;
227 }
228 if (size != 0) {
229 std::copy(value.begin(), value.end(), static_cast<uint8_t*>(data));
230 }
231 napi_value napiValue = nullptr;
232 ret = napi_create_typedarray(env, napi_uint8_array, size, buffer, 0, &napiValue);
233 if (ret != napi_ok) {
234 LOG_ERROR("napi_create_typedarray failed %{public}d", ret);
235 return nullptr;
236 }
237 return napiValue;
238 }
239
Convert2JSValue(napi_env env,const std::string & value)240 napi_value JSUtils::Convert2JSValue(napi_env env, const std::string &value)
241 {
242 napi_value jsValue = nullptr;
243 if (napi_create_string_utf8(env, value.c_str(), value.size(), &jsValue) != napi_ok) {
244 LOG_DEBUG("Convert std::string failed");
245 return nullptr;
246 }
247 return jsValue;
248 }
249
Convert2JSValue(napi_env env,const std::monostate & value)250 napi_value JSUtils::Convert2JSValue(napi_env env, const std::monostate &value)
251 {
252 napi_value result = nullptr;
253 napi_get_null(env, &result);
254 return result;
255 }
256 } // namespace PreferencesJsKit
257 } // namespace OHOS
258