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 #include "log_print.h"
19
20 #ifndef MAC_PLATFORM
21 #include "securec.h"
22 #endif
23
24 namespace OHOS {
25 namespace PreferencesJsKit {
Convert2NativeValue(napi_env env,napi_value jsValue,std::string & output)26 int32_t JSUtils::Convert2NativeValue(napi_env env, napi_value jsValue, std::string &output)
27 {
28 size_t bufferSize = 0;
29 napi_status status = napi_get_value_string_utf8(env, jsValue, nullptr, 0, &bufferSize);
30 if (status != napi_ok) {
31 LOG_DEBUG("get std::string failed, status = %{public}d", status);
32 return napi_invalid_arg;
33 }
34 if (bufferSize > MAX_VALUE_LENGTH) {
35 LOG_ERROR("get std::string maximum length.");
36 return EXCEED_MAX_LENGTH;
37 }
38 char *buffer = (char *)malloc(bufferSize + 1);
39 if (buffer == nullptr) {
40 LOG_ERROR("malloc failed, buffer is nullptr.");
41 return ERR;
42 }
43 status = napi_get_value_string_utf8(env, jsValue, buffer, bufferSize + 1, &bufferSize);
44 if (status != napi_ok) {
45 free(buffer);
46 LOG_DEBUG("JSUtils::Convert2NativeValue get jsVal failed, status = %{public}d", status);
47 return napi_invalid_arg;
48 }
49 output = buffer;
50 free(buffer);
51 return napi_ok;
52 }
53
Convert2NativeValue(napi_env env,napi_value jsValue,bool & output)54 int32_t JSUtils::Convert2NativeValue(napi_env env, napi_value jsValue, bool &output)
55 {
56 bool bValue = false;
57 napi_status status = napi_get_value_bool(env, jsValue, &bValue);
58 if (status != napi_ok) {
59 LOG_DEBUG("get bool failed, status = %{public}d", status);
60 return napi_invalid_arg;
61 }
62 output = bValue;
63 return napi_ok;
64 }
65
Convert2NativeValue(napi_env env,napi_value jsValue,double & output)66 int32_t JSUtils::Convert2NativeValue(napi_env env, napi_value jsValue, double &output)
67 {
68 double number = 0.0;
69 napi_status status = napi_get_value_double(env, jsValue, &number);
70 if (status != napi_ok) {
71 LOG_DEBUG("get double failed, status = %{public}d", status);
72 return napi_invalid_arg;
73 }
74 output = number;
75 return napi_ok;
76 }
77
Convert2NativeValue(napi_env env,napi_value jsValue,float & output)78 int32_t JSUtils::Convert2NativeValue(napi_env env, napi_value jsValue, float &output)
79 {
80 LOG_DEBUG("Convert2NativeValue js just support double data not support float");
81 return napi_invalid_arg;
82 }
83
Convert2NativeValue(napi_env env,napi_value jsValue,int32_t & output)84 int32_t JSUtils::Convert2NativeValue(napi_env env, napi_value jsValue, int32_t &output)
85 {
86 LOG_DEBUG("Convert2NativeValue js just support double data not support int32_t");
87 return napi_invalid_arg;
88 }
89
Convert2NativeValue(napi_env env,napi_value jsValue,int64_t & output)90 int32_t JSUtils::Convert2NativeValue(napi_env env, napi_value jsValue, int64_t &output)
91 {
92 LOG_DEBUG("Convert2NativeValue js just support double data not support int64_t");
93 return napi_invalid_arg;
94 }
95
Convert2NativeValue(napi_env env,napi_value jsValue,std::monostate & value)96 int32_t JSUtils::Convert2NativeValue(napi_env env, napi_value jsValue, std::monostate &value)
97 {
98 napi_value tempValue;
99 napi_get_null(env, &tempValue);
100 bool equal = false;
101 napi_strict_equals(env, jsValue, tempValue, &equal);
102 if (equal) {
103 return napi_ok;
104 }
105 napi_get_undefined(env, &tempValue);
106 napi_strict_equals(env, jsValue, tempValue, &equal);
107 if (equal) {
108 return napi_ok;
109 }
110 LOG_DEBUG("std::monostate is not null");
111 return napi_invalid_arg;
112 }
113
Equals(napi_env env,napi_value value,napi_ref copy)114 bool JSUtils::Equals(napi_env env, napi_value value, napi_ref copy)
115 {
116 if (copy == nullptr) {
117 return (value == nullptr);
118 }
119
120 napi_value copyValue = nullptr;
121 napi_get_reference_value(env, copy, ©Value);
122
123 bool isEquals = false;
124 napi_strict_equals(env, value, copyValue, &isEquals);
125 return isEquals;
126 }
127
Convert2JSValue(napi_env env,int32_t value)128 napi_value JSUtils::Convert2JSValue(napi_env env, int32_t value)
129 {
130 napi_value jsValue;
131 if (napi_create_int32(env, value, &jsValue) != napi_ok) {
132 LOG_DEBUG("Convert int32_t failed");
133 return nullptr;
134 }
135 return jsValue;
136 }
137
Convert2JSValue(napi_env env,uint32_t value)138 napi_value JSUtils::Convert2JSValue(napi_env env, uint32_t value)
139 {
140 napi_value jsValue;
141 if (napi_create_uint32(env, value, &jsValue) != napi_ok) {
142 LOG_DEBUG("Convert uint32_t failed");
143 return nullptr;
144 }
145 return jsValue;
146 }
147
Convert2JSValue(napi_env env,int64_t value)148 napi_value JSUtils::Convert2JSValue(napi_env env, int64_t value)
149 {
150 napi_value jsValue;
151 if (napi_create_int64(env, value, &jsValue) != napi_ok) {
152 LOG_DEBUG("Convert int64_t failed");
153 return nullptr;
154 }
155 return jsValue;
156 }
157
Convert2JSValue(napi_env env,bool value)158 napi_value JSUtils::Convert2JSValue(napi_env env, bool value)
159 {
160 napi_value jsValue;
161 if (napi_get_boolean(env, value, &jsValue) != napi_ok) {
162 LOG_DEBUG("Convert bool failed");
163 return nullptr;
164 }
165 return jsValue;
166 }
167
Convert2JSValue(napi_env env,double value)168 napi_value JSUtils::Convert2JSValue(napi_env env, double value)
169 {
170 napi_value jsValue;
171 if (napi_create_double(env, value, &jsValue) != napi_ok) {
172 LOG_DEBUG("Convert double failed");
173 return nullptr;
174 }
175 return jsValue;
176 }
177
Convert2JSValue(napi_env env,float value)178 napi_value JSUtils::Convert2JSValue(napi_env env, float value)
179 {
180 napi_value jsValue;
181 if (napi_create_double(env, value, &jsValue) != napi_ok) {
182 LOG_DEBUG("Convert float failed");
183 return nullptr;
184 }
185 return jsValue;
186 }
187
Convert2JSValue(napi_env env,const std::string & value)188 napi_value JSUtils::Convert2JSValue(napi_env env, const std::string &value)
189 {
190 napi_value jsValue;
191 if (napi_create_string_utf8(env, value.c_str(), value.size(), &jsValue) != napi_ok) {
192 LOG_DEBUG("Convert std::string failed");
193 return nullptr;
194 }
195 return jsValue;
196 }
197
Convert2JSValue(napi_env env,const std::monostate & value)198 napi_value JSUtils::Convert2JSValue(napi_env env, const std::monostate &value)
199 {
200 napi_value result = nullptr;
201 napi_get_null(env, &result);
202 return result;
203 }
204 } // namespace PreferencesJsKit
205 } // namespace OHOS
206