• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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> &parameters, 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 &param, 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, &param) != 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 &param, 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, &param) != 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 &param, 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, &param) != 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 &param, 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, &param) != 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 &param, 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, &param) != 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 &param, 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 
ParseElementArray(napi_env env,std::vector<AppExecFwk::ElementName> & elementArray,napi_value args)284 napi_value ParseElementArray(napi_env env, std::vector<AppExecFwk::ElementName> &elementArray, napi_value args)
285 {
286     EDMLOGD("begin to parse element array");
287     bool isArray = false;
288     NAPI_CALL(env, napi_is_array(env, args, &isArray));
289     if (!isArray) {
290         EDMLOGE("napi object is not array.");
291         return nullptr;
292     }
293     uint32_t arrayLength = 0;
294     NAPI_CALL(env, napi_get_array_length(env, args, &arrayLength));
295     EDMLOGD("length=%{public}ud", arrayLength);
296     for (uint32_t j = 0; j < arrayLength; j++) {
297         napi_value value = nullptr;
298         NAPI_CALL(env, napi_get_element(env, args, j, &value));
299         napi_valuetype valueType = napi_undefined;
300         NAPI_CALL(env, napi_typeof(env, value, &valueType));
301         if (valueType != napi_object) {
302             elementArray.clear();
303             return nullptr;
304         }
305         AppExecFwk::ElementName element;
306         ParseElementName(env, element, value);
307         elementArray.push_back(element);
308     }
309     // create result code
310     napi_value result;
311     napi_status status = napi_create_int32(env, NAPI_RETURN_ONE, &result);
312     if (status != napi_ok) {
313         return nullptr;
314     }
315     return result;
316 }
317 
JsObjectToInt(napi_env env,napi_value object,const char * filedStr,bool isNecessaryProp,int32_t & result)318 bool JsObjectToInt(napi_env env, napi_value object, const char *filedStr, bool isNecessaryProp, int32_t &result)
319 {
320     bool hasProperty = false;
321     if (napi_has_named_property(env, object, filedStr, &hasProperty) != napi_ok) {
322         EDMLOGE("get js property failed.");
323         return false;
324     }
325     if (isNecessaryProp && !hasProperty) {
326         return false;
327     }
328     if (hasProperty) {
329         napi_value prop = nullptr;
330         return napi_get_named_property(env, object, filedStr, &prop) == napi_ok && ParseInt(env, result, prop);
331     }
332     return true;
333 }
334 
JsObjectToUint(napi_env env,napi_value object,const char * filedStr,bool isNecessaryProp,uint32_t & result)335 bool JsObjectToUint(napi_env env, napi_value object, const char *filedStr, bool isNecessaryProp, uint32_t &result)
336 {
337     bool hasProperty = false;
338     if (napi_has_named_property(env, object, filedStr, &hasProperty) != napi_ok) {
339         EDMLOGE("get js property failed.");
340         return false;
341     }
342     if (isNecessaryProp && !hasProperty) {
343         return false;
344     }
345     if (hasProperty) {
346         napi_value prop = nullptr;
347         return napi_get_named_property(env, object, filedStr, &prop) == napi_ok && ParseUint(env, result, prop);
348     }
349     return true;
350 }
351 
JsObjectToLong(napi_env env,napi_value object,const char * filedStr,bool isNecessaryProp,int64_t & result)352 bool JsObjectToLong(napi_env env, napi_value object, const char *filedStr, bool isNecessaryProp, int64_t &result)
353 {
354     bool hasProperty = false;
355     if (napi_has_named_property(env, object, filedStr, &hasProperty) != napi_ok) {
356         EDMLOGE("get js property failed.");
357         return false;
358     }
359     if (isNecessaryProp && !hasProperty) {
360         return false;
361     }
362     if (hasProperty) {
363         napi_value prop = nullptr;
364         return napi_get_named_property(env, object, filedStr, &prop) == napi_ok && ParseLong(env, result, prop);
365     }
366     return true;
367 }
368 
JsObjectToBool(napi_env env,napi_value object,const char * filedStr,bool isNecessaryProp,bool & result)369 bool JsObjectToBool(napi_env env, napi_value object, const char *filedStr, bool isNecessaryProp, bool &result)
370 {
371     bool hasProperty = false;
372     if (napi_has_named_property(env, object, filedStr, &hasProperty) != napi_ok) {
373         EDMLOGE("get js property failed.");
374         return false;
375     }
376     if (isNecessaryProp && !hasProperty) {
377         return false;
378     }
379     if (hasProperty) {
380         napi_value prop = nullptr;
381         return napi_get_named_property(env, object, filedStr, &prop) == napi_ok && ParseBool(env, result, prop);
382     }
383     return true;
384 }
385 
JsObjectToString(napi_env env,napi_value object,const char * filedStr,bool isNecessaryProp,std::string & resultStr)386 bool JsObjectToString(napi_env env, napi_value object, const char *filedStr, bool isNecessaryProp,
387     std::string &resultStr)
388 {
389     bool hasProperty = false;
390     if (napi_has_named_property(env, object, filedStr, &hasProperty) != napi_ok) {
391         EDMLOGE("get js property failed.");
392         return false;
393     }
394     if (isNecessaryProp && !hasProperty) {
395         return false;
396     }
397     if (hasProperty) {
398         napi_value prop = nullptr;
399         return napi_get_named_property(env, object, filedStr, &prop) == napi_ok && ParseString(env, resultStr, prop);
400     }
401     return true;
402 }
403 
JsObjectToCharArray(napi_env env,napi_value object,const char * filedStr,std::tuple<int,bool> charArrayProp,std::vector<char> & ret)404 bool JsObjectToCharArray(napi_env env, napi_value object, const char *filedStr, std::tuple<int, bool> charArrayProp,
405     std::vector<char> &ret)
406 {
407     bool hasProperty = false;
408     if (napi_has_named_property(env, object, filedStr, &hasProperty) != napi_ok) {
409         EDMLOGE("get js property failed.");
410         return false;
411     }
412     int maxLength = 0;
413     bool isNecessaryProp = false;
414     std::tie(maxLength, isNecessaryProp) = charArrayProp;
415     if (isNecessaryProp && !hasProperty) {
416         return false;
417     }
418     if (hasProperty) {
419         napi_value prop = nullptr;
420         return napi_get_named_property(env, object, filedStr, &prop) == napi_ok &&
421             ParseCharArray(env, prop, maxLength, ret);
422     }
423     return true;
424 }
425 
GetJsProperty(napi_env env,napi_value object,const char * filedStr,napi_value & result)426 bool GetJsProperty(napi_env env, napi_value object, const char *filedStr, napi_value &result)
427 {
428     bool hasProperty = false;
429     if (napi_has_named_property(env, object, filedStr, &hasProperty) != napi_ok || !hasProperty ||
430         napi_get_named_property(env, object, filedStr, &result) != napi_ok) {
431         EDMLOGE("Js has no property");
432         return false;
433     }
434     return true;
435 }
436 
JsObjectToU8Vector(napi_env env,napi_value object,const char * fieldStr,std::vector<uint8_t> & certVector)437 bool JsObjectToU8Vector(napi_env env, napi_value object, const char *fieldStr, std::vector<uint8_t> &certVector)
438 {
439     napi_value certEntry;
440     if (!GetJsProperty(env, object, fieldStr, certEntry)) {
441         return false;
442     }
443     bool isTypedArray = false;
444     if (napi_is_typedarray(env, certEntry, &isTypedArray) != napi_ok || !isTypedArray) {
445         EDMLOGE("js property is not typedarray");
446         return false;
447     }
448     size_t length = 0;
449     size_t offset = 0;
450     napi_typedarray_type type;
451     napi_value buffer = nullptr;
452     void *data = nullptr;
453     if (napi_get_typedarray_info(env, certEntry, &type, &length, &data, &buffer, &offset) != napi_ok ||
454         type != napi_uint8_array || buffer == nullptr) {
455         EDMLOGE("js object type is not uint8 array");
456         return false;
457     }
458     if (length > NAPI_MAX_DATA_LEN) {
459         EDMLOGE("uint8 array range failed");
460         return false;
461     }
462     if (data == nullptr) {
463         EDMLOGE("uint8 array data failed");
464         return false;
465     }
466     certVector.clear();
467     certVector.assign(static_cast<uint8_t *>(data), (static_cast<uint8_t *>(data) + length));
468     return true;
469 }
470 
JsObjectToStringVector(napi_env env,napi_value object,const char * filedStr,bool isNecessaryProp,std::vector<std::string> & vec)471 bool JsObjectToStringVector(napi_env env, napi_value object, const char *filedStr, bool isNecessaryProp,
472     std::vector<std::string> &vec)
473 {
474     bool hasProperty = false;
475     if (napi_has_named_property(env, object, filedStr, &hasProperty) != napi_ok) {
476         EDMLOGE("get js property failed.");
477         return false;
478     }
479     if (isNecessaryProp && !hasProperty) {
480         EDMLOGE("no yaobaohua hasProperty.");
481         return false;
482     }
483     if (hasProperty) {
484         napi_value prop = nullptr;
485         return napi_get_named_property(env, object, filedStr, &prop) == napi_ok && ParseStringArray(env, vec, prop);
486     }
487     return true;
488 }
489 
NativeVoidCallbackComplete(napi_env env,napi_status status,void * data)490 void NativeVoidCallbackComplete(napi_env env, napi_status status, void *data)
491 {
492     if (data == nullptr) {
493         EDMLOGE("data is nullptr");
494         return;
495     }
496     AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
497     napi_value error = nullptr;
498     if (asyncCallbackInfo->callback == nullptr) {
499         EDMLOGD("asyncCallbackInfo->deferred != nullptr");
500         if (asyncCallbackInfo->ret == ERR_OK) {
501             napi_get_null(env, &error);
502             napi_resolve_deferred(env, asyncCallbackInfo->deferred, error);
503         } else {
504             if (asyncCallbackInfo->innerCodeMsg.empty()) {
505                 napi_reject_deferred(env, asyncCallbackInfo->deferred, CreateError(env, asyncCallbackInfo->ret));
506             } else {
507                 napi_reject_deferred(env, asyncCallbackInfo->deferred,
508                     CreateErrorWithInnerCode(env, asyncCallbackInfo->ret, asyncCallbackInfo->innerCodeMsg));
509             }
510         }
511     } else {
512         EDMLOGD("asyncCallbackInfo->callback != nullptr");
513         if (asyncCallbackInfo->ret == ERR_OK) {
514             napi_get_null(env, &error);
515         } else {
516             if (asyncCallbackInfo->innerCodeMsg.empty()) {
517                 error = CreateError(env, asyncCallbackInfo->ret);
518             } else {
519                 error = CreateErrorWithInnerCode(env, asyncCallbackInfo->ret, asyncCallbackInfo->innerCodeMsg);
520             }
521         }
522         napi_value callback = nullptr;
523         napi_value result = nullptr;
524         napi_get_reference_value(env, asyncCallbackInfo->callback, &callback);
525         napi_call_function(env, nullptr, callback, ARGS_SIZE_ONE, &error, &result);
526         napi_delete_reference(env, asyncCallbackInfo->callback);
527     }
528     napi_delete_async_work(env, asyncCallbackInfo->asyncWork);
529     delete asyncCallbackInfo;
530 }
531 
HandleAsyncWork(napi_env env,AsyncCallbackInfo * context,const std::string & workName,napi_async_execute_callback execute,napi_async_complete_callback complete)532 napi_value HandleAsyncWork(napi_env env, AsyncCallbackInfo *context, const std::string &workName,
533     napi_async_execute_callback execute, napi_async_complete_callback complete)
534 {
535     napi_value result = nullptr;
536     if (context->callback == nullptr) {
537         napi_create_promise(env, &context->deferred, &result);
538     } else {
539         napi_get_undefined(env, &result);
540     }
541     napi_value resource = nullptr;
542     napi_get_undefined(env, &resource);
543     napi_value resourceName = nullptr;
544     napi_create_string_utf8(env, workName.data(), NAPI_AUTO_LENGTH, &resourceName);
545     napi_create_async_work(env, resource, resourceName, execute, complete, static_cast<void *>(context),
546         &context->asyncWork);
547     napi_queue_async_work(env, context->asyncWork);
548     return result;
549 }
550 
NativeBoolCallbackComplete(napi_env env,napi_status status,void * data)551 void NativeBoolCallbackComplete(napi_env env, napi_status status, void *data)
552 {
553     if (data == nullptr) {
554         EDMLOGE("data is nullptr");
555         return;
556     }
557     AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
558     napi_value result = nullptr;
559     napi_get_boolean(env, asyncCallbackInfo->boolRet, &result);
560     NativeCallbackComplete(env, status, asyncCallbackInfo, result);
561     delete asyncCallbackInfo;
562 }
563 
NativeNumberCallbackComplete(napi_env env,napi_status status,void * data)564 void NativeNumberCallbackComplete(napi_env env, napi_status status, void *data)
565 {
566     if (data == nullptr) {
567         EDMLOGE("data is nullptr");
568         return;
569     }
570     AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
571     napi_value result = nullptr;
572     napi_create_int32(env, asyncCallbackInfo->intRet, &result);
573     NativeCallbackComplete(env, status, asyncCallbackInfo, result);
574     delete asyncCallbackInfo;
575 }
576 
NativeStringCallbackComplete(napi_env env,napi_status status,void * data)577 void NativeStringCallbackComplete(napi_env env, napi_status status, void *data)
578 {
579     if (data == nullptr) {
580         EDMLOGE("data is nullptr");
581         return;
582     }
583     AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
584     napi_value result = nullptr;
585     napi_create_string_utf8(env, asyncCallbackInfo->stringRet.c_str(), NAPI_AUTO_LENGTH, &result);
586     NativeCallbackComplete(env, status, asyncCallbackInfo, result);
587     delete asyncCallbackInfo;
588 }
589 
NativeArrayStringCallbackComplete(napi_env env,napi_status status,void * data)590 void NativeArrayStringCallbackComplete(napi_env env, napi_status status, void *data)
591 {
592     if (data == nullptr) {
593         EDMLOGE("data is nullptr");
594         return;
595     }
596     AsyncCallbackInfo *asyncCallbackInfo = static_cast<AsyncCallbackInfo *>(data);
597     napi_value result = nullptr;
598     napi_create_array(env, &result);
599     ConvertStringVectorToJS(env, asyncCallbackInfo->arrayStringRet, result);
600     NativeCallbackComplete(env, status, asyncCallbackInfo, result);
601     delete asyncCallbackInfo;
602 }
603 
ConvertStringVectorToJS(napi_env env,const std::vector<std::string> & stringVector,napi_value result)604 void ConvertStringVectorToJS(napi_env env, const std::vector<std::string> &stringVector, napi_value result)
605 {
606     EDMLOGD("vector size: %{public}zu", stringVector.size());
607     size_t idx = 0;
608     for (const auto &str : stringVector) {
609         napi_value obj = nullptr;
610         napi_create_string_utf8(env, str.c_str(), NAPI_AUTO_LENGTH, &obj);
611         napi_set_element(env, result, idx, obj);
612         idx++;
613     }
614 }
615 
CheckAdminWithUserIdParamType(napi_env env,size_t argc,napi_value * argv,bool & hasCallback,bool & hasUserId)616 bool CheckAdminWithUserIdParamType(napi_env env, size_t argc, napi_value *argv, bool &hasCallback, bool &hasUserId)
617 {
618     if (!MatchValueType(env, argv[ARR_INDEX_ZERO], napi_object)) {
619         EDMLOGE("CheckAdminWithUserIdParamType admin type check failed");
620         return false;
621     }
622     EDMLOGI("argc = %{public}zu", argc);
623     if (argc == ARGS_SIZE_ONE) {
624         hasCallback = false;
625         hasUserId = false;
626         EDMLOGI("hasCallback = false; hasUserId = false;");
627         return true;
628     }
629 
630     if (argc == ARGS_SIZE_TWO) {
631         if (MatchValueType(env, argv[ARR_INDEX_ONE], napi_function)) {
632             hasCallback = true;
633             hasUserId = false;
634             EDMLOGI("hasCallback = true; hasUserId = false;");
635             return true;
636         } else {
637             hasCallback = false;
638             hasUserId = true;
639             EDMLOGI("hasCallback = false;  hasUserId = true;");
640             return MatchValueType(env, argv[ARR_INDEX_ONE], napi_number);
641         }
642     }
643     hasCallback = true;
644     hasUserId = true;
645     EDMLOGI("hasCallback = true; hasUserId = true;");
646     return MatchValueType(env, argv[ARR_INDEX_ONE], napi_number) &&
647         MatchValueType(env, argv[ARR_INDEX_TWO], napi_function);
648 }
649 
CheckGetPolicyAdminParam(napi_env env,napi_value value,bool & hasAdmin,OHOS::AppExecFwk::ElementName & elementName)650 bool CheckGetPolicyAdminParam(napi_env env, napi_value value, bool &hasAdmin,
651     OHOS::AppExecFwk::ElementName &elementName)
652 {
653     if (MatchValueType(env, value, napi_null)) {
654         hasAdmin = false;
655         return true;
656     }
657     if (MatchValueType(env, value, napi_object)) {
658         hasAdmin = true;
659         if (ParseElementName(env, elementName, value)) {
660             return true;
661         }
662     }
663     return false;
664 }
665 
ParseStringToInt(const std::string & strValue,int32_t & result)666 bool ParseStringToInt(const std::string &strValue, int32_t &result)
667 {
668     int64_t temp = 0;
669     if (!ParseStringToLong(strValue, temp)) {
670         EDMLOGE("ParseStringToInt: parse str failed");
671         return false;
672     }
673     if (temp < INT_MIN || temp > INT_MAX) {
674         EDMLOGE("ParseStringToInt: parse failed, int32 expected.");
675         return false;
676     }
677     result = temp;
678     return true;
679 }
680 
ParseStringToLong(const std::string & strValue,int64_t & result)681 bool ParseStringToLong(const std::string &strValue, int64_t &result)
682 {
683     char *end = nullptr;
684     const char *p = strValue.c_str();
685     errno = 0;
686     result = strtoll(p, &end, EdmConstants::DECIMAL);
687     if (errno == ERANGE || end == p || *end != '\0') {
688         EDMLOGE("ParseStringToLong: parse str failed: %{public}s", p);
689         return false;
690     }
691     return true;
692 }
693 } // namespace EDM
694 } // namespace OHOS