• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 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 #include "napi_data_utils.h"
16 #include "pasteboard_hilog.h"
17 
18 using namespace OHOS::MiscServices;
19 namespace OHOS {
20 namespace MiscServicesNapi {
21 constexpr int32_t STR_MAX_LENGTH = 4096;
22 constexpr size_t STR_TAIL_LENGTH = 1;
23 
24 const std::map<PasteboardError, std::pair<JSErrorCode, std::string>> errInfoMap = {
25     {PasteboardError::PERMISSION_VERIFICATION_ERROR,
26         {JSErrorCode::NO_PERMISSION, "Permission verification failed. A non-permission application calls a API."}},
27     {PasteboardError::TASK_PROCESSING,
28         {JSErrorCode::OTHER_COPY_OR_PASTE_IN_PROCESSING, "Another calling is being processed."}}
29 };
30 
GetErrInfo(PasteboardError retCode)31 std::pair<JSErrorCode, std::string> NapiDataUtils::GetErrInfo(PasteboardError retCode)
32 {
33     auto iter = errInfoMap.find(retCode);
34     if (iter != errInfoMap.end()) {
35         return iter->second;
36     }
37     return {static_cast<JSErrorCode>(-1), "Unknown error."};
38 }
39 
40 /* napi_value <-> bool */
GetValue(napi_env env,napi_value in,bool & out)41 napi_status NapiDataUtils::GetValue(napi_env env, napi_value in, bool &out)
42 {
43     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value <- bool");
44     return napi_get_value_bool(env, in, &out);
45 }
46 
SetValue(napi_env env,const bool & in,napi_value & out)47 napi_status NapiDataUtils::SetValue(napi_env env, const bool &in, napi_value &out)
48 {
49     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value -> bool");
50     return napi_get_boolean(env, in, &out);
51 }
52 
53 /* napi_value <-> int32_t */
GetValue(napi_env env,napi_value in,int32_t & out)54 napi_status NapiDataUtils::GetValue(napi_env env, napi_value in, int32_t &out)
55 {
56     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value -> int32_t");
57     return napi_get_value_int32(env, in, &out);
58 }
59 
SetValue(napi_env env,const int32_t & in,napi_value & out)60 napi_status NapiDataUtils::SetValue(napi_env env, const int32_t &in, napi_value &out)
61 {
62     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value <- int32_t");
63     return napi_create_int32(env, in, &out);
64 }
65 
66 /* napi_value <-> int64_t */
GetValue(napi_env env,napi_value in,int64_t & out)67 napi_status NapiDataUtils::GetValue(napi_env env, napi_value in, int64_t &out)
68 {
69     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value -> int64_t");
70     return napi_get_value_int64(env, in, &out);
71 }
72 
SetValue(napi_env env,const int64_t & in,napi_value & out)73 napi_status NapiDataUtils::SetValue(napi_env env, const int64_t &in, napi_value &out)
74 {
75     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value <- int64_t");
76     return napi_create_int64(env, in, &out);
77 }
78 
79 /* napi_value <-> float */
GetValue(napi_env env,napi_value in,float & out)80 napi_status NapiDataUtils::GetValue(napi_env env, napi_value in, float &out)
81 {
82     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value -> float");
83     double tmp = 0;
84     napi_status status = napi_get_value_double(env, in, &tmp);
85     out = tmp;
86     return status;
87 }
88 
SetValue(napi_env env,const float & in,napi_value & out)89 napi_status NapiDataUtils::SetValue(napi_env env, const float &in, napi_value &out)
90 {
91     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value <- float");
92     double tmp = in;
93     return napi_create_double(env, tmp, &out);
94 }
95 
96 /* napi_value <-> double */
GetValue(napi_env env,napi_value in,double & out)97 napi_status NapiDataUtils::GetValue(napi_env env, napi_value in, double &out)
98 {
99     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value -> double");
100     return napi_get_value_double(env, in, &out);
101 }
102 
SetValue(napi_env env,const double & in,napi_value & out)103 napi_status NapiDataUtils::SetValue(napi_env env, const double &in, napi_value &out)
104 {
105     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value <- double");
106     return napi_create_double(env, in, &out);
107 }
108 
109 /* napi_value <-> std::string */
GetValue(napi_env env,napi_value in,std::string & out)110 napi_status NapiDataUtils::GetValue(napi_env env, napi_value in, std::string &out)
111 {
112     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value <- string");
113     napi_valuetype type = napi_undefined;
114     napi_status status = napi_typeof(env, in, &type);
115     if (!((status == napi_ok) && (type == napi_string))) {
116         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "napi_typeof failed, type=%{public}d status=%{public}d",
117             static_cast<int32_t>(type), status);
118         return napi_invalid_arg;
119     }
120 
121     size_t maxLen = STR_MAX_LENGTH;
122     status = napi_get_value_string_utf8(env, in, NULL, 0, &maxLen);
123     if (maxLen == 0) {
124         return status;
125     }
126     char *buf = new (std::nothrow) char[maxLen + STR_TAIL_LENGTH];
127     if (buf != nullptr) {
128         size_t len = 0;
129         status = napi_get_value_string_utf8(env, in, buf, maxLen + STR_TAIL_LENGTH, &len);
130         if (status == napi_ok) {
131             buf[len] = 0;
132             out = std::string(buf);
133         }
134         delete[] buf;
135     } else {
136         status = napi_generic_failure;
137     }
138     return status;
139 }
140 
SetValue(napi_env env,const std::string & in,napi_value & out)141 napi_status NapiDataUtils::SetValue(napi_env env, const std::string &in, napi_value &out)
142 {
143     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value <- std::string %{public}d", (int)in.length());
144     return napi_create_string_utf8(env, in.c_str(), in.size(), &out);
145 }
146 
147 /* napi_value <-> std::vector<std::string> */
GetValue(napi_env env,napi_value in,std::vector<std::string> & out)148 napi_status NapiDataUtils::GetValue(napi_env env, napi_value in, std::vector<std::string> &out)
149 {
150     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value -> std::vector<std::string>");
151     bool isArray = false;
152     napi_is_array(env, in, &isArray);
153     if (!isArray) {
154         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "napi_value is not an array");
155         return napi_invalid_arg;
156     }
157 
158     uint32_t length = 0;
159     napi_status status = napi_get_array_length(env, in, &length);
160     if (!((status == napi_ok) && (length > 0))) {
161         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "get_array failed, status=%{public}d length=%{public}u",
162             status, length);
163         return napi_invalid_arg;
164     }
165     for (uint32_t i = 0; i < length; ++i) {
166         napi_value item = nullptr;
167         status = napi_get_element(env, in, i, &item);
168         if (!((item != nullptr) && (status == napi_ok))) {
169             PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "napi_get_element failed, status=%{public}d", status);
170             return napi_invalid_arg;
171         }
172         std::string value;
173         status = GetValue(env, item, value);
174         if (status != napi_ok) {
175             PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "napi_value is nota string, status=%{public}d", status);
176             return napi_invalid_arg;
177         }
178         out.push_back(value);
179     }
180     return status;
181 }
182 
SetValue(napi_env env,const std::vector<std::string> & in,napi_value & out)183 napi_status NapiDataUtils::SetValue(napi_env env, const std::vector<std::string> &in, napi_value &out)
184 {
185     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value <- std::vector<std::string>");
186     napi_status status = napi_create_array_with_length(env, in.size(), &out);
187     if (status != napi_ok) {
188         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "create array failed, status=%{public}d", status);
189         return status;
190     }
191     int index = 0;
192     for (auto &item : in) {
193         napi_value element = nullptr;
194         SetValue(env, item, element);
195         status = napi_set_element(env, out, index++, element);
196         if (status != napi_ok) {
197             PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "napi_set_element failed, status=%{public}d", status);
198             return status;
199         }
200     }
201     return status;
202 }
203 
204 /* napi_value <-> std::vector<uint8_t> */
GetValue(napi_env env,napi_value in,std::vector<uint8_t> & out)205 napi_status NapiDataUtils::GetValue(napi_env env, napi_value in, std::vector<uint8_t> &out)
206 {
207     out.clear();
208     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value -> std::vector<uint8_t> ");
209     napi_typedarray_type type = napi_biguint64_array;
210     size_t length = 0;
211     napi_value buffer = nullptr;
212     size_t offset = 0;
213     void *data = nullptr;
214     napi_status status = napi_get_typedarray_info(env, in, &type, &length, &data, &buffer, &offset);
215     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI,
216         "array type=%{public}d length=%{public}d offset=%{public}d  status=%{public}d",
217         (int)type, (int)length, (int)offset, status);
218     if (!((status == napi_ok) && (length > 0) && (type == napi_uint8_array) && (data != nullptr))) {
219         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI,
220             "array type=%{public}d length=%{public}d status=%{public}d",
221             static_cast<int32_t>(type), static_cast<int32_t>(length), status);
222         return napi_invalid_arg;
223     }
224     out.assign(reinterpret_cast<uint8_t *>(data), reinterpret_cast<uint8_t *>(data) + length);
225     return status;
226 }
227 
SetValue(napi_env env,const std::vector<uint8_t> & in,napi_value & out)228 napi_status NapiDataUtils::SetValue(napi_env env, const std::vector<uint8_t> &in, napi_value &out)
229 {
230     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value <- std::vector<uint8_t> ");
231     if (in.size() <= 0) {
232         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "invalid std::vector<uint8_t>");
233         return napi_invalid_arg;
234     }
235     void *data = nullptr;
236     napi_value buffer = nullptr;
237     napi_status status = napi_create_arraybuffer(env, in.size(), &data, &buffer);
238     if (status != napi_ok) {
239         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "create array buffer failed, status=%{public}d", status);
240         return status;
241     }
242 
243     if (memcpy_s(data, in.size(), in.data(), in.size()) != EOK) {
244         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "memcpy_s not EOK");
245         return napi_invalid_arg;
246     }
247     status = napi_create_typedarray(env, napi_uint8_array, in.size(), buffer, 0, &out);
248     if (status != napi_ok) {
249         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI,
250             "napi_value <- std::vector<uint8_t> invalid value, status=%{public}d", status);
251         return status;
252     }
253     return status;
254 }
255 
256 /* napi_value <-> std::map<std::string, int32_t> */
GetValue(napi_env env,napi_value in,std::map<std::string,int32_t> & out)257 napi_status NapiDataUtils::GetValue(napi_env env, napi_value in, std::map<std::string, int32_t> &out)
258 {
259     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value -> std::map<std::string, int32_t> ");
260     (void)(env);
261     (void)(in);
262     (void)(out);
263     PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "std::map<std::string, uint32_t> from napi_value, unsupported!");
264     return napi_invalid_arg;
265 }
266 
SetValue(napi_env env,const std::map<std::string,int32_t> & in,napi_value & out)267 napi_status NapiDataUtils::SetValue(napi_env env, const std::map<std::string, int32_t> &in, napi_value &out)
268 {
269     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value <- std::map<std::string, int32_t> ");
270     napi_status status = napi_create_array_with_length(env, in.size(), &out);
271     if (status != napi_ok) {
272         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "invalid object, status=%{public}d", status);
273         return status;
274     }
275     int index = 0;
276     for (const auto &[key, value] : in) {
277         napi_value element = nullptr;
278         napi_create_array_with_length(env, TUPLE_SIZE, &element);
279         napi_value jsKey = nullptr;
280         napi_create_string_utf8(env, key.c_str(), key.size(), &jsKey);
281         napi_set_element(env, element, TUPLE_KEY, jsKey);
282         napi_value jsValue = nullptr;
283         napi_create_int32(env, static_cast<int32_t>(value), &jsValue);
284         napi_set_element(env, element, TUPLE_VALUE, jsValue);
285         napi_set_element(env, out, index++, element);
286     }
287     return status;
288 }
289 
290 /* napi_value <-> std::map<std::string, int64_t> */
GetValue(napi_env env,napi_value in,std::map<std::string,int64_t> & out)291 napi_status NapiDataUtils::GetValue(napi_env env, napi_value in, std::map<std::string, int64_t> &out)
292 {
293     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value -> std::map<std::string, int64_t> ");
294     (void)(env);
295     (void)(in);
296     (void)(out);
297     PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "std::map<std::string, int64_t> from napi_value, unsupported!");
298     return napi_invalid_arg;
299 }
300 
SetValue(napi_env env,const std::map<std::string,int64_t> & in,napi_value & out)301 napi_status NapiDataUtils::SetValue(napi_env env, const std::map<std::string, int64_t> &in, napi_value &out)
302 {
303     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value <- std::map<std::string, int64_t> ");
304     napi_status status = napi_create_array_with_length(env, in.size(), &out);
305     if (status != napi_ok) {
306         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "invalid object, status=%{public}d", status);
307         return status;
308     }
309     int index = 0;
310     for (const auto &[key, value] : in) {
311         napi_value element = nullptr;
312         napi_create_array_with_length(env, TUPLE_SIZE, &element);
313         napi_value jsKey = nullptr;
314         napi_create_string_utf8(env, key.c_str(), key.size(), &jsKey);
315         napi_set_element(env, element, TUPLE_KEY, jsKey);
316         napi_value jsValue = nullptr;
317         napi_create_int64(env, static_cast<int64_t>(value), &jsValue);
318         napi_set_element(env, element, TUPLE_VALUE, jsValue);
319         napi_set_element(env, out, index++, element);
320     }
321     return status;
322 }
323 
GetValue(napi_env env,napi_value in,std::shared_ptr<OHOS::Media::PixelMap> & pixelMap)324 napi_status NapiDataUtils::GetValue(napi_env env, napi_value in, std::shared_ptr<OHOS::Media::PixelMap> &pixelMap)
325 {
326     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value -> std::shared_ptr<OHOS::Media::PixelMap>");
327     pixelMap = OHOS::Media::PixelMapNapi::GetPixelMap(env, in);
328     return napi_ok;
329 }
330 
SetValue(napi_env env,const std::shared_ptr<OHOS::Media::PixelMap> & in,napi_value & out)331 napi_status NapiDataUtils::SetValue(napi_env env, const std::shared_ptr<OHOS::Media::PixelMap> &in, napi_value &out)
332 {
333     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value <- std::shared_ptr<OHOS::Media::PixelMap>");
334     out = OHOS::Media::PixelMapNapi::CreatePixelMap(env, in);
335     return napi_ok;
336 }
337 
GetValue(napi_env env,napi_value in,std::shared_ptr<OHOS::AAFwk::Want> & wantPtr)338 napi_status NapiDataUtils::GetValue(napi_env env, napi_value in, std::shared_ptr<OHOS::AAFwk::Want> &wantPtr)
339 {
340     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value -> std::shared_ptr<OHOS::AAFwk::Want>");
341     OHOS::AAFwk::Want want;
342     AppExecFwk::UnwrapWant(env, in, want);
343     wantPtr = std::make_shared<OHOS::AAFwk::Want>(want);
344     return napi_ok;
345 }
346 
SetValue(napi_env env,const std::shared_ptr<OHOS::AAFwk::Want> & in,napi_value & out)347 napi_status NapiDataUtils::SetValue(napi_env env, const std::shared_ptr<OHOS::AAFwk::Want> &in, napi_value &out)
348 {
349     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value <- std::shared_ptr<OHOS::AAFwk::Want>");
350     if (in == nullptr) {
351         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "SetValue in is nullptr");
352         return napi_invalid_arg;
353     }
354     out = OHOS::AppExecFwk::WrapWant(env, *in);
355     return napi_ok;
356 }
357 
GetValue(napi_env env,napi_value in,std::shared_ptr<UDMF::Object> & object)358 napi_status NapiDataUtils::GetValue(napi_env env, napi_value in, std::shared_ptr<UDMF::Object> &object)
359 {
360     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value -> std::GetValue Object");
361     napi_value attributeNames = nullptr;
362     NAPI_CALL_BASE(env, napi_get_property_names(env, in, &attributeNames), napi_invalid_arg);
363     uint32_t attributesNum = 0;
364     NAPI_CALL_BASE(env, napi_get_array_length(env, attributeNames, &attributesNum), napi_invalid_arg);
365     for (uint32_t i = 0; i < attributesNum; i++) {
366         napi_value attributeNameNapi = nullptr;
367         NAPI_CALL_BASE(env, napi_get_element(env, attributeNames, i, &attributeNameNapi), napi_invalid_arg);
368         size_t len = 0;
369         char str[STR_MAX_SIZE] = { 0 };
370         NAPI_CALL_BASE(env, napi_get_value_string_utf8(
371             env, attributeNameNapi, str, STR_MAX_SIZE, &len), napi_invalid_arg);
372         std::string attributeName = str;
373         napi_value attributeValueNapi = nullptr;
374         NAPI_CALL_BASE(env, napi_get_named_property(env, in, str, &attributeValueNapi), napi_invalid_arg);
375 
376         bool isArrayBuffer = false;
377         NAPI_CALL_BASE(env, napi_is_arraybuffer(env, attributeValueNapi, &isArrayBuffer), napi_invalid_arg);
378         if (isArrayBuffer) {
379             void *data = nullptr;
380             size_t dataLen = 0;
381             NAPI_CALL_BASE(env, napi_get_arraybuffer_info(env, attributeValueNapi, &data, &dataLen), napi_invalid_arg);
382             object->value_[attributeName] = std::vector<uint8_t>(
383                 reinterpret_cast<uint8_t *>(data), reinterpret_cast<uint8_t *>(data) + dataLen);
384             continue;
385         }
386         napi_valuetype valueType = napi_undefined;
387         NAPI_CALL_BASE(env, napi_typeof(env, attributeValueNapi, &valueType), napi_invalid_arg);
388         switch (valueType) {
389             case napi_valuetype::napi_object:
390                 object->value_[attributeName] = std::make_shared<UDMF::Object>();
391                 break;
392             case napi_valuetype::napi_number:
393                 object->value_[attributeName] = double();
394                 break;
395             case napi_valuetype::napi_string:
396                 object->value_[attributeName] = std::string();
397                 break;
398             case napi_valuetype::napi_boolean:
399                 object->value_[attributeName] = bool();
400                 break;
401             case napi_valuetype::napi_undefined:
402                 object->value_[attributeName] = std::monostate();
403                 break;
404             case napi_valuetype::napi_null:
405                 object->value_[attributeName] = nullptr;
406                 break;
407             default:
408                 return napi_invalid_arg;
409         }
410         napi_status status = napi_ok;
411         std::visit([&](auto &value) {status = NapiDataUtils::GetValue(env, attributeValueNapi, value);},
412             object->value_[attributeName]);
413         if (status != napi_ok) {
414             return status;
415         }
416     }
417     return napi_ok;
418 }
419 
SetValue(napi_env env,const std::shared_ptr<UDMF::Object> & object,napi_value & out)420 napi_status NapiDataUtils::SetValue(napi_env env, const std::shared_ptr<UDMF::Object> &object, napi_value &out)
421 {
422     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value -> std::GetValue Object");
423     napi_create_object(env, &out);
424     for (auto &[key, value] : object->value_) {
425         napi_value valueNapi = nullptr;
426         if (std::holds_alternative<std::vector<uint8_t>>(value)) {
427             auto array = std::get<std::vector<uint8_t>>(value);
428             void *data = nullptr;
429             size_t len = array.size();
430             NAPI_CALL_BASE(env, napi_create_arraybuffer(env, len, &data, &valueNapi), napi_generic_failure);
431             if (memcpy_s(data, len, reinterpret_cast<const void *>(array.data()), len) != 0) {
432                 PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "memcpy_s failed");
433                 return napi_generic_failure;
434             }
435         } else {
436             std::visit([&](const auto &value) {NapiDataUtils::SetValue(env, value, valueNapi);}, value);
437         }
438         napi_set_named_property(env, out, key.c_str(), valueNapi);
439     }
440     return napi_ok;
441 }
442 
GetValue(napi_env env,napi_value in,std::monostate & out)443 napi_status NapiDataUtils::GetValue(napi_env env, napi_value in, std::monostate &out)
444 {
445     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value -> std::monostate");
446     out = std::monostate{};
447     return napi_ok;
448 }
449 
SetValue(napi_env env,const std::monostate & in,napi_value & out)450 napi_status NapiDataUtils::SetValue(napi_env env, const std::monostate &in, napi_value &out)
451 {
452     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value <- std::monostate");
453     return napi_get_undefined(env, &out);
454 }
455 
GetValue(napi_env env,napi_value in,nullptr_t & out)456 napi_status NapiDataUtils::GetValue(napi_env env, napi_value in, nullptr_t &out)
457 {
458     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value -> null");
459     out = nullptr;
460     return napi_ok;
461 }
462 
SetValue(napi_env env,const nullptr_t & in,napi_value & out)463 napi_status NapiDataUtils::SetValue(napi_env env, const nullptr_t &in, napi_value &out)
464 {
465     PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI, "napi_value <- null");
466     return napi_get_null(env, &out);
467 }
468 
IsTypeForNapiValue(napi_env env,napi_value param,napi_valuetype expectType)469 bool NapiDataUtils::IsTypeForNapiValue(napi_env env, napi_value param, napi_valuetype expectType)
470 {
471     napi_valuetype valueType = napi_undefined;
472 
473     if (param == nullptr) {
474         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "param is null");
475         return false;
476     }
477 
478     if (napi_typeof(env, param, &valueType) != napi_ok) {
479         PASTEBOARD_HILOGE(PASTEBOARD_MODULE_JS_NAPI, "get value type failed");
480         return false;
481     }
482 
483     return valueType == expectType;
484 }
485 
IsNull(napi_env env,napi_value value)486 bool NapiDataUtils::IsNull(napi_env env, napi_value value)
487 {
488     napi_valuetype type = napi_undefined;
489     napi_status status = napi_typeof(env, value, &type);
490     if (status == napi_ok && (type == napi_undefined || type == napi_null)) {
491         return true;
492     }
493     if (type == napi_string) {
494         size_t len;
495         napi_get_value_string_utf8(env, value, NULL, 0, &len);
496         return len == 0;
497     }
498     return false;
499 }
500 
DefineClass(napi_env env,const std::string & name,const napi_property_descriptor * properties,size_t count,napi_callback newCb)501 napi_value NapiDataUtils::DefineClass(napi_env env, const std::string &name,
502     const napi_property_descriptor *properties, size_t count, napi_callback newCb)
503 {
504     // base64("data.udmf") as rootPropName, i.e. global.<root>
505     const std::string rootPropName = "ZGF0YS51ZG1m";
506     napi_value root = nullptr;
507     bool hasRoot = false;
508     napi_value global = nullptr;
509     napi_get_global(env, &global);
510     napi_has_named_property(env, global, rootPropName.c_str(), &hasRoot);
511     if (hasRoot) {
512         napi_get_named_property(env, global, rootPropName.c_str(), &root);
513     } else {
514         napi_create_object(env, &root);
515         napi_set_named_property(env, global, rootPropName.c_str(), root);
516     }
517 
518     std::string propName = "constructor_of_" + name;
519     napi_value constructor = nullptr;
520     bool hasProp = false;
521     napi_has_named_property(env, root, propName.c_str(), &hasProp);
522     if (hasProp) {
523         napi_get_named_property(env, root, propName.c_str(), &constructor);
524         if (constructor != nullptr) {
525             PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI,
526                 "got data.distributeddata.%{public}s as constructor", propName.c_str());
527             return constructor;
528         }
529         hasProp = false; // no constructor.
530     }
531 
532     NAPI_CALL_BASE(env,
533         napi_define_class(env, name.c_str(), name.size(), newCb, nullptr, count, properties, &constructor),
534         nullptr);
535     NAPI_ASSERT(env, constructor != nullptr, "napi_define_class failed!");
536 
537     if (!hasProp) {
538         napi_set_named_property(env, root, propName.c_str(), constructor);
539         PASTEBOARD_HILOGD(PASTEBOARD_MODULE_JS_NAPI,
540             "save constructor to data.distributeddata.%{public}s", propName.c_str());
541     }
542     return constructor;
543 }
544 } // namespace MiscServicesNapi
545 } // namespace OHOS
546