• 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 #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