• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 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 "js_util.h"
19 
20 namespace OHOS {
21 namespace MiscServices {
22 constexpr int32_t STR_MAX_LENGTH = 4096;
23 constexpr size_t STR_TAIL_LENGTH = 1;
24 constexpr size_t ARGC_MAX = 6;
25 constexpr size_t ARGC_ONE = 1;
26 const std::map<int32_t, int32_t> JsUtils::ERROR_CODE_MAP = {
27     { ErrorCode::ERROR_CONTROLLER_INVOKING_FAILED, EXCEPTION_CONTROLLER },
28     { ErrorCode::ERROR_STATUS_PERMISSION_DENIED, EXCEPTION_PERMISSION },
29     { ErrorCode::ERROR_STATUS_SYSTEM_PERMISSION, EXCEPTION_SYSTEM_PERMISSION },
30     { ErrorCode::ERROR_REMOTE_CLIENT_DIED, EXCEPTION_IMCLIENT },
31     { ErrorCode::ERROR_CLIENT_NOT_FOUND, EXCEPTION_IMCLIENT },
32     { ErrorCode::ERROR_CLIENT_NULL_POINTER, EXCEPTION_IMCLIENT },
33     { ErrorCode::ERROR_CLIENT_NOT_FOCUSED, EXCEPTION_IMCLIENT },
34     { ErrorCode::ERROR_CLIENT_NOT_EDITABLE, EXCEPTION_EDITABLE },
35     { ErrorCode::ERROR_CLIENT_NOT_BOUND, EXCEPTION_DETACHED },
36     { ErrorCode::ERROR_CLIENT_ADD_FAILED, EXCEPTION_IMCLIENT },
37     { ErrorCode::ERROR_NULL_POINTER, EXCEPTION_IMMS },
38     { ErrorCode::ERROR_BAD_PARAMETERS, EXCEPTION_IMMS },
39     { ErrorCode::ERROR_SERVICE_START_FAILED, EXCEPTION_IMMS },
40     { ErrorCode::ERROR_IME_START_FAILED, EXCEPTION_IMMS },
41     { ErrorCode::ERROR_KBD_SHOW_FAILED, EXCEPTION_IMMS },
42     { ErrorCode::ERROR_KBD_HIDE_FAILED, EXCEPTION_IMMS },
43     { ErrorCode::ERROR_IME_NOT_STARTED, EXCEPTION_IMMS },
44     { ErrorCode::ERROR_EX_NULL_POINTER, EXCEPTION_IMMS },
45     { ErrorCode::ERROR_PERSIST_CONFIG, EXCEPTION_CONFPERSIST },
46     { ErrorCode::ERROR_PACKAGE_MANAGER, EXCEPTION_PACKAGEMANAGER },
47     { ErrorCode::ERROR_EX_UNSUPPORTED_OPERATION, EXCEPTION_IMMS },
48     { ErrorCode::ERROR_EX_SERVICE_SPECIFIC, EXCEPTION_IMMS },
49     { ErrorCode::ERROR_EX_PARCELABLE, EXCEPTION_IMMS },
50     { ErrorCode::ERROR_EX_ILLEGAL_ARGUMENT, EXCEPTION_IMMS },
51     { ErrorCode::ERROR_EX_ILLEGAL_STATE, EXCEPTION_IMMS },
52     { ErrorCode::ERROR_IME_START_INPUT_FAILED, EXCEPTION_IMMS },
53     { ErrorCode::ERROR_NOT_IME, EXCEPTION_IME },
54     { ErrorCode::ERROR_IME, EXCEPTION_IMENGINE },
55     { ErrorCode::ERROR_PARAMETER_CHECK_FAILED, EXCEPTION_PARAMCHECK },
56     { ErrorCode::ERROR_NOT_DEFAULT_IME, EXCEPTION_DEFAULTIME },
57     { ErrorCode::ERROR_ENABLE_IME, EXCEPTION_IMMS },
58     { ErrorCode::ERROR_NOT_CURRENT_IME, EXCEPTION_IMMS },
59     { ErrorCode::ERROR_PANEL_NOT_FOUND, EXCEPTION_PANEL_NOT_FOUND },
60     { ErrorCode::ERROR_WINDOW_MANAGER, EXCEPTION_WINDOW_MANAGER },
61     { ErrorCode::ERROR_GET_TEXT_CONFIG, EXCEPTION_IMCLIENT },
62     { ErrorCode::ERROR_INVALID_PRIVATE_COMMAND_SIZE, EXCEPTION_PARAMCHECK },
63     { ErrorCode::ERROR_TEXT_LISTENER_ERROR, EXCEPTION_IMCLIENT },
64     { ErrorCode::ERROR_TEXT_PREVIEW_NOT_SUPPORTED, EXCEPTION_TEXT_PREVIEW_NOT_SUPPORTED },
65     { ErrorCode::ERROR_INVALID_RANGE, EXCEPTION_PARAMCHECK },
66     { ErrorCode::ERROR_SECURITY_MODE_OFF, EXCEPTION_BASIC_MODE },
67     { ErrorCode::ERROR_MSG_HANDLER_NOT_REGIST, EXCEPTION_REQUEST_NOT_ACCEPT },
68     { ErrorCode::ERROR_MESSAGE_HANDLER, EXCEPTION_IMCLIENT },
69     { ErrorCode::ERROR_INVALID_ARRAY_BUFFER_SIZE, EXCEPTION_PARAMCHECK },
70     { ErrorCode::ERROR_INVALID_PANEL_TYPE, EXCEPTION_INVALID_PANEL_TYPE_FLAG },
71     { ErrorCode::ERROR_INVALID_PANEL_FLAG, EXCEPTION_INVALID_PANEL_TYPE_FLAG },
72 };
73 
74 const std::map<int32_t, std::string> JsUtils::ERROR_CODE_CONVERT_MESSAGE_MAP = {
75     { EXCEPTION_PERMISSION, "the permissions check fails." },
76     { EXCEPTION_SYSTEM_PERMISSION, "not system application." },
77     { EXCEPTION_PARAMCHECK, "the parameters check fails." },
78     { EXCEPTION_UNSUPPORTED, "call unsupported api." },
79     { EXCEPTION_PACKAGEMANAGER, "package manager error." },
80     { EXCEPTION_IMENGINE, "input method engine error." },
81     { EXCEPTION_IMCLIENT, "input method client error." },
82     { EXCEPTION_IME, "not an input method extension." },
83     { EXCEPTION_CONFPERSIST, "configuration persisting error." },
84     { EXCEPTION_CONTROLLER, "input method controller error." },
85     { EXCEPTION_SETTINGS, "input method settings extension error." },
86     { EXCEPTION_IMMS, "input method manager service error." },
87     { EXCEPTION_DETACHED, "input method not attached." },
88     { EXCEPTION_DEFAULTIME, "not default input method configured by system." },
89     { EXCEPTION_TEXT_PREVIEW_NOT_SUPPORTED, "text preview is not supported." },
90     { EXCEPTION_PANEL_NOT_FOUND, "soft keyboard panel doesn't exist." },
91     { EXCEPTION_WINDOW_MANAGER, "window manager service error." },
92     { EXCEPTION_BASIC_MODE, "the intput method is basic mode." },
93     { EXCEPTION_REQUEST_NOT_ACCEPT, "the another side does not accept the request." },
94     { EXCEPTION_EDITABLE, "the edit mode need enable." },
95     { EXCEPTION_INVALID_PANEL_TYPE_FLAG, "invalid panel type or panel flag." },
96 };
97 
98 const std::map<int32_t, std::string> JsUtils::PARAMETER_TYPE = {
99     { TYPE_UNDEFINED, "napi_undefine." },
100     { TYPE_NULL, "napi_null." },
101     { TYPE_BOOLEAN, "napi_boolean." },
102     { TYPE_NUMBER, "napi_number." },
103     { TYPE_STRING, "napi_string." },
104     { TYPE_SYMBOL, "napi_symbol." },
105     { TYPE_OBJECT, "napi_object." },
106     { TYPE_FUNCTION, "napi_function." },
107     { TYPE_EXTERNAL, "napi_external." },
108     { TYPE_BIGINT, "napi_bigint." },
109     { TYPE_ARRAY_BUFFER, "ArrayBuffer." },
110     { TYPE_ARRAY, "napi_array." },
111 };
112 
ThrowException(napi_env env,int32_t err,const std::string & msg,TypeCode type)113 void JsUtils::ThrowException(napi_env env, int32_t err, const std::string &msg, TypeCode type)
114 {
115     std::string errMsg = ToMessage(err);
116     napi_value error;
117     napi_value code;
118     napi_value message;
119     if (type == TypeCode::TYPE_NONE) {
120         errMsg = errMsg + " " + msg;
121         IMSA_HILOGE("THROW_ERROR message: %{public}s!", errMsg.c_str());
122     } else {
123         auto iter = PARAMETER_TYPE.find(type);
124         if (iter != PARAMETER_TYPE.end()) {
125             errMsg = errMsg + "The type of " + msg + " must be " + iter->second;
126             IMSA_HILOGE("THROW_ERROR message: %{public}s!", errMsg.c_str());
127         }
128     }
129     NAPI_CALL_RETURN_VOID(env, napi_create_string_utf8(env, errMsg.c_str(), NAPI_AUTO_LENGTH, &message));
130     NAPI_CALL_RETURN_VOID(env, napi_create_error(env, nullptr, message, &error));
131     NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, err, &code));
132     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, error, "code", code));
133     NAPI_CALL_RETURN_VOID(env, napi_throw(env, error));
134 }
135 
ToError(napi_env env,int32_t code,const std::string & msg)136 napi_value JsUtils::ToError(napi_env env, int32_t code, const std::string &msg)
137 {
138     IMSA_HILOGD("ToError start");
139     napi_value errorObj;
140     NAPI_CALL(env, napi_create_object(env, &errorObj));
141     napi_value errorCode = nullptr;
142     NAPI_CALL(env, napi_create_int32(env, Convert(code), &errorCode));
143     napi_value errorMessage = nullptr;
144     std::string errMsg = ToMessage(Convert(code)) + " " + msg;
145     NAPI_CALL(env, napi_create_string_utf8(env, errMsg.c_str(), NAPI_AUTO_LENGTH, &errorMessage));
146     NAPI_CALL(env, napi_set_named_property(env, errorObj, "code", errorCode));
147     NAPI_CALL(env, napi_set_named_property(env, errorObj, "message", errorMessage));
148     IMSA_HILOGD("ToError end");
149     return errorObj;
150 }
151 
Convert(int32_t code)152 int32_t JsUtils::Convert(int32_t code)
153 {
154     IMSA_HILOGD("Convert start.");
155     auto iter = ERROR_CODE_MAP.find(code);
156     if (iter != ERROR_CODE_MAP.end()) {
157         IMSA_HILOGE("ErrorCode: %{public}d", iter->second);
158         return iter->second;
159     }
160     IMSA_HILOGD("Convert end.");
161     return ERROR_CODE_QUERY_FAILED;
162 }
163 
ToMessage(int32_t code)164 const std::string JsUtils::ToMessage(int32_t code)
165 {
166     IMSA_HILOGD("ToMessage start");
167     auto iter = ERROR_CODE_CONVERT_MESSAGE_MAP.find(code);
168     if (iter != ERROR_CODE_CONVERT_MESSAGE_MAP.end()) {
169         IMSA_HILOGI("ErrorMessage: %{public}s", (iter->second).c_str());
170         return iter->second;
171     }
172     return "error is out of definition.";
173 }
174 
Equals(napi_env env,napi_value value,napi_ref copy,std::thread::id threadId)175 bool JsUtils::Equals(napi_env env, napi_value value, napi_ref copy, std::thread::id threadId)
176 {
177     if (copy == nullptr) {
178         return value == nullptr;
179     }
180 
181     if (threadId != std::this_thread::get_id()) {
182         IMSA_HILOGD("napi_value can not be compared");
183         return false;
184     }
185 
186     napi_value copyValue = nullptr;
187     napi_get_reference_value(env, copy, &copyValue);
188 
189     bool isEquals = false;
190     napi_strict_equals(env, value, copyValue, &isEquals);
191     IMSA_HILOGD("value compare result: %{public}d", isEquals);
192     return isEquals;
193 }
194 
GetNativeSelf(napi_env env,napi_callback_info info)195 void *JsUtils::GetNativeSelf(napi_env env, napi_callback_info info)
196 {
197     size_t argc = ARGC_MAX;
198     void *native = nullptr;
199     napi_value self = nullptr;
200     napi_value argv[ARGC_MAX] = { nullptr };
201     napi_status status = napi_invalid_arg;
202     napi_get_cb_info(env, info, &argc, argv, &self, nullptr);
203     CHECK_RETURN((self != nullptr && argc <= ARGC_MAX), "napi_get_cb_info failed!", nullptr);
204 
205     status = napi_unwrap(env, self, &native);
206     CHECK_RETURN((status == napi_ok && native != nullptr), "napi_unwrap failed!", nullptr);
207     return native;
208 }
209 
GetValue(napi_env env,napi_value in,int32_t & out)210 napi_status JsUtils::GetValue(napi_env env, napi_value in, int32_t &out)
211 {
212     napi_valuetype type = napi_undefined;
213     napi_status status = napi_typeof(env, in, &type);
214     CHECK_RETURN((status == napi_ok) && (type == napi_number), "invalid type", napi_generic_failure);
215     return napi_get_value_int32(env, in, &out);
216 }
217 
218 /* napi_value <-> uint32_t */
GetValue(napi_env env,napi_value in,uint32_t & out)219 napi_status JsUtils::GetValue(napi_env env, napi_value in, uint32_t &out)
220 {
221     napi_valuetype type = napi_undefined;
222     napi_status status = napi_typeof(env, in, &type);
223     CHECK_RETURN((status == napi_ok) && (type == napi_number), "invalid type", napi_generic_failure);
224     return napi_get_value_uint32(env, in, &out);
225 }
226 
GetValue(napi_env env,napi_value in,bool & out)227 napi_status JsUtils::GetValue(napi_env env, napi_value in, bool &out)
228 {
229     napi_valuetype type = napi_undefined;
230     napi_status status = napi_typeof(env, in, &type);
231     CHECK_RETURN((status == napi_ok) && (type == napi_boolean), "invalid type", napi_generic_failure);
232     return napi_get_value_bool(env, in, &out);
233 }
234 
GetValue(napi_env env,napi_value in,double & out)235 napi_status JsUtils::GetValue(napi_env env, napi_value in, double &out)
236 {
237     napi_valuetype type = napi_undefined;
238     napi_status status = napi_typeof(env, in, &type);
239     CHECK_RETURN((status == napi_ok) && (type == napi_number), "invalid double type", napi_generic_failure);
240     return napi_get_value_double(env, in, &out);
241 }
242 
243 /* napi_value <-> std::string */
GetValue(napi_env env,napi_value in,std::string & out)244 napi_status JsUtils::GetValue(napi_env env, napi_value in, std::string &out)
245 {
246     IMSA_HILOGD("JsUtils get string value in.");
247     napi_valuetype type = napi_undefined;
248     napi_status status = napi_typeof(env, in, &type);
249     CHECK_RETURN((status == napi_ok) && (type == napi_string), "invalid type", napi_generic_failure);
250 
251     size_t maxLen = STR_MAX_LENGTH;
252     status = napi_get_value_string_utf8(env, in, NULL, 0, &maxLen);
253     if (maxLen <= 0) {
254         return status;
255     }
256     IMSA_HILOGD("napi_value -> std::string get length %{public}zu", maxLen);
257     char *buf = new (std::nothrow) char[maxLen + STR_TAIL_LENGTH];
258     if (buf != nullptr) {
259         size_t len = 0;
260         status = napi_get_value_string_utf8(env, in, buf, maxLen + STR_TAIL_LENGTH, &len);
261         if (status == napi_ok) {
262             buf[len] = 0;
263             out = std::string(buf);
264         }
265         delete[] buf;
266     } else {
267         status = napi_generic_failure;
268     }
269     return status;
270 }
271 
272 /* napi_value <-> std::unordered_map<string, string> */
GetValue(napi_env env,napi_value in,std::unordered_map<std::string,PrivateDataValue> & out)273 napi_status JsUtils::GetValue(napi_env env, napi_value in, std::unordered_map<std::string, PrivateDataValue> &out)
274 {
275     napi_valuetype type = napi_undefined;
276     napi_status status = napi_typeof(env, in, &type);
277     PARAM_CHECK_RETURN(env, type != napi_undefined, "param is undefined.", TYPE_NONE, napi_generic_failure);
278 
279     napi_value keys = nullptr;
280     napi_get_property_names(env, in, &keys);
281     uint32_t arrLen = 0;
282     status = napi_get_array_length(env, keys, &arrLen);
283     if (status != napi_ok) {
284         IMSA_HILOGE("napi_get_array_length error");
285         return status;
286     }
287     // 5 means max private command count.
288     PARAM_CHECK_RETURN(env, arrLen <= 5 && arrLen > 0, "privateCommand must more than 0 and less than 5.", TYPE_NONE,
289         napi_generic_failure);
290     IMSA_HILOGD("length : %{public}u", arrLen);
291     for (size_t iter = 0; iter < arrLen; ++iter) {
292         napi_value key = nullptr;
293         status = napi_get_element(env, keys, iter, &key);
294         CHECK_RETURN(status == napi_ok, "napi_get_element error", status);
295 
296         napi_value value = nullptr;
297         status = napi_get_property(env, in, key, &value);
298         CHECK_RETURN(status == napi_ok, "napi_get_property error", status);
299 
300         std::string keyStr;
301         status = GetValue(env, key, keyStr);
302         CHECK_RETURN(status == napi_ok, "GetValue keyStr error", status);
303 
304         PrivateDataValue privateCommand;
305         status = GetValue(env, value, privateCommand);
306         CHECK_RETURN(status == napi_ok, "GetValue privateCommand error", status);
307         out.emplace(keyStr, privateCommand);
308     }
309     return status;
310 }
311 
GetValue(napi_env env,napi_value in,PrivateDataValue & out)312 napi_status JsUtils::GetValue(napi_env env, napi_value in, PrivateDataValue &out)
313 {
314     napi_valuetype valueType = napi_undefined;
315     napi_status status = napi_typeof(env, in, &valueType);
316     CHECK_RETURN(status == napi_ok, "napi_typeof error", napi_generic_failure);
317     if (valueType == napi_string) {
318         std::string privateDataStr;
319         status = GetValue(env, in, privateDataStr);
320         CHECK_RETURN(status == napi_ok, "GetValue napi_string error", napi_generic_failure);
321         out.emplace<std::string>(privateDataStr);
322     } else if (valueType == napi_boolean) {
323         bool privateDataBool = false;
324         status = GetValue(env, in, privateDataBool);
325         CHECK_RETURN(status == napi_ok, "GetValue napi_boolean error", napi_generic_failure);
326         out.emplace<bool>(privateDataBool);
327     } else if (valueType == napi_number) {
328         int32_t privateDataInt = 0;
329         status = GetValue(env, in, privateDataInt);
330         CHECK_RETURN(status == napi_ok, "GetValue napi_number error", napi_generic_failure);
331         out.emplace<int32_t>(privateDataInt);
332     } else {
333         PARAM_CHECK_RETURN(env, false, "value type must be string | boolean | number", TYPE_NONE, napi_generic_failure);
334     }
335     return status;
336 }
337 
GetValue(napi_env env,napi_value in,const std::string & type,napi_value & out)338 napi_status JsUtils::GetValue(napi_env env, napi_value in, const std::string &type, napi_value &out)
339 {
340     napi_valuetype valueType = napi_undefined;
341     napi_status status = napi_typeof(env, in, &valueType);
342     if ((status == napi_ok) && (valueType == napi_object)) {
343         status = napi_get_named_property(env, in, type.c_str(), &out);
344         return status;
345     }
346     return napi_generic_failure;
347 }
348 
349 /* napi_value <-> PanelInfo */
GetValue(napi_env env,napi_value in,PanelInfo & out)350 napi_status JsUtils::GetValue(napi_env env, napi_value in, PanelInfo &out)
351 {
352     IMSA_HILOGD("napi_value -> PanelInfo ");
353     napi_value propType = nullptr;
354     napi_status status = napi_get_named_property(env, in, "type", &propType);
355     CHECK_RETURN((status == napi_ok), "no property type ", status);
356     int32_t panelType = 0;
357     status = GetValue(env, propType, panelType);
358     CHECK_RETURN((status == napi_ok), "no value of type ", status);
359 
360     // PanelFlag is optional, defaults to FLG_FIXED when empty.
361     int32_t panelFlag = static_cast<int32_t>(PanelFlag::FLG_FIXED);
362     napi_value panelFlagObj = nullptr;
363     status = napi_get_named_property(env, in, "flag", &panelFlagObj);
364     if (status == napi_ok) {
365         JsUtils::GetValue(env, panelFlagObj, panelFlag);
366     }
367 
368     out.panelType = PanelType(panelType);
369     out.panelFlag = PanelFlag(panelFlag);
370     return napi_ok;
371 }
372 
GetValue(napi_env env,const std::vector<InputWindowInfo> & in)373 napi_value JsUtils::GetValue(napi_env env, const std::vector<InputWindowInfo> &in)
374 {
375     napi_value array = nullptr;
376     uint32_t index = 0;
377     napi_create_array(env, &array);
378     if (array == nullptr) {
379         IMSA_HILOGE("create array failed");
380         return array;
381     }
382     for (const auto &info : in) {
383         napi_value jsInfo = GetValue(env, info);
384         napi_set_element(env, array, index, jsInfo);
385         ++index;
386     }
387     return array;
388 }
389 
GetValue(napi_env env,const InputWindowInfo & in)390 napi_value JsUtils::GetValue(napi_env env, const InputWindowInfo &in)
391 {
392     napi_value info = nullptr;
393     napi_create_object(env, &info);
394 
395     napi_value name = nullptr;
396     napi_create_string_utf8(env, in.name.c_str(), in.name.size(), &name);
397     napi_set_named_property(env, info, "name", name);
398 
399     napi_value left = nullptr;
400     napi_create_int32(env, in.left, &left);
401     napi_set_named_property(env, info, "left", left);
402 
403     napi_value top = nullptr;
404     napi_create_int32(env, in.top, &top);
405     napi_set_named_property(env, info, "top", top);
406 
407     napi_value width = nullptr;
408     napi_create_uint32(env, in.width, &width);
409     napi_set_named_property(env, info, "width", width);
410 
411     napi_value height = nullptr;
412     napi_create_uint32(env, in.height, &height);
413     napi_set_named_property(env, info, "height", height);
414 
415     return info;
416 }
417 
GetValue(napi_env env,const std::string & in,napi_value & out)418 napi_status JsUtils::GetValue(napi_env env, const std::string &in, napi_value &out)
419 {
420     return napi_create_string_utf8(env, in.c_str(), in.size(), &out);
421 }
422 
GetJsPrivateCommand(napi_env env,const std::unordered_map<std::string,PrivateDataValue> & in)423 napi_value JsUtils::GetJsPrivateCommand(napi_env env, const std::unordered_map<std::string, PrivateDataValue> &in)
424 {
425     napi_value jsPrivateCommand = nullptr;
426     NAPI_CALL(env, napi_create_object(env, &jsPrivateCommand));
427     for (const auto &iter : in) {
428         size_t idx = iter.second.index();
429         napi_value value = nullptr;
430         if (idx == static_cast<size_t>(PrivateDataValueType::VALUE_TYPE_STRING)) {
431             auto stringValue = std::get_if<std::string>(&iter.second);
432             if (stringValue != nullptr) {
433                 NAPI_CALL(env, napi_create_string_utf8(env, (*stringValue).c_str(), (*stringValue).size(), &value));
434             }
435         } else if (idx == static_cast<size_t>(PrivateDataValueType::VALUE_TYPE_BOOL)) {
436             auto boolValue = std::get_if<bool>(&iter.second);
437             if (boolValue != nullptr) {
438                 NAPI_CALL(env, napi_get_boolean(env, *boolValue, &value));
439             }
440         } else if (idx == static_cast<size_t>(PrivateDataValueType::VALUE_TYPE_NUMBER)) {
441             auto numberValue = std::get_if<int32_t>(&iter.second);
442             if (numberValue != nullptr) {
443                 NAPI_CALL(env, napi_create_int32(env, *numberValue, &value));
444             }
445         }
446         NAPI_CALL(env, napi_set_named_property(env, jsPrivateCommand, iter.first.c_str(), value));
447     }
448     return jsPrivateCommand;
449 }
450 
GetValue(napi_env env,const std::vector<uint8_t> & in)451 napi_value JsUtils::GetValue(napi_env env, const std::vector<uint8_t> &in)
452 {
453     void *data = nullptr;
454     napi_value arrayBuffer = nullptr;
455     size_t length = in.size();
456     NAPI_CALL(env, napi_create_arraybuffer(env, length, &data, &arrayBuffer));
457     // 0 means the size of data.
458     CHECK_RETURN(length != 0, "Data size is 0.", arrayBuffer);
459     if (memcpy_s(data, length, reinterpret_cast<const void *>(in.data()), length) != 0) {
460         return nullptr;
461     }
462     return arrayBuffer;
463 }
464 
GetValue(napi_env env,napi_value in,std::vector<uint8_t> & out)465 napi_status JsUtils::GetValue(napi_env env, napi_value in, std::vector<uint8_t> &out)
466 {
467     size_t length = 0;
468     void *data = nullptr;
469     auto status = napi_get_arraybuffer_info(env, in, &data, &length);
470     if (status != napi_ok) {
471         IMSA_HILOGE("Get ArrayBuffer info failed!");
472         return status;
473     }
474     if (data == nullptr) {
475         IMSA_HILOGE("ArrayBuffer data is nullptr!");
476         return napi_generic_failure;
477     }
478     IMSA_HILOGD("ArrayBuffer data size: %{public}zu.", length);
479     out.assign(reinterpret_cast<const uint8_t *>(data), reinterpret_cast<const uint8_t *>(data) + length);
480     return napi_ok;
481 }
482 
GetMessageHandlerCallbackParam(napi_value * argv,const std::shared_ptr<JSMsgHandlerCallbackObject> & jsMessageHandler,const ArrayBuffer & arrayBuffer)483 napi_status JsUtils::GetMessageHandlerCallbackParam(napi_value *argv,
484     const std::shared_ptr<JSMsgHandlerCallbackObject> &jsMessageHandler, const ArrayBuffer &arrayBuffer)
485 {
486     if (argv == nullptr) {
487         IMSA_HILOGE("argv is nullptr!.");
488         return napi_generic_failure;
489     }
490     if (jsMessageHandler == nullptr) {
491         IMSA_HILOGE("jsMessageHandler is nullptr!.");
492         return napi_generic_failure;
493     }
494     napi_value jsMsgId = nullptr;
495     auto status = napi_create_string_utf8(
496         jsMessageHandler->env_, arrayBuffer.msgId.c_str(), NAPI_AUTO_LENGTH, &jsMsgId);
497     if (status != napi_ok) {
498         IMSA_HILOGE("napi_create_string_utf8 failed!.");
499         return napi_generic_failure;
500     }
501     // 0 means the first param index of callback.
502     argv[0] = { jsMsgId };
503     if (arrayBuffer.jsArgc > ARGC_ONE) {
504         napi_value jsMsgParam = JsUtils::GetValue(jsMessageHandler->env_, arrayBuffer.msgParam);
505         if (jsMsgParam == nullptr) {
506             IMSA_HILOGE("Get js messageParam object failed!.");
507             return napi_generic_failure;
508         }
509         // 0 means the second param index of callback.
510         argv[1] = { jsMsgParam };
511     }
512     return napi_ok;
513 }
514 
GetValue(napi_env env,napi_value in,Rosen::Rect & out)515 napi_status JsUtils::GetValue(napi_env env, napi_value in, Rosen::Rect &out)
516 {
517     bool ret = JsUtil::Object::ReadProperty(env, in, "left", out.posX_);
518     ret = ret && JsUtil::Object::ReadProperty(env, in, "top", out.posY_);
519     ret = ret && JsUtil::Object::ReadProperty(env, in, "width", out.width_);
520     ret = ret && JsUtil::Object::ReadProperty(env, in, "height", out.height_);
521     return ret ? napi_ok : napi_generic_failure;
522 }
523 
GetValue(napi_env env,const Rosen::Rect & in)524 napi_value JsUtils::GetValue(napi_env env, const Rosen::Rect &in)
525 {
526     napi_value jsObject = nullptr;
527     napi_create_object(env, &jsObject);
528     bool ret = JsUtil::Object::WriteProperty(env, jsObject, "left", in.posX_);
529     ret = ret && JsUtil::Object::WriteProperty(env, jsObject, "top", in.posY_);
530     ret = ret && JsUtil::Object::WriteProperty(env, jsObject, "width", in.width_);
531     ret = ret && JsUtil::Object::WriteProperty(env, jsObject, "height", in.height_);
532     return ret ? jsObject : JsUtil::Const::Null(env);
533 }
534 } // namespace MiscServices
535 } // namespace OHOS
536