• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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 "datashare_js_utils.h"
17 
18 #include "datashare_log.h"
19 #include "napi_ashmem.h"
20 #include "securec.h"
21 
22 namespace OHOS {
23 namespace DataShare {
Convert2String(napi_env env,napi_value jsStr,const size_t max)24 std::string DataShareJSUtils::Convert2String(napi_env env, napi_value jsStr, const size_t max)
25 {
26     size_t str_buffer_size = max;
27     napi_get_value_string_utf8(env, jsStr, nullptr, 0, &str_buffer_size);
28     char *buf = new (std::nothrow) char[str_buffer_size + 1];
29     if (buf == nullptr) {
30         return "";
31     }
32     size_t len = 0;
33     napi_get_value_string_utf8(env, jsStr, buf, str_buffer_size + 1, &len);
34     buf[len] = 0;
35     std::string value(buf);
36     delete[] buf;
37     return value;
38 }
39 
Convert2StrVector(napi_env env,napi_value value,const size_t strMax)40 std::vector<std::string> DataShareJSUtils::Convert2StrVector(napi_env env, napi_value value, const size_t strMax)
41 {
42     NAPI_ASSERT_BASE(env, strMax > 0, "failed on strMax > 0",  std::vector<std::string>());
43     uint32_t arrLen = 0;
44     napi_get_array_length(env, value, &arrLen);
45     if (arrLen == 0) {
46         return {};
47     }
48     std::vector<std::string> result;
49     for (size_t i = 0; i < arrLen; ++i) {
50         napi_value element;
51         if (napi_get_element(env, value, i, &element) != napi_ok) {
52             return {};
53         }
54         result.push_back(ConvertAny2String(env, element));
55     }
56     return result;
57 }
58 
Convert2U8Vector(napi_env env,napi_value input_array)59 std::vector<uint8_t> DataShareJSUtils::Convert2U8Vector(napi_env env, napi_value input_array)
60 {
61     bool isTypedArray = false;
62     bool isArrayBuffer = false;
63     napi_is_typedarray(env, input_array, &isTypedArray);
64     if (!isTypedArray) {
65         napi_is_arraybuffer(env, input_array, &isArrayBuffer);
66         if (!isArrayBuffer) {
67             LOG_ERROR("unknow type");
68             return {};
69         }
70     }
71     size_t length = 0;
72     void *data = nullptr;
73     if (isTypedArray) {
74         napi_typedarray_type type;
75         napi_value input_buffer = nullptr;
76         size_t byte_offset = 0;
77         napi_get_typedarray_info(env, input_array, &type, &length, &data, &input_buffer, &byte_offset);
78         if (type != napi_uint8_array || data == nullptr) {
79             LOG_ERROR("napi_get_typedarray_info err");
80             return {};
81         }
82     } else {
83         napi_get_arraybuffer_info(env, input_array, &data, &length);
84         if (data == nullptr || length <= 0) {
85             LOG_ERROR("napi_get_arraybuffer_info err");
86             return {};
87         }
88     }
89     return std::vector<uint8_t>((uint8_t *)data, ((uint8_t *)data) + length);
90 }
91 
ConvertU8Vector(napi_env env,napi_value jsValue)92 std::vector<uint8_t> DataShareJSUtils::ConvertU8Vector(napi_env env, napi_value jsValue)
93 {
94     bool isTypedArray = false;
95     if (napi_is_typedarray(env, jsValue, &isTypedArray) != napi_ok || !isTypedArray) {
96         return {};
97     }
98 
99     napi_typedarray_type type;
100     size_t length = 0;
101     napi_value buffer = nullptr;
102     size_t offset = 0;
103     NAPI_CALL_BASE(env, napi_get_typedarray_info(env, jsValue, &type, &length, nullptr, &buffer, &offset), {});
104     if (type != napi_uint8_array) {
105         return {};
106     }
107     uint8_t *data = nullptr;
108     size_t total = 0;
109     NAPI_CALL_BASE(env, napi_get_arraybuffer_info(env, buffer, reinterpret_cast<void **>(&data), &total), {});
110     length = std::min<size_t>(length, total - offset);
111     std::vector<uint8_t> result(sizeof(uint8_t) + length);
112     int retCode = memcpy_s(result.data(), result.size(), &data[offset], length);
113     if (retCode != 0) {
114         return {};
115     }
116     return result;
117 }
118 
ConvertAny2String(napi_env env,napi_value jsValue)119 std::string DataShareJSUtils::ConvertAny2String(napi_env env, napi_value jsValue)
120 {
121     napi_valuetype valueType = napi_undefined;
122     NAPI_CALL_BASE(env, napi_typeof(env, jsValue, &valueType), "napi_typeof failed");
123     if (valueType == napi_string) {
124         return DataShareJSUtils::Convert2String(env, jsValue, DataShareJSUtils::DEFAULT_BUF_SIZE);
125     } else if (valueType == napi_number) {
126         double valueNumber;
127         napi_get_value_double(env, jsValue, &valueNumber);
128         return std::to_string(valueNumber);
129     } else if (valueType == napi_boolean) {
130         bool valueBool = false;
131         napi_get_value_bool(env, jsValue, &valueBool);
132         return std::to_string(valueBool);
133     } else if (valueType == napi_null) {
134         return "null";
135     } else if (valueType == napi_object) {
136         std::vector<uint8_t> bytes = DataShareJSUtils::Convert2U8Vector(env, jsValue);
137         std::string ret(bytes.begin(), bytes.end());
138         return ret;
139     }
140 
141     return "invalid type";
142 }
143 
Convert2JSValue(napi_env env,const std::monostate & value)144 napi_value DataShareJSUtils::Convert2JSValue(napi_env env, const std::monostate &value)
145 {
146     return nullptr;
147 }
148 
Convert2JSValue(napi_env env,const std::vector<std::string> & value)149 napi_value DataShareJSUtils::Convert2JSValue(napi_env env, const std::vector<std::string> &value)
150 {
151     napi_value jsValue;
152     napi_status status = napi_create_array_with_length(env, value.size(), &jsValue);
153     if (status != napi_ok) {
154         return nullptr;
155     }
156 
157     for (size_t i = 0; i < value.size(); ++i) {
158         napi_set_element(env, jsValue, i, Convert2JSValue(env, value[i]));
159     }
160     return jsValue;
161 }
162 
Convert2JSValue(napi_env env,const std::string & value)163 napi_value DataShareJSUtils::Convert2JSValue(napi_env env, const std::string &value)
164 {
165     napi_value jsValue;
166     napi_status status = napi_create_string_utf8(env, value.c_str(), value.size(), &jsValue);
167     if (status != napi_ok) {
168         return nullptr;
169     }
170     return jsValue;
171 }
172 
Convert2JSValue(napi_env env,const std::vector<uint8_t> & value,bool isTypedArray)173 napi_value DataShareJSUtils::Convert2JSValue(napi_env env, const std::vector<uint8_t> &value, bool isTypedArray)
174 {
175     void *native = nullptr;
176     napi_value buffer = nullptr;
177     if (value.empty()) {
178         LOG_ERROR("Convert2JSValue error");
179         return nullptr;
180     }
181     napi_status status = napi_create_arraybuffer(env, value.size(), &native, &buffer);
182     if (status != napi_ok) {
183         return nullptr;
184     }
185     if (memcpy_s(native, value.size(), value.data(), value.size()) != EOK && value.size() > 0) {
186         return nullptr;
187     }
188     if (!isTypedArray) {
189         return buffer;
190     }
191     napi_value jsValue;
192     status = napi_create_typedarray(env, napi_uint8_array, value.size(), buffer, 0, &jsValue);
193     if (status != napi_ok) {
194         return nullptr;
195     }
196     return jsValue;
197 }
198 
Convert2JSValue(napi_env env,int32_t value)199 napi_value DataShareJSUtils::Convert2JSValue(napi_env env, int32_t value)
200 {
201     napi_value jsValue;
202     napi_status status = napi_create_int32(env, value, &jsValue);
203     if (status != napi_ok) {
204         return nullptr;
205     }
206     return jsValue;
207 }
208 
Convert2JSValue(napi_env env,int64_t value)209 napi_value DataShareJSUtils::Convert2JSValue(napi_env env, int64_t value)
210 {
211     napi_value jsValue;
212     napi_status status = napi_create_int64(env, value, &jsValue);
213     if (status != napi_ok) {
214         return nullptr;
215     }
216     return jsValue;
217 }
218 
Convert2JSValue(napi_env env,double value)219 napi_value DataShareJSUtils::Convert2JSValue(napi_env env, double value)
220 {
221     napi_value jsValue;
222     napi_status status = napi_create_double(env, value, &jsValue);
223     if (status != napi_ok) {
224         return nullptr;
225     }
226     return jsValue;
227 }
228 
Convert2JSValue(napi_env env,bool value)229 napi_value DataShareJSUtils::Convert2JSValue(napi_env env, bool value)
230 {
231     napi_value jsValue;
232     napi_status status = napi_get_boolean(env, value, &jsValue);
233     if (status != napi_ok) {
234         return nullptr;
235     }
236     return jsValue;
237 }
238 
Convert2JSValue(napi_env env,const std::map<std::string,int> & value)239 napi_value DataShareJSUtils::Convert2JSValue(napi_env env, const std::map<std::string, int> &value)
240 {
241     napi_value jsValue;
242     napi_status status = napi_create_array_with_length(env, value.size(), &jsValue);
243     if (status != napi_ok) {
244         return nullptr;
245     }
246 
247     int index = 0;
248     for (const auto& [device, result] : value) {
249         napi_value jsElement;
250         status = napi_create_array_with_length(env, SYNC_RESULT_ELEMNT_NUM, &jsElement);
251         if (status != napi_ok) {
252             return nullptr;
253         }
254         napi_set_element(env, jsElement, 0, Convert2JSValue(env, device));
255         napi_set_element(env, jsElement, 1, Convert2JSValue(env, result));
256         napi_set_element(env, jsValue, index++, jsElement);
257     }
258 
259     return jsValue;
260 }
UnwrapStringFromJS(napi_env env,napi_value param,const std::string & defaultValue)261 std::string DataShareJSUtils::UnwrapStringFromJS(napi_env env, napi_value param, const std::string &defaultValue)
262 {
263     size_t size = 0;
264     if (napi_get_value_string_utf8(env, param, nullptr, 0, &size) != napi_ok) {
265         return defaultValue;
266     }
267 
268     std::string value("");
269     if (size == 0) {
270         return defaultValue;
271     }
272 
273     char *buf = new (std::nothrow) char[size + 1];
274     if (buf == nullptr) {
275         return value;
276     }
277     (void)memset_s(buf, size + 1, 0, size + 1);
278 
279     bool rev = napi_get_value_string_utf8(env, param, buf, size + 1, &size) == napi_ok;
280     if (rev) {
281         value = buf;
282     } else {
283         value = defaultValue;
284     }
285 
286     if (buf != nullptr) {
287         delete[] buf;
288         buf = nullptr;
289     }
290     return value;
291 }
292 
Convert2ValueObject(napi_env env,napi_value value,bool & status)293 DataShareValueObject DataShareJSUtils::Convert2ValueObject(napi_env env, napi_value value, bool &status)
294 {
295     napi_valuetype valueType = napi_undefined;
296     napi_typeof(env, value, &valueType);
297     status = true;
298     if (valueType == napi_string) {
299         std::string valueString = DataShareJSUtils::UnwrapStringFromJS(env, value);
300         return valueString;
301     } else if (valueType == napi_number) {
302         double valueNumber = 0;
303         napi_get_value_double(env, value, &valueNumber);
304         return valueNumber;
305     } else if (valueType == napi_boolean) {
306         bool valueBool = false;
307         napi_get_value_bool(env, value, &valueBool);
308         return valueBool;
309     } else if (valueType == napi_null) {
310         return {};
311     } else if (valueType == napi_object) {
312         std::vector<uint8_t> valueBlob = DataShareJSUtils::Convert2U8Vector(env, value);
313         return valueBlob;
314     } else {
315         LOG_ERROR("valuesBucket error");
316         status = false;
317         return {};
318     }
319 }
320 
Equals(napi_env env,napi_value value,napi_ref copy)321 bool DataShareJSUtils::Equals(napi_env env, napi_value value, napi_ref copy)
322 {
323     if (copy == nullptr) {
324         return (value == nullptr);
325     }
326 
327     napi_value copyValue = nullptr;
328     napi_get_reference_value(env, copy, &copyValue);
329 
330     bool isEqual = false;
331     napi_strict_equals(env, value, copyValue, &isEqual);
332     return isEqual;
333 }
334 
Convert2JSValue(napi_env env,const TemplateId & templateId)335 napi_value DataShareJSUtils::Convert2JSValue(napi_env env, const TemplateId &templateId)
336 {
337     napi_value tplId = nullptr;
338     napi_create_object(env, &tplId);
339     napi_value subscriberId = Convert2JSValue(env, std::to_string(templateId.subscriberId_));
340     if (subscriberId == nullptr) {
341         return nullptr;
342     }
343     napi_value bundleName = nullptr;
344     bundleName = Convert2JSValue(env, templateId.bundleName_);
345     if (bundleName == nullptr) {
346         return nullptr;
347     }
348     napi_set_named_property(env, tplId, "subscriberId", subscriberId);
349     napi_set_named_property(env, tplId, "bundleName", bundleName);
350     return tplId;
351 }
352 
Convert2JSValue(napi_env env,const RdbChangeNode & changeNode)353 napi_value DataShareJSUtils::Convert2JSValue(napi_env env, const RdbChangeNode &changeNode)
354 {
355     napi_value jsRdbChangeNode = nullptr;
356     napi_create_object(env, &jsRdbChangeNode);
357 
358     napi_value uri = nullptr;
359     uri = Convert2JSValue(env, changeNode.uri_);
360     if (uri == nullptr) {
361         return nullptr;
362     }
363     napi_value templateId = nullptr;
364     templateId = Convert2JSValue(env, changeNode.templateId_);
365     if (templateId == nullptr) {
366         return nullptr;
367     }
368     napi_value data = Convert2JSValue(env, changeNode.data_);
369     if (data == nullptr) {
370         return nullptr;
371     }
372     napi_set_named_property(env, jsRdbChangeNode, "uri", uri);
373     napi_set_named_property(env, jsRdbChangeNode, "templateId", templateId);
374     napi_set_named_property(env, jsRdbChangeNode, "data", data);
375     return jsRdbChangeNode;
376 }
377 
Convert2JSValue(napi_env env,PublishedDataItem & publishedDataItem)378 napi_value DataShareJSUtils::Convert2JSValue(napi_env env, PublishedDataItem &publishedDataItem)
379 {
380     napi_value jsPublishedDataItem = nullptr;
381     napi_create_object(env, &jsPublishedDataItem);
382 
383     napi_value key = Convert2JSValue(env, publishedDataItem.key_);
384     if (key == nullptr) {
385         return nullptr;
386     }
387 
388     napi_value subscriberId = nullptr;
389     subscriberId = Convert2JSValue(env, std::to_string(publishedDataItem.subscriberId_));
390     if (subscriberId == nullptr) {
391         return nullptr;
392     }
393 
394     napi_value data = nullptr;
395     if (publishedDataItem.IsAshmem()) {
396         data = Convert2JSValue(env, std::get<std::vector<uint8_t>>(publishedDataItem.GetData()), false);
397     } else {
398         data = Convert2JSValue(env, std::get<std::string>(publishedDataItem.GetData()));
399     }
400     if (data == nullptr) {
401         return nullptr;
402     }
403 
404     napi_set_named_property(env, jsPublishedDataItem, "key", key);
405     napi_set_named_property(env, jsPublishedDataItem, "subscriberId", subscriberId);
406     napi_set_named_property(env, jsPublishedDataItem, "data", data);
407     return jsPublishedDataItem;
408 }
409 
Convert2JSValue(napi_env env,std::vector<PublishedDataItem> & publishedDataItems)410 napi_value DataShareJSUtils::Convert2JSValue(napi_env env, std::vector<PublishedDataItem> &publishedDataItems)
411 {
412     napi_value jsValue;
413     napi_status status = napi_create_array_with_length(env, publishedDataItems.size(), &jsValue);
414     if (status != napi_ok) {
415         return nullptr;
416     }
417 
418     for (size_t i = 0; i < publishedDataItems.size(); ++i) {
419         napi_set_element(env, jsValue, i, Convert2JSValue(env, publishedDataItems[i]));
420     }
421     return jsValue;
422 }
423 
Convert2JSValue(napi_env env,PublishedDataChangeNode & changeNode)424 napi_value DataShareJSUtils::Convert2JSValue(napi_env env, PublishedDataChangeNode &changeNode)
425 {
426     napi_value jsPublishedDataChangeNode = nullptr;
427     napi_create_object(env, &jsPublishedDataChangeNode);
428 
429     napi_value bundleName = nullptr;
430     bundleName = Convert2JSValue(env, changeNode.ownerBundleName_);
431     if (bundleName == nullptr) {
432         return nullptr;
433     }
434     napi_value data = nullptr;
435     data = Convert2JSValue(env, changeNode.datas_);
436     if (data == nullptr) {
437         return nullptr;
438     }
439     napi_set_named_property(env, jsPublishedDataChangeNode, "bundleName", bundleName);
440     napi_set_named_property(env, jsPublishedDataChangeNode, "data", data);
441     return jsPublishedDataChangeNode;
442 }
443 
Convert2JSValue(napi_env env,const OperationResult & results)444 napi_value DataShareJSUtils::Convert2JSValue(napi_env env, const OperationResult &results)
445 {
446     napi_value jsOperationResult = nullptr;
447     napi_create_object(env, &jsOperationResult);
448 
449     napi_value key = nullptr;
450     key = Convert2JSValue(env, results.key_);
451     if (key == nullptr) {
452         return nullptr;
453     }
454 
455     napi_value result = nullptr;
456     result = Convert2JSValue(env, results.errCode_);
457     if (result == nullptr) {
458         return nullptr;
459     }
460     napi_set_named_property(env, jsOperationResult, "key", key);
461     napi_set_named_property(env, jsOperationResult, "result", result);
462     return jsOperationResult;
463 }
464 
Convert2JSValue(napi_env env,const std::vector<OperationResult> & results)465 napi_value DataShareJSUtils::Convert2JSValue(napi_env env, const std::vector<OperationResult> &results)
466 {
467     napi_value jsValue;
468     napi_status status = napi_create_array_with_length(env, results.size(), &jsValue);
469     if (status != napi_ok) {
470         return nullptr;
471     }
472 
473     for (size_t i = 0; i < results.size(); ++i) {
474         napi_set_element(env, jsValue, i, Convert2JSValue(env, results[i]));
475     }
476     return jsValue;
477 }
478 
UnwrapTemplatePredicates(napi_env env,napi_value jsPredicates,std::vector<PredicateTemplateNode> & predicates)479 bool DataShareJSUtils::UnwrapTemplatePredicates(napi_env env, napi_value jsPredicates,
480     std::vector<PredicateTemplateNode> &predicates)
481 {
482     napi_value keys = nullptr;
483     napi_get_property_names(env, jsPredicates, &keys);
484     uint32_t arrLen = 0;
485     napi_status status = napi_get_array_length(env, keys, &arrLen);
486     if (status != napi_ok) {
487         LOG_ERROR("UnwrapTemplatePredicates error");
488         return false;
489     }
490     LOG_DEBUG("TemplatePredicates length : %{public}u", arrLen);
491     for (size_t i = 0; i < arrLen; ++i) {
492         napi_value key = nullptr;
493         status = napi_get_element(env, keys, i, &key);
494         if (status != napi_ok) {
495             LOG_ERROR("UnwrapTemplatePredicates err");
496             return false;
497         }
498         napi_value value = nullptr;
499         status = napi_get_property(env, jsPredicates, key, &value);
500         if (status != napi_ok) {
501             LOG_ERROR("UnwrapTemplatePredicates err");
502             return false;
503         }
504         std::string keyStr = UnwrapStringFromJS(env, key);
505         std::string valueStr = UnwrapStringFromJS(env, value);
506         PredicateTemplateNode node(keyStr, valueStr);
507         predicates.emplace_back(node);
508     }
509     return true;
510 }
511 
Convert2Template(napi_env env,napi_value value)512 Template DataShareJSUtils::Convert2Template(napi_env env, napi_value value)
513 {
514     napi_valuetype valueType = napi_undefined;
515     napi_typeof(env, value, &valueType);
516     if (valueType != napi_object) {
517         LOG_ERROR("Convert2Template error, value is not object");
518         return {};
519     }
520     napi_value jsPredicates;
521     auto status =  napi_get_named_property(env, value, "predicates", &jsPredicates);
522     if (status != napi_ok) {
523         LOG_ERROR("Convert predicates failed");
524         return {};
525     }
526     std::vector<PredicateTemplateNode> predicates;
527     if (!UnwrapTemplatePredicates(env, jsPredicates, predicates)) {
528         LOG_ERROR("UnwrapTemplateNodeVector failed");
529         return {};
530     }
531 
532     std::string scheduler;
533     if (!UnwrapStringByPropertyName(env, value, "scheduler", scheduler)) {
534         LOG_ERROR("Convert scheduler failed");
535         return {};
536     }
537     Template tpl(predicates, scheduler);
538     return tpl;
539 }
540 
Convert2TemplateId(napi_env env,napi_value value)541 TemplateId DataShareJSUtils::Convert2TemplateId(napi_env env, napi_value value)
542 {
543     napi_valuetype valueType = napi_undefined;
544     napi_typeof(env, value, &valueType);
545     if (valueType != napi_object) {
546         LOG_ERROR("Convert2TemplateId error, value is not object");
547         return {};
548     }
549 
550     TemplateId templateId;
551     std::string strSubId;
552     if (!UnwrapStringByPropertyName(env, value, "subscriberId", strSubId)) {
553         LOG_ERROR("Convert subscriberId failed");
554         return {};
555     }
556     templateId.subscriberId_ = atoll(strSubId.c_str());
557     if (!UnwrapStringByPropertyName(env, value, "bundleNameOfOwner", templateId.bundleName_)) {
558         LOG_ERROR("Convert bundleNameOfOwner failed");
559         return {};
560     }
561     return templateId;
562 }
563 
UnwrapPublishedDataItem(napi_env env,napi_value jsObject,PublishedDataItem & publishedDataItem)564 bool DataShareJSUtils::UnwrapPublishedDataItem(napi_env env, napi_value jsObject, PublishedDataItem &publishedDataItem)
565 {
566     napi_valuetype valueType = napi_undefined;
567     napi_typeof(env, jsObject, &valueType);
568     if (valueType != napi_object) {
569         LOG_ERROR("UnwrapPublishedDataItem error, value is not object");
570         return false;
571     }
572 
573     if (!UnwrapStringByPropertyName(env, jsObject, "key", publishedDataItem.key_)) {
574         LOG_ERROR("Convert key failed");
575         return false;
576     }
577     std::string keyStr = "data";
578     napi_value jsDataKey = Convert2JSValue(env, keyStr);
579     napi_value jsDataValue = nullptr;
580     napi_get_property(env, jsObject, jsDataKey, &jsDataValue);
581     napi_typeof(env, jsDataValue, &valueType);
582     PublishedDataItem::DataType value;
583     if (valueType == napi_object) {
584         value = Convert2U8Vector(env, jsDataValue);
585         publishedDataItem.Set(value);
586     } else if (valueType == napi_string) {
587         value = Convert2String(env, jsDataValue);
588         publishedDataItem.Set(value);
589     } else {
590         LOG_ERROR("Convert dataValue failed, type is %{public}d", valueType);
591         return false;
592     }
593     std::string strSubId;
594     if (!UnwrapStringByPropertyName(env, jsObject, "subscriberId", strSubId)) {
595         LOG_ERROR("Convert subscriberId failed");
596         return false;
597     }
598     publishedDataItem.subscriberId_ = atoll(strSubId.c_str());
599     return true;
600 }
601 
IsArrayForNapiValue(napi_env env,napi_value param,uint32_t & arraySize)602 bool DataShareJSUtils::IsArrayForNapiValue(napi_env env, napi_value param, uint32_t &arraySize)
603 {
604     bool isArray = false;
605     arraySize = 0;
606 
607     if (napi_is_array(env, param, &isArray) != napi_ok || isArray == false) {
608         return false;
609     }
610 
611     if (napi_get_array_length(env, param, &arraySize) != napi_ok) {
612         return false;
613     }
614     return true;
615 }
616 
UnwrapPublishedDataItemVector(napi_env env,napi_value value,std::vector<PublishedDataItem> & publishedDataItems)617 bool DataShareJSUtils::UnwrapPublishedDataItemVector(napi_env env, napi_value value,
618     std::vector<PublishedDataItem> &publishedDataItems)
619 {
620     uint32_t arraySize = 0;
621 
622     if (!IsArrayForNapiValue(env, value, arraySize)) {
623         LOG_ERROR("IsArrayForNapiValue is false");
624         return false;
625     }
626 
627     for (uint32_t i = 0; i < arraySize; i++) {
628         napi_value jsValue = nullptr;
629         if (napi_get_element(env, value, i, &jsValue) != napi_ok) {
630             LOG_ERROR("napi_get_element is false");
631             return false;
632         }
633 
634         PublishedDataItem publishedDataItem;
635         if (!UnwrapPublishedDataItem(env, jsValue, publishedDataItem)) {
636             LOG_ERROR("UnwrapPublishedDataItem failed");
637             return false;
638         }
639         publishedDataItems.emplace_back(std::move(publishedDataItem));
640     }
641     return true;
642 }
643 
Convert2PublishedData(napi_env env,napi_value value)644 Data DataShareJSUtils::Convert2PublishedData(napi_env env, napi_value value)
645 {
646     napi_valuetype valueType = napi_undefined;
647     napi_typeof(env, value, &valueType);
648     if (valueType != napi_object) {
649         LOG_ERROR("Convert2PublishedData error, value is not object");
650         return {};
651     }
652     Data data;
653     if (!UnwrapPublishedDataItemVector(env, value,  data.datas_)) {
654         LOG_ERROR("UnwrapPublishedDataItems failed");
655         return {};
656     }
657     return data;
658 }
659 
UnwrapStringByPropertyName(napi_env env,napi_value jsObject,const char * propertyName,std::string & value)660 bool DataShareJSUtils::UnwrapStringByPropertyName(
661     napi_env env, napi_value jsObject, const char *propertyName, std::string &value)
662 {
663     napi_value jsResult = nullptr;
664     auto status = napi_get_named_property(env, jsObject, propertyName, &jsResult);
665     if (status != napi_ok) {
666         LOG_ERROR("Convert bundleNameOfOwner failed");
667         return false;
668     }
669     if (jsResult == nullptr) {
670         LOG_ERROR("Convert bundleNameOfOwner failed");
671         return false;
672     }
673     napi_valuetype valueType = napi_undefined;
674     napi_typeof(env, jsResult, &valueType);
675     if (valueType != napi_string) {
676         LOG_ERROR("Convert2PublishedData error, value is not object");
677         return false;
678     }
679     value = DataShareJSUtils::Convert2String(env, jsResult);
680     return true;
681 }
682 } // namespace DataShare
683 } // namespace OHOS