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, ©Value);
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