1 /*
2 * Copyright (c) 2022-2024 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 "napi_edm_common.h"
17
18 #include "edm_constants.h"
19 #include "edm_errors.h"
20 #include "edm_log.h"
21 #include "js_native_api.h"
22 #include "js_native_api_types.h"
23 #include "napi/native_api.h"
24 #include "napi/native_common.h"
25 #include "napi/native_node_api.h"
26 #include "napi_edm_error.h"
27 #include "securec.h"
28
29 namespace OHOS {
30 namespace EDM {
31 const int32_t MAX_STRING_LEN = 10256;
NativeCallbackComplete(napi_env env,napi_status status,AsyncCallbackInfo * asyncCallbackInfo,napi_value result)32 static void NativeCallbackComplete(napi_env env, napi_status status, AsyncCallbackInfo *asyncCallbackInfo,
33 napi_value result)
34 {
35 EDMLOGD("NativeCallbackComplete asyncCallbackInfo->ret is %{public}d", asyncCallbackInfo->ret);
36 if (asyncCallbackInfo->deferred != nullptr) {
37 EDMLOGD("NativeCallbackComplete asyncCallbackInfo->deferred != nullptr");
38 if (asyncCallbackInfo->ret == ERR_OK) {
39 napi_resolve_deferred(env, asyncCallbackInfo->deferred, result);
40 } else {
41 if (asyncCallbackInfo->innerCodeMsg.empty()) {
42 napi_reject_deferred(env, asyncCallbackInfo->deferred, CreateError(env, asyncCallbackInfo->ret));
43 } else {
44 napi_reject_deferred(env, asyncCallbackInfo->deferred,
45 CreateErrorWithInnerCode(env, asyncCallbackInfo->ret, asyncCallbackInfo->innerCodeMsg));
46 }
47 }
48 } else {
49 napi_value callbackValue[ARGS_SIZE_TWO] = {0};
50 if (asyncCallbackInfo->ret == ERR_OK) {
51 napi_get_null(env, &callbackValue[ARR_INDEX_ZERO]);
52 callbackValue[ARR_INDEX_ONE] = result;
53 } else {
54 if (asyncCallbackInfo->innerCodeMsg.empty()) {
55 callbackValue[ARR_INDEX_ZERO] = CreateError(env, asyncCallbackInfo->ret);
56 } else {
57 callbackValue[ARR_INDEX_ZERO] =
58 CreateErrorWithInnerCode(env, asyncCallbackInfo->ret, asyncCallbackInfo->innerCodeMsg);
59 }
60 napi_get_null(env, &callbackValue[ARR_INDEX_ONE]);
61 }
62 napi_value callback = nullptr;
63 napi_value ret = nullptr;
64 napi_get_reference_value(env, asyncCallbackInfo->callback, &callback);
65 napi_call_function(env, nullptr, callback, std::size(callbackValue), callbackValue, &ret);
66 napi_delete_reference(env, asyncCallbackInfo->callback);
67 }
68 napi_delete_async_work(env, asyncCallbackInfo->asyncWork);
69 }
70
MatchValueType(napi_env env,napi_value value,napi_valuetype targetType)71 bool MatchValueType(napi_env env, napi_value value, napi_valuetype targetType)
72 {
73 napi_valuetype valueType = napi_undefined;
74 napi_typeof(env, value, &valueType);
75 return valueType == targetType;
76 }
77
ParseElementName(napi_env env,AppExecFwk::ElementName & elementName,napi_value args)78 bool ParseElementName(napi_env env, AppExecFwk::ElementName &elementName, napi_value args)
79 {
80 napi_valuetype valueType;
81 NAPI_CALL_BASE(env, napi_typeof(env, args, &valueType), false);
82 if (valueType != napi_object) {
83 EDMLOGE("Parameter element valueType error");
84 return false;
85 }
86 std::string bundleName;
87 std::string abilityName;
88 if (!JsObjectToString(env, args, "bundleName", true, bundleName) ||
89 !JsObjectToString(env, args, "abilityName", true, abilityName)) {
90 EDMLOGE("Parameter element bundleName error");
91 return false;
92 }
93 EDMLOGD("ParseElementName bundleName %{public}s ", bundleName.c_str());
94 EDMLOGD("ParseElementName abilityname %{public}s", abilityName.c_str());
95
96 elementName.SetBundleName(bundleName);
97 elementName.SetAbilityName(abilityName);
98 return true;
99 }
100
ParseMapStringAndString(napi_env env,std::map<std::string,std::string> & parameters,napi_value args)101 bool ParseMapStringAndString(napi_env env, std::map<std::string, std::string> ¶meters, napi_value args)
102 {
103 napi_valuetype valueType;
104
105 NAPI_CALL_BASE(env, napi_typeof(env, args, &valueType), false);
106 if (valueType != napi_object) {
107 EDMLOGE("Parameter 'args' is not an object.");
108 return false;
109 }
110
111 napi_value propertyNames;
112 NAPI_CALL_BASE(env, napi_get_property_names(env, args, &propertyNames), false);
113
114 uint32_t propertyCount;
115 NAPI_CALL_BASE(env, napi_get_array_length(env, propertyNames, &propertyCount), false);
116
117 for (uint32_t i = 0; i < propertyCount; ++i) {
118 napi_value key;
119 NAPI_CALL_BASE(env, napi_get_element(env, propertyNames, i, &key), false);
120
121 char keyBuf[256] = {0};
122 size_t keyLen;
123 NAPI_CALL_BASE(env, napi_get_value_string_utf8(env, key, keyBuf, sizeof(keyBuf) - 1, &keyLen), false);
124
125 napi_value value;
126 NAPI_CALL_BASE(env, napi_get_property(env, args, key, &value), false);
127
128 char valueBuf[MAX_STRING_LEN] = {0};
129 size_t valueLen;
130 NAPI_CALL_BASE(env, napi_get_value_string_utf8(env, value, valueBuf, sizeof(valueBuf) - 1, &valueLen), false);
131
132 parameters[keyBuf] = valueBuf;
133 }
134
135 return true;
136 }
137
ParseLong(napi_env env,int64_t & param,napi_value args)138 bool ParseLong(napi_env env, int64_t ¶m, napi_value args)
139 {
140 napi_valuetype valueType = napi_undefined;
141 if (napi_typeof(env, args, &valueType) != napi_ok || valueType != napi_number ||
142 napi_get_value_int64(env, args, ¶m) != napi_ok) {
143 EDMLOGE("Wrong argument type. int64 expected.");
144 return false;
145 }
146 return true;
147 }
148
ParseInt(napi_env env,int32_t & param,napi_value args)149 bool ParseInt(napi_env env, int32_t ¶m, napi_value args)
150 {
151 napi_valuetype valueType = napi_undefined;
152 if (napi_typeof(env, args, &valueType) != napi_ok || valueType != napi_number ||
153 napi_get_value_int32(env, args, ¶m) != napi_ok) {
154 EDMLOGE("Wrong argument type. int32 expected.");
155 return false;
156 }
157 return true;
158 }
159
ParseCallback(napi_env env,napi_ref & param,napi_value args)160 bool ParseCallback(napi_env env, napi_ref ¶m, napi_value args)
161 {
162 napi_valuetype valueType = napi_undefined;
163 if (napi_typeof(env, args, &valueType) != napi_ok || valueType != napi_function ||
164 napi_create_reference(env, args, NAPI_RETURN_ONE, ¶m) != napi_ok) {
165 EDMLOGE("Wrong argument type. napi_function expected.");
166 return false;
167 }
168 return true;
169 }
170
ParseUint(napi_env env,uint32_t & param,napi_value args)171 bool ParseUint(napi_env env, uint32_t ¶m, napi_value args)
172 {
173 napi_valuetype valueType = napi_undefined;
174 if (napi_typeof(env, args, &valueType) != napi_ok || valueType != napi_number ||
175 napi_get_value_uint32(env, args, ¶m) != napi_ok) {
176 EDMLOGE("Wrong argument type. uint32 expected.");
177 return false;
178 }
179 return true;
180 }
181
ParseBool(napi_env env,bool & param,napi_value args)182 bool ParseBool(napi_env env, bool ¶m, napi_value args)
183 {
184 napi_valuetype valueType = napi_undefined;
185 if (napi_typeof(env, args, &valueType) != napi_ok || valueType != napi_boolean ||
186 napi_get_value_bool(env, args, ¶m) != napi_ok) {
187 EDMLOGE("Wrong argument type. bool expected.");
188 return false;
189 }
190 return true;
191 }
192
ParseString(napi_env env,std::string & param,napi_value args)193 bool ParseString(napi_env env, std::string ¶m, napi_value args)
194 {
195 napi_valuetype valuetype;
196 if (napi_typeof(env, args, &valuetype) != napi_ok || valuetype != napi_string ||
197 !GetStringFromNAPI(env, args, param)) {
198 EDMLOGE("can not get string value");
199 return false;
200 }
201 EDMLOGD("ParseString param = %{public}s.", param.c_str());
202 return true;
203 }
204
GetStringFromNAPI(napi_env env,napi_value value,std::string & resultStr)205 bool GetStringFromNAPI(napi_env env, napi_value value, std::string &resultStr)
206 {
207 std::string result;
208 size_t size = 0;
209
210 if (napi_get_value_string_utf8(env, value, nullptr, NAPI_RETURN_ZERO, &size) != napi_ok) {
211 EDMLOGE("can not get string size");
212 return false;
213 }
214 result.reserve(size + NAPI_RETURN_ONE);
215 result.resize(size);
216 if (napi_get_value_string_utf8(env, value, result.data(), (size + NAPI_RETURN_ONE), &size) != napi_ok) {
217 EDMLOGE("can not get string value");
218 return false;
219 }
220 resultStr = result;
221 return true;
222 }
223
ParseCharArray(napi_env env,napi_value args,size_t maxLength,std::vector<char> & ret)224 bool ParseCharArray(napi_env env, napi_value args, size_t maxLength, std::vector<char> &ret)
225 {
226 napi_valuetype valuetype;
227 if (napi_typeof(env, args, &valuetype) != napi_ok || valuetype != napi_string) {
228 EDMLOGE("can not get string value");
229 return false;
230 }
231 size_t size = 0;
232 if (napi_get_value_string_utf8(env, args, nullptr, NAPI_RETURN_ZERO, &size) != napi_ok) {
233 EDMLOGE("can not get string size");
234 return false;
235 }
236 if (size >= maxLength) {
237 EDMLOGE("string size too long");
238 return false;
239 }
240 std::vector<char> buf(size + NAPI_RETURN_ONE);
241 if (napi_get_value_string_utf8(env, args, buf.data(), (size + NAPI_RETURN_ONE), &size) != napi_ok) {
242 EDMLOGE("can not get string value");
243 return false;
244 }
245 ret = buf;
246 memset_s(buf.data(), buf.size(), '\0', buf.size());
247 return true;
248 }
249
ParseStringArray(napi_env env,std::vector<std::string> & stringArray,napi_value args)250 napi_value ParseStringArray(napi_env env, std::vector<std::string> &stringArray, napi_value args)
251 {
252 EDMLOGD("begin to parse string array");
253 bool isArray = false;
254 NAPI_CALL(env, napi_is_array(env, args, &isArray));
255 if (!isArray) {
256 EDMLOGE("napi object is not array.");
257 return nullptr;
258 }
259 uint32_t arrayLength = 0;
260 NAPI_CALL(env, napi_get_array_length(env, args, &arrayLength));
261 EDMLOGD("length=%{public}ud", arrayLength);
262 for (uint32_t j = 0; j < arrayLength; j++) {
263 napi_value value = nullptr;
264 NAPI_CALL(env, napi_get_element(env, args, j, &value));
265 napi_valuetype valueType = napi_undefined;
266 NAPI_CALL(env, napi_typeof(env, value, &valueType));
267 if (valueType != napi_string) {
268 stringArray.clear();
269 return nullptr;
270 }
271 std::string str;
272 GetStringFromNAPI(env, value, str);
273 stringArray.push_back(str);
274 }
275 // create result code
276 napi_value result;
277 napi_status status = napi_create_int32(env, NAPI_RETURN_ONE, &result);
278 if (status != napi_ok) {
279 return nullptr;
280 }
281 return result;
282 }
283
ParseIntArray(napi_env env,std::vector<int32_t> & intArray,napi_value args)284 bool ParseIntArray(napi_env env, std::vector<int32_t> &intArray, napi_value args)
285 {
286 EDMLOGD("begin to parse int array");
287 bool isArray = false;
288 if (napi_is_array(env, args, &isArray) != napi_ok || !isArray) {
289 EDMLOGE("ParseIntArray is not array");
290 return false;
291 }
292 uint32_t len;
293 if (napi_get_array_length(env, args, &len) != napi_ok) {
294 EDMLOGE("ParseIntArray get array length failed");
295 return false;
296 }
297 if (len > EdmConstants::DEFAULT_LOOP_MAX_SIZE) {
298 EDMLOGE("ParseIntArray len is over limit");
299 return false;
300 }
301 for (uint32_t i = 0; i < len; i++) {
302 napi_value event;
303 if (napi_get_element(env, args, i, &event) != napi_ok) {
304 EDMLOGE("ParseIntArray get array element failed");
305 return false;
306 }
307 int32_t value = 0;
308 if (napi_get_value_int32(env, event, &value) != napi_ok) {
309 EDMLOGE("ParseIntArray get array int failed");
310 return false;
311 }
312 intArray.push_back(value);
313 }
314 return true;
315 }
316
ParseElementArray(napi_env env,std::vector<AppExecFwk::ElementName> & elementArray,napi_value args)317 napi_value ParseElementArray(napi_env env, std::vector<AppExecFwk::ElementName> &elementArray, napi_value args)
318 {
319 EDMLOGD("begin to parse element array");
320 bool isArray = false;
321 NAPI_CALL(env, napi_is_array(env, args, &isArray));
322 if (!isArray) {
323 EDMLOGE("napi object is not array.");
324 return nullptr;
325 }
326 uint32_t arrayLength = 0;
327 NAPI_CALL(env, napi_get_array_length(env, args, &arrayLength));
328 EDMLOGD("length=%{public}ud", arrayLength);
329 for (uint32_t j = 0; j < arrayLength; j++) {
330 napi_value value = nullptr;
331 NAPI_CALL(env, napi_get_element(env, args, j, &value));
332 napi_valuetype valueType = napi_undefined;
333 NAPI_CALL(env, napi_typeof(env, value, &valueType));
334 if (valueType != napi_object) {
335 elementArray.clear();
336 return nullptr;
337 }
338 AppExecFwk::ElementName element;
339 ParseElementName(env, element, value);
340 elementArray.push_back(element);
341 }
342 // create result code
343 napi_value result;
344 napi_status status = napi_create_int32(env, NAPI_RETURN_ONE, &result);
345 if (status != napi_ok) {
346 return nullptr;
347 }
348 return result;
349 }
350
JsObjectToInt(napi_env env,napi_value object,const char * filedStr,bool isNecessaryProp,int32_t & result)351 bool JsObjectToInt(napi_env env, napi_value object, const char *filedStr, bool isNecessaryProp, int32_t &result)
352 {
353 bool hasProperty = false;
354 if (napi_has_named_property(env, object, filedStr, &hasProperty) != napi_ok) {
355 EDMLOGE("get js property failed.");
356 return false;
357 }
358 if (isNecessaryProp && !hasProperty) {
359 return false;
360 }
361 if (hasProperty) {
362 napi_value prop = nullptr;
363 return napi_get_named_property(env, object, filedStr, &prop) == napi_ok && ParseInt(env, result, prop);
364 }
365 return true;
366 }
367
JsObjectToUint(napi_env env,napi_value object,const char * filedStr,bool isNecessaryProp,uint32_t & result)368 bool JsObjectToUint(napi_env env, napi_value object, const char *filedStr, bool isNecessaryProp, uint32_t &result)
369 {
370 bool hasProperty = false;
371 if (napi_has_named_property(env, object, filedStr, &hasProperty) != napi_ok) {
372 EDMLOGE("get js property failed.");
373 return false;
374 }
375 if (isNecessaryProp && !hasProperty) {
376 return false;
377 }
378 if (hasProperty) {
379 napi_value prop = nullptr;
380 return napi_get_named_property(env, object, filedStr, &prop) == napi_ok && ParseUint(env, result, prop);
381 }
382 return true;
383 }
384
JsObjectToLong(napi_env env,napi_value object,const char * filedStr,bool isNecessaryProp,int64_t & result)385 bool JsObjectToLong(napi_env env, napi_value object, const char *filedStr, bool isNecessaryProp, int64_t &result)
386 {
387 bool hasProperty = false;
388 if (napi_has_named_property(env, object, filedStr, &hasProperty) != napi_ok) {
389 EDMLOGE("get js property failed.");
390 return false;
391 }
392 if (isNecessaryProp && !hasProperty) {
393 return false;
394 }
395 if (hasProperty) {
396 napi_value prop = nullptr;
397 return napi_get_named_property(env, object, filedStr, &prop) == napi_ok && ParseLong(env, result, prop);
398 }
399 return true;
400 }
401
JsObjectToBool(napi_env env,napi_value object,const char * filedStr,bool isNecessaryProp,bool & result)402 bool JsObjectToBool(napi_env env, napi_value object, const char *filedStr, bool isNecessaryProp, bool &result)
403 {
404 bool hasProperty = false;
405 if (napi_has_named_property(env, object, filedStr, &hasProperty) != napi_ok) {
406 EDMLOGE("get js property failed.");
407 return false;
408 }
409 if (isNecessaryProp && !hasProperty) {
410 return false;
411 }
412 if (hasProperty) {
413 napi_value prop = nullptr;
414 return napi_get_named_property(env, object, filedStr, &prop) == napi_ok && ParseBool(env, result, prop);
415 }
416 return true;
417 }
418
JsObjectToString(napi_env env,napi_value object,const char * filedStr,bool isNecessaryProp,std::string & resultStr)419 bool JsObjectToString(napi_env env, napi_value object, const char *filedStr, bool isNecessaryProp,
420 std::string &resultStr)
421 {
422 bool hasProperty = false;
423 if (napi_has_named_property(env, object, filedStr, &hasProperty) != napi_ok) {
424 EDMLOGE("get js property failed.");
425 return false;
426 }
427 if (isNecessaryProp && !hasProperty) {
428 return false;
429 }
430 if (hasProperty) {
431 napi_value prop = nullptr;
432 return napi_get_named_property(env, object, filedStr, &prop) == napi_ok && ParseString(env, resultStr, prop);
433 }
434 return true;
435 }
436
JsObjectToCharArray(napi_env env,napi_value object,const char * filedStr,std::tuple<int,bool> charArrayProp,std::vector<char> & ret)437 bool JsObjectToCharArray(napi_env env, napi_value object, const char *filedStr, std::tuple<int, bool> charArrayProp,
438 std::vector<char> &ret)
439 {
440 bool hasProperty = false;
441 if (napi_has_named_property(env, object, filedStr, &hasProperty) != napi_ok) {
442 EDMLOGE("get js property failed.");
443 return false;
444 }
445 int maxLength = 0;
446 bool isNecessaryProp = false;
447 std::tie(maxLength, isNecessaryProp) = charArrayProp;
448 if (isNecessaryProp && !hasProperty) {
449 return false;
450 }
451 if (hasProperty) {
452 napi_value prop = nullptr;
453 return napi_get_named_property(env, object, filedStr, &prop) == napi_ok &&
454 ParseCharArray(env, prop, maxLength, ret);
455 }
456 return true;
457 }
458
GetJsProperty(napi_env env,napi_value object,const char * filedStr,napi_value & result)459 bool GetJsProperty(napi_env env, napi_value object, const char *filedStr, napi_value &result)
460 {
461 bool hasProperty = false;
462 if (napi_has_named_property(env, object, filedStr, &hasProperty) != napi_ok || !hasProperty ||
463 napi_get_named_property(env, object, filedStr, &result) != napi_ok) {
464 EDMLOGE("Js has no property");
465 return false;
466 }
467 return true;
468 }
469
JsObjectToU8Vector(napi_env env,napi_value object,const char * fieldStr,std::vector<uint8_t> & certVector)470 bool JsObjectToU8Vector(napi_env env, napi_value object, const char *fieldStr, std::vector<uint8_t> &certVector)
471 {
472 napi_value certEntry;
473 if (!GetJsProperty(env, object, fieldStr, certEntry)) {
474 return false;
475 }
476 bool isTypedArray = false;
477 if (napi_is_typedarray(env, certEntry, &isTypedArray) != napi_ok || !isTypedArray) {
478 EDMLOGE("js property is not typedarray");
479 return false;
480 }
481 size_t length = 0;
482 size_t offset = 0;
483 napi_typedarray_type type;
484 napi_value buffer = nullptr;
485 void *data = nullptr;
486 if (napi_get_typedarray_info(env, certEntry, &type, &length, &data, &buffer, &offset) != napi_ok ||
487 type != napi_uint8_array || buffer == nullptr) {
488 EDMLOGE("js object type is not uint8 array");
489 return false;
490 }
491 if (length > NAPI_MAX_DATA_LEN) {
492 EDMLOGE("uint8 array range failed");
493 return false;
494 }
495 if (data == nullptr) {
496 EDMLOGE("uint8 array data failed");
497 return false;
498 }
499 certVector.clear();
500 certVector.assign(static_cast<uint8_t *>(data), (static_cast<uint8_t *>(data) + length));
501 return true;
502 }
503
JsObjectToStringVector(napi_env env,napi_value object,const char * filedStr,bool isNecessaryProp,std::vector<std::string> & vec)504 bool JsObjectToStringVector(napi_env env, napi_value object, const char *filedStr, bool isNecessaryProp,
505 std::vector<std::string> &vec)
506 {
507 bool hasProperty = false;
508 if (napi_has_named_property(env, object, filedStr, &hasProperty) != napi_ok) {
509 EDMLOGE("get js property failed.");
510 return false;
511 }
512 if (isNecessaryProp && !hasProperty) {
513 EDMLOGE("no yaobaohua hasProperty.");
514 return false;
515 }
516 if (hasProperty) {
517 napi_value prop = nullptr;
518 return napi_get_named_property(env, object, filedStr, &prop) == napi_ok && ParseStringArray(env, vec, prop);
519 }
520 return true;
521 }
522
NativeVoidCallbackComplete(napi_env env,napi_status status,void * data)523 void NativeVoidCallbackComplete(napi_env env, napi_status status, void *data)
524 {
525 if (data == nullptr) {
526 EDMLOGE("data is nullptr");
527 return;
528 }
529 AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
530 napi_value result = nullptr;
531 napi_get_null(env, &result);
532 NativeCallbackComplete(env, status, asyncCallbackInfo, result);
533 delete asyncCallbackInfo;
534 }
535
HandleAsyncWork(napi_env env,AsyncCallbackInfo * context,const std::string & workName,napi_async_execute_callback execute,napi_async_complete_callback complete)536 napi_value HandleAsyncWork(napi_env env, AsyncCallbackInfo *context, const std::string &workName,
537 napi_async_execute_callback execute, napi_async_complete_callback complete)
538 {
539 napi_value result = nullptr;
540 if (context->callback == nullptr) {
541 napi_create_promise(env, &context->deferred, &result);
542 } else {
543 napi_get_undefined(env, &result);
544 }
545 napi_value resource = nullptr;
546 napi_get_undefined(env, &resource);
547 napi_value resourceName = nullptr;
548 napi_create_string_utf8(env, workName.data(), NAPI_AUTO_LENGTH, &resourceName);
549 napi_create_async_work(env, resource, resourceName, execute, complete, static_cast<void *>(context),
550 &context->asyncWork);
551 napi_queue_async_work(env, context->asyncWork);
552 return result;
553 }
554
NativeBoolCallbackComplete(napi_env env,napi_status status,void * data)555 void NativeBoolCallbackComplete(napi_env env, napi_status status, void *data)
556 {
557 if (data == nullptr) {
558 EDMLOGE("data is nullptr");
559 return;
560 }
561 AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
562 napi_value result = nullptr;
563 napi_get_boolean(env, asyncCallbackInfo->boolRet, &result);
564 NativeCallbackComplete(env, status, asyncCallbackInfo, result);
565 delete asyncCallbackInfo;
566 }
567
NativeNumberCallbackComplete(napi_env env,napi_status status,void * data)568 void NativeNumberCallbackComplete(napi_env env, napi_status status, void *data)
569 {
570 if (data == nullptr) {
571 EDMLOGE("data is nullptr");
572 return;
573 }
574 AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
575 napi_value result = nullptr;
576 napi_create_int32(env, asyncCallbackInfo->intRet, &result);
577 NativeCallbackComplete(env, status, asyncCallbackInfo, result);
578 delete asyncCallbackInfo;
579 }
580
NativeStringCallbackComplete(napi_env env,napi_status status,void * data)581 void NativeStringCallbackComplete(napi_env env, napi_status status, void *data)
582 {
583 if (data == nullptr) {
584 EDMLOGE("data is nullptr");
585 return;
586 }
587 AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
588 napi_value result = nullptr;
589 napi_create_string_utf8(env, asyncCallbackInfo->stringRet.c_str(), NAPI_AUTO_LENGTH, &result);
590 NativeCallbackComplete(env, status, asyncCallbackInfo, result);
591 delete asyncCallbackInfo;
592 }
593
NativeArrayStringCallbackComplete(napi_env env,napi_status status,void * data)594 void NativeArrayStringCallbackComplete(napi_env env, napi_status status, void *data)
595 {
596 if (data == nullptr) {
597 EDMLOGE("data is nullptr");
598 return;
599 }
600 AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
601 napi_value result = nullptr;
602 napi_create_array(env, &result);
603 ConvertStringVectorToJS(env, asyncCallbackInfo->arrayStringRet, result);
604 NativeCallbackComplete(env, status, asyncCallbackInfo, result);
605 delete asyncCallbackInfo;
606 }
607
ConvertStringVectorToJS(napi_env env,const std::vector<std::string> & stringVector,napi_value result)608 void ConvertStringVectorToJS(napi_env env, const std::vector<std::string> &stringVector, napi_value result)
609 {
610 EDMLOGD("vector size: %{public}zu", stringVector.size());
611 size_t idx = 0;
612 for (const auto &str : stringVector) {
613 napi_value obj = nullptr;
614 napi_create_string_utf8(env, str.c_str(), NAPI_AUTO_LENGTH, &obj);
615 napi_set_element(env, result, idx, obj);
616 idx++;
617 }
618 }
619
CheckAdminWithUserIdParamType(napi_env env,size_t argc,napi_value * argv,bool & hasCallback,bool & hasUserId)620 bool CheckAdminWithUserIdParamType(napi_env env, size_t argc, napi_value *argv, bool &hasCallback, bool &hasUserId)
621 {
622 if (!MatchValueType(env, argv[ARR_INDEX_ZERO], napi_object)) {
623 EDMLOGE("CheckAdminWithUserIdParamType admin type check failed");
624 return false;
625 }
626 EDMLOGI("argc = %{public}zu", argc);
627 if (argc == ARGS_SIZE_ONE) {
628 hasCallback = false;
629 hasUserId = false;
630 EDMLOGI("hasCallback = false; hasUserId = false;");
631 return true;
632 }
633
634 if (argc == ARGS_SIZE_TWO) {
635 if (MatchValueType(env, argv[ARR_INDEX_ONE], napi_function)) {
636 hasCallback = true;
637 hasUserId = false;
638 EDMLOGI("hasCallback = true; hasUserId = false;");
639 return true;
640 } else {
641 hasCallback = false;
642 hasUserId = true;
643 EDMLOGI("hasCallback = false; hasUserId = true;");
644 return MatchValueType(env, argv[ARR_INDEX_ONE], napi_number);
645 }
646 }
647 hasCallback = true;
648 hasUserId = true;
649 EDMLOGI("hasCallback = true; hasUserId = true;");
650 return MatchValueType(env, argv[ARR_INDEX_ONE], napi_number) &&
651 MatchValueType(env, argv[ARR_INDEX_TWO], napi_function);
652 }
653
CheckGetPolicyAdminParam(napi_env env,napi_value value,bool & hasAdmin,OHOS::AppExecFwk::ElementName & elementName)654 bool CheckGetPolicyAdminParam(napi_env env, napi_value value, bool &hasAdmin,
655 OHOS::AppExecFwk::ElementName &elementName)
656 {
657 if (MatchValueType(env, value, napi_null)) {
658 hasAdmin = false;
659 return true;
660 }
661 if (MatchValueType(env, value, napi_object)) {
662 hasAdmin = true;
663 if (ParseElementName(env, elementName, value)) {
664 return true;
665 }
666 }
667 return false;
668 }
669
ParseStringToInt(const std::string & strValue,int32_t & result)670 bool ParseStringToInt(const std::string &strValue, int32_t &result)
671 {
672 int64_t temp = 0;
673 if (!ParseStringToLong(strValue, temp)) {
674 EDMLOGE("ParseStringToInt: parse str failed");
675 return false;
676 }
677 if (temp < INT_MIN || temp > INT_MAX) {
678 EDMLOGE("ParseStringToInt: parse failed, int32 expected.");
679 return false;
680 }
681 result = temp;
682 return true;
683 }
684
ParseStringToLong(const std::string & strValue,int64_t & result)685 bool ParseStringToLong(const std::string &strValue, int64_t &result)
686 {
687 char *end = nullptr;
688 const char *p = strValue.c_str();
689 errno = 0;
690 result = strtoll(p, &end, EdmConstants::DECIMAL);
691 if (errno == ERANGE || end == p || *end != '\0') {
692 EDMLOGE("ParseStringToLong: parse str failed: %{public}s", p);
693 return false;
694 }
695 return true;
696 }
697 } // namespace EDM
698 } // namespace OHOS