• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, &copyValue);
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