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 "securec.h"
19
20 namespace OHOS {
21 namespace AppDataMgrJsKit {
Convert2String(napi_env env,napi_value jsStr,bool useDefaultBufSize)22 std::string JSUtils::Convert2String(napi_env env, napi_value jsStr, bool useDefaultBufSize)
23 {
24 size_t str_buffer_size = 0;
25 napi_get_value_string_utf8(env, jsStr, nullptr, 0, &str_buffer_size);
26 str_buffer_size = (useDefaultBufSize && (str_buffer_size > DEFAULT_BUF_SIZE))
27 ? (DEFAULT_BUF_SIZE + BUF_CACHE_MARGIN)
28 : (str_buffer_size + BUF_CACHE_MARGIN);
29 char *buf = new char[str_buffer_size + 1];
30 size_t len = 0;
31 napi_get_value_string_utf8(env, jsStr, buf, str_buffer_size, &len);
32 buf[len] = 0;
33 std::string value(buf);
34 delete[] buf;
35 return value;
36 }
37
Convert2StrVector(napi_env env,napi_value value)38 std::vector<std::string> JSUtils::Convert2StrVector(napi_env env, napi_value value)
39 {
40 uint32_t arrLen = 0;
41 napi_get_array_length(env, value, &arrLen);
42 if (arrLen == 0) {
43 return {};
44 }
45 std::vector<std::string> result;
46 for (size_t i = 0; i < arrLen; ++i) {
47 napi_value element;
48 napi_get_element(env, value, i, &element);
49 result.push_back(ConvertAny2String(env, element));
50 }
51 return result;
52 }
53
Convert2U8Vector(napi_env env,napi_value input_array)54 std::vector<uint8_t> JSUtils::Convert2U8Vector(napi_env env, napi_value input_array)
55 {
56 bool isTypedArray = false;
57 napi_is_typedarray(env, input_array, &isTypedArray);
58 if (!isTypedArray) {
59 return {};
60 }
61
62 napi_typedarray_type type;
63 napi_value input_buffer = nullptr;
64 size_t byte_offset = 0;
65 size_t length = 0;
66 void *data = nullptr;
67 napi_get_typedarray_info(env, input_array, &type, &length, &data, &input_buffer, &byte_offset);
68 if (type != napi_uint8_array || data == nullptr) {
69 return {};
70 }
71 return std::vector<uint8_t>((uint8_t *)data, ((uint8_t *)data) + length);
72 }
73
ConvertAny2String(napi_env env,napi_value jsValue)74 std::string JSUtils::ConvertAny2String(napi_env env, napi_value jsValue)
75 {
76 napi_valuetype valueType = napi_undefined;
77 NAPI_CALL_BASE(env, napi_typeof(env, jsValue, &valueType), "napi_typeof failed");
78 if (valueType == napi_string) {
79 return JSUtils::Convert2String(env, jsValue, false);
80 } else if (valueType == napi_number) {
81 double valueNumber;
82 napi_get_value_double(env, jsValue, &valueNumber);
83 return std::to_string(valueNumber);
84 } else if (valueType == napi_boolean) {
85 bool valueBool = false;
86 napi_get_value_bool(env, jsValue, &valueBool);
87 return std::to_string(valueBool);
88 } else if (valueType == napi_null) {
89 return "null";
90 } else if (valueType == napi_object) {
91 std::vector<uint8_t> bytes = JSUtils::Convert2U8Vector(env, jsValue);
92 std::string ret(bytes.begin(), bytes.end());
93 return ret;
94 }
95
96 return "invalid type";
97 }
98
Convert2JSValue(napi_env env,const std::vector<std::string> & value)99 napi_value JSUtils::Convert2JSValue(napi_env env, const std::vector<std::string> &value)
100 {
101 napi_value jsValue;
102 napi_status status = napi_create_array_with_length(env, value.size(), &jsValue);
103 if (status != napi_ok) {
104 return nullptr;
105 }
106
107 for (size_t i = 0; i < value.size(); ++i) {
108 napi_set_element(env, jsValue, i, Convert2JSValue(env, value[i]));
109 }
110 return jsValue;
111 }
112
Convert2JSValue(napi_env env,const std::string & value)113 napi_value JSUtils::Convert2JSValue(napi_env env, const std::string &value)
114 {
115 napi_value jsValue;
116 napi_status status = napi_create_string_utf8(env, value.c_str(), value.size(), &jsValue);
117 if (status != napi_ok) {
118 return nullptr;
119 }
120 return jsValue;
121 }
122
Convert2JSValue(napi_env env,const std::vector<uint8_t> & value)123 napi_value JSUtils::Convert2JSValue(napi_env env, const std::vector<uint8_t> &value)
124 {
125 napi_value jsValue;
126 void *native = nullptr;
127 napi_value buffer = nullptr;
128 napi_status status = napi_create_arraybuffer(env, value.size(), &native, &buffer);
129 if (status != napi_ok) {
130 return nullptr;
131 }
132 int result = memcpy_s(native, value.size(), value.data(), value.size());
133 if (result != EOK && value.size() > 0) {
134 return nullptr;
135 }
136 status = napi_create_typedarray(env, napi_uint8_array, value.size(), buffer, 0, &jsValue);
137 if (status != napi_ok) {
138 return nullptr;
139 }
140 return jsValue;
141 }
142
Convert2JSValue(napi_env env,int32_t value)143 napi_value JSUtils::Convert2JSValue(napi_env env, int32_t value)
144 {
145 napi_value jsValue;
146 napi_status status = napi_create_int32(env, value, &jsValue);
147 if (status != napi_ok) {
148 return nullptr;
149 }
150 return jsValue;
151 }
152
Convert2JSValue(napi_env env,int64_t value)153 napi_value JSUtils::Convert2JSValue(napi_env env, int64_t value)
154 {
155 napi_value jsValue;
156 napi_status status = napi_create_int64(env, value, &jsValue);
157 if (status != napi_ok) {
158 return nullptr;
159 }
160 return jsValue;
161 }
162
Convert2JSValue(napi_env env,double value)163 napi_value JSUtils::Convert2JSValue(napi_env env, double value)
164 {
165 napi_value jsValue;
166 napi_status status = napi_create_double(env, value, &jsValue);
167 if (status != napi_ok) {
168 return nullptr;
169 }
170 return jsValue;
171 }
172
Convert2JSValue(napi_env env,bool value)173 napi_value JSUtils::Convert2JSValue(napi_env env, bool value)
174 {
175 napi_value jsValue;
176 napi_status status = napi_get_boolean(env, value, &jsValue);
177 if (status != napi_ok) {
178 return nullptr;
179 }
180 return jsValue;
181 }
182
Convert2JSValue(napi_env env,const std::map<std::string,int> & value)183 napi_value JSUtils::Convert2JSValue(napi_env env, const std::map<std::string, int> &value)
184 {
185 napi_value jsValue;
186 napi_status status = napi_create_array_with_length(env, value.size(), &jsValue);
187 if (status != napi_ok) {
188 return nullptr;
189 }
190
191 int index = 0;
192 for (const auto& [device, result] : value) {
193 napi_value jsElement;
194 status = napi_create_array_with_length(env, SYNC_RESULT_ELEMNT_NUM, &jsElement);
195 if (status != napi_ok) {
196 return nullptr;
197 }
198 napi_set_element(env, jsElement, 0, Convert2JSValue(env, device));
199 napi_set_element(env, jsElement, 1, Convert2JSValue(env, result));
200 napi_set_element(env, jsValue, index++, jsElement);
201 }
202
203 return jsValue;
204 }
205 } // namespace AppDataMgrJsKit
206 } // namespace OHOS
207