15bebb993Sopenharmony_ci/*
25bebb993Sopenharmony_ci * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
35bebb993Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
45bebb993Sopenharmony_ci * you may not use this file except in compliance with the License.
55bebb993Sopenharmony_ci * You may obtain a copy of the License at
65bebb993Sopenharmony_ci *
75bebb993Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
85bebb993Sopenharmony_ci *
95bebb993Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
105bebb993Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
115bebb993Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
125bebb993Sopenharmony_ci * See the License for the specific language governing permissions and
135bebb993Sopenharmony_ci * limitations under the License.
145bebb993Sopenharmony_ci */
155bebb993Sopenharmony_ci
165bebb993Sopenharmony_ci#include "n_val.h"
175bebb993Sopenharmony_ci
185bebb993Sopenharmony_ci#include <string>
195bebb993Sopenharmony_ci
205bebb993Sopenharmony_ci#include "file_utils.h"
215bebb993Sopenharmony_ci#include "filemgmt_libhilog.h"
225bebb993Sopenharmony_ci#include "n_error.h"
235bebb993Sopenharmony_ci
245bebb993Sopenharmony_cinamespace OHOS {
255bebb993Sopenharmony_cinamespace FileManagement {
265bebb993Sopenharmony_cinamespace LibN {
275bebb993Sopenharmony_ciusing namespace std;
285bebb993Sopenharmony_ci
295bebb993Sopenharmony_ciNVal::NVal(napi_env nEnv, napi_value nVal = nullptr) : env_(nEnv), val_(nVal) {}
305bebb993Sopenharmony_ci
315bebb993Sopenharmony_ciNVal::operator bool() const
325bebb993Sopenharmony_ci{
335bebb993Sopenharmony_ci    return env_ && val_;
345bebb993Sopenharmony_ci}
355bebb993Sopenharmony_ci
365bebb993Sopenharmony_cibool NVal::TypeIs(napi_valuetype expType) const
375bebb993Sopenharmony_ci{
385bebb993Sopenharmony_ci    if (!*this) {
395bebb993Sopenharmony_ci        return false;
405bebb993Sopenharmony_ci    }
415bebb993Sopenharmony_ci    napi_valuetype valueType;
425bebb993Sopenharmony_ci    napi_typeof(env_, val_, &valueType);
435bebb993Sopenharmony_ci
445bebb993Sopenharmony_ci    if (expType != valueType) {
455bebb993Sopenharmony_ci        return false;
465bebb993Sopenharmony_ci    }
475bebb993Sopenharmony_ci    return true;
485bebb993Sopenharmony_ci}
495bebb993Sopenharmony_ci
505bebb993Sopenharmony_cibool NVal::TypeIsError(bool checkErrno) const
515bebb993Sopenharmony_ci{
525bebb993Sopenharmony_ci    if (!*this) {
535bebb993Sopenharmony_ci        return false;
545bebb993Sopenharmony_ci    }
555bebb993Sopenharmony_ci
565bebb993Sopenharmony_ci    bool res = false;
575bebb993Sopenharmony_ci    napi_is_error(env_, val_, &res);
585bebb993Sopenharmony_ci
595bebb993Sopenharmony_ci    return res;
605bebb993Sopenharmony_ci}
615bebb993Sopenharmony_ci
625bebb993Sopenharmony_cistd::tuple<bool, std::unique_ptr<char[]>, size_t> NVal::ToUTF8StringPath() const
635bebb993Sopenharmony_ci{
645bebb993Sopenharmony_ci    auto [succ, path, strLen] = ToUTF8String();
655bebb993Sopenharmony_ci    if (succ == false || std::strlen(path.get()) < strLen) {
665bebb993Sopenharmony_ci        return { false, nullptr, 0 };
675bebb993Sopenharmony_ci    }
685bebb993Sopenharmony_ci    return make_tuple(true, move(path), strLen);
695bebb993Sopenharmony_ci}
705bebb993Sopenharmony_ci
715bebb993Sopenharmony_cituple<bool, unique_ptr<char[]>, size_t> NVal::ToUTF8String() const
725bebb993Sopenharmony_ci{
735bebb993Sopenharmony_ci    size_t strLen = 0;
745bebb993Sopenharmony_ci    napi_status status = napi_get_value_string_utf8(env_, val_, nullptr, -1, &strLen);
755bebb993Sopenharmony_ci    if (status != napi_ok) {
765bebb993Sopenharmony_ci        return { false, nullptr, 0 };
775bebb993Sopenharmony_ci    }
785bebb993Sopenharmony_ci    if (strLen == std::numeric_limits<size_t>::max()) {
795bebb993Sopenharmony_ci        HILOGE("string is too long");
805bebb993Sopenharmony_ci        return { false, nullptr, 0 };
815bebb993Sopenharmony_ci    }
825bebb993Sopenharmony_ci    size_t bufLen = strLen + 1;
835bebb993Sopenharmony_ci    auto str = CreateUniquePtr<char[]>(bufLen);
845bebb993Sopenharmony_ci    if (str == nullptr) {
855bebb993Sopenharmony_ci        return { false, nullptr, 0 };
865bebb993Sopenharmony_ci    }
875bebb993Sopenharmony_ci    status = napi_get_value_string_utf8(env_, val_, str.get(), bufLen, &strLen);
885bebb993Sopenharmony_ci    if (str == nullptr) {
895bebb993Sopenharmony_ci        return { false, nullptr, 0 };
905bebb993Sopenharmony_ci    }
915bebb993Sopenharmony_ci    return make_tuple(status == napi_ok, move(str), strLen);
925bebb993Sopenharmony_ci}
935bebb993Sopenharmony_ci
945bebb993Sopenharmony_cituple<bool, unique_ptr<char[]>, size_t> NVal::ToUTF8String(string defaultValue) const
955bebb993Sopenharmony_ci{
965bebb993Sopenharmony_ci    if (TypeIs(napi_undefined) || TypeIs(napi_function)) {
975bebb993Sopenharmony_ci        auto str = CreateUniquePtr<char[]>(defaultValue.size() + 1);
985bebb993Sopenharmony_ci        if (str == nullptr) {
995bebb993Sopenharmony_ci            return { false, nullptr, 0 };
1005bebb993Sopenharmony_ci        }
1015bebb993Sopenharmony_ci        copy(defaultValue.begin(), defaultValue.end(), str.get());
1025bebb993Sopenharmony_ci        str[defaultValue.size()] = '\0';
1035bebb993Sopenharmony_ci        return make_tuple(true, move(str), defaultValue.size());
1045bebb993Sopenharmony_ci    }
1055bebb993Sopenharmony_ci    return ToUTF8String();
1065bebb993Sopenharmony_ci}
1075bebb993Sopenharmony_ci
1085bebb993Sopenharmony_cituple<bool, unique_ptr<char[]>, size_t> NVal::ToUTF16String() const
1095bebb993Sopenharmony_ci{
1105bebb993Sopenharmony_ci#ifdef FILE_SUBSYSTEM_DEBUG_LOCAL
1115bebb993Sopenharmony_ci    size_t strLen = 0;
1125bebb993Sopenharmony_ci    napi_status status = napi_get_value_string_utf16(env_, val_, nullptr, -1, &strLen);
1135bebb993Sopenharmony_ci    if (status != napi_ok) {
1145bebb993Sopenharmony_ci        return { false, nullptr, 0 };
1155bebb993Sopenharmony_ci    }
1165bebb993Sopenharmony_ci
1175bebb993Sopenharmony_ci    auto str = CreateUniquePtr<char16_t[]>(++strLen);
1185bebb993Sopenharmony_ci    if (str == nullptr) {
1195bebb993Sopenharmony_ci        return { false, nullptr, 0 };
1205bebb993Sopenharmony_ci    }
1215bebb993Sopenharmony_ci    status = napi_get_value_string_utf16(env_, val_, str.get(), strLen, nullptr);
1225bebb993Sopenharmony_ci    if (status != napi_ok) {
1235bebb993Sopenharmony_ci        return { false, nullptr, 0 };
1245bebb993Sopenharmony_ci    }
1255bebb993Sopenharmony_ci
1265bebb993Sopenharmony_ci    strLen = reinterpret_cast<char *>(str.get() + strLen) - reinterpret_cast<char *>(str.get());
1275bebb993Sopenharmony_ci    auto strRet = unique_ptr<char[]>(reinterpret_cast<char *>(str.release()));
1285bebb993Sopenharmony_ci    return {true, move(strRet), strLen};
1295bebb993Sopenharmony_ci#else
1305bebb993Sopenharmony_ci    // Note that quickjs doesn't support utf16
1315bebb993Sopenharmony_ci    return ToUTF8String();
1325bebb993Sopenharmony_ci#endif
1335bebb993Sopenharmony_ci}
1345bebb993Sopenharmony_ci
1355bebb993Sopenharmony_cituple<bool, void *> NVal::ToPointer() const
1365bebb993Sopenharmony_ci{
1375bebb993Sopenharmony_ci    void *res = nullptr;
1385bebb993Sopenharmony_ci    napi_status status = napi_get_value_external(env_, val_, &res);
1395bebb993Sopenharmony_ci    return make_tuple(status == napi_ok, res);
1405bebb993Sopenharmony_ci}
1415bebb993Sopenharmony_ci
1425bebb993Sopenharmony_cituple<bool, bool> NVal::ToBool() const
1435bebb993Sopenharmony_ci{
1445bebb993Sopenharmony_ci    bool flag = false;
1455bebb993Sopenharmony_ci    napi_status status = napi_get_value_bool(env_, val_, &flag);
1465bebb993Sopenharmony_ci    return make_tuple(status == napi_ok, flag);
1475bebb993Sopenharmony_ci}
1485bebb993Sopenharmony_ci
1495bebb993Sopenharmony_cituple<bool, bool> NVal::ToBool(bool defaultValue) const
1505bebb993Sopenharmony_ci{
1515bebb993Sopenharmony_ci    if (TypeIs(napi_undefined) || TypeIs(napi_function)) {
1525bebb993Sopenharmony_ci        return make_tuple(true, defaultValue);
1535bebb993Sopenharmony_ci    }
1545bebb993Sopenharmony_ci    return ToBool();
1555bebb993Sopenharmony_ci}
1565bebb993Sopenharmony_ci
1575bebb993Sopenharmony_cituple<bool, int32_t> NVal::ToInt32() const
1585bebb993Sopenharmony_ci{
1595bebb993Sopenharmony_ci    int32_t res = 0;
1605bebb993Sopenharmony_ci    napi_status status = napi_get_value_int32(env_, val_, &res);
1615bebb993Sopenharmony_ci    return make_tuple(status == napi_ok, res);
1625bebb993Sopenharmony_ci}
1635bebb993Sopenharmony_ci
1645bebb993Sopenharmony_cituple<bool, int32_t> NVal::ToInt32(int32_t defaultValue) const
1655bebb993Sopenharmony_ci{
1665bebb993Sopenharmony_ci    if (TypeIs(napi_undefined) || TypeIs(napi_function)) {
1675bebb993Sopenharmony_ci        return make_tuple(true, defaultValue);
1685bebb993Sopenharmony_ci    }
1695bebb993Sopenharmony_ci    return ToInt32();
1705bebb993Sopenharmony_ci}
1715bebb993Sopenharmony_ci
1725bebb993Sopenharmony_cituple<bool, int64_t> NVal::ToInt64() const
1735bebb993Sopenharmony_ci{
1745bebb993Sopenharmony_ci    int64_t res = 0;
1755bebb993Sopenharmony_ci    napi_status status = napi_get_value_int64(env_, val_, &res);
1765bebb993Sopenharmony_ci    return make_tuple(status == napi_ok, res);
1775bebb993Sopenharmony_ci}
1785bebb993Sopenharmony_ci
1795bebb993Sopenharmony_cituple<bool, int64_t> NVal::ToInt64(int64_t defaultValue) const
1805bebb993Sopenharmony_ci{
1815bebb993Sopenharmony_ci    if (TypeIs(napi_undefined) || TypeIs(napi_function)) {
1825bebb993Sopenharmony_ci        return make_tuple(true, defaultValue);
1835bebb993Sopenharmony_ci    }
1845bebb993Sopenharmony_ci    return ToInt64();
1855bebb993Sopenharmony_ci}
1865bebb993Sopenharmony_ci
1875bebb993Sopenharmony_cituple<bool, double> NVal::ToDouble() const
1885bebb993Sopenharmony_ci{
1895bebb993Sopenharmony_ci    double res = 0;
1905bebb993Sopenharmony_ci    napi_status status = napi_get_value_double(env_, val_, &res);
1915bebb993Sopenharmony_ci    return make_tuple(status == napi_ok, res);
1925bebb993Sopenharmony_ci}
1935bebb993Sopenharmony_ci
1945bebb993Sopenharmony_cituple<bool, uint32_t> NVal::ToUint32() const
1955bebb993Sopenharmony_ci{
1965bebb993Sopenharmony_ci    uint32_t res = 0;
1975bebb993Sopenharmony_ci    napi_status status = napi_get_value_uint32(env_, val_, &res);
1985bebb993Sopenharmony_ci    return make_tuple(status == napi_ok, res);
1995bebb993Sopenharmony_ci}
2005bebb993Sopenharmony_ci
2015bebb993Sopenharmony_cituple<bool, uint64_t, bool> NVal::ToUint64() const
2025bebb993Sopenharmony_ci{
2035bebb993Sopenharmony_ci    uint64_t res = 0;
2045bebb993Sopenharmony_ci    bool lossless = false;
2055bebb993Sopenharmony_ci    napi_status status = napi_get_value_bigint_uint64(env_, val_, &res, &lossless);
2065bebb993Sopenharmony_ci    return make_tuple(status == napi_ok, res, lossless);
2075bebb993Sopenharmony_ci}
2085bebb993Sopenharmony_ci
2095bebb993Sopenharmony_cituple<bool, vector<string>, uint32_t> NVal::ToStringArray()
2105bebb993Sopenharmony_ci{
2115bebb993Sopenharmony_ci    napi_status status;
2125bebb993Sopenharmony_ci    uint32_t size = 0;
2135bebb993Sopenharmony_ci    status = napi_get_array_length(env_, val_, &size);
2145bebb993Sopenharmony_ci    vector<string> stringArray;
2155bebb993Sopenharmony_ci    napi_value result;
2165bebb993Sopenharmony_ci    for (uint32_t i = 0; i < size; i++) {
2175bebb993Sopenharmony_ci        status = napi_get_element(env_, val_, i, &result);
2185bebb993Sopenharmony_ci        auto [succ, str, ignore] = NVal(env_, result).ToUTF8String();
2195bebb993Sopenharmony_ci        stringArray.push_back(string(str.get()));
2205bebb993Sopenharmony_ci    }
2215bebb993Sopenharmony_ci    return make_tuple(status == napi_ok, stringArray, size);
2225bebb993Sopenharmony_ci}
2235bebb993Sopenharmony_ci
2245bebb993Sopenharmony_cituple<bool, void *, size_t> NVal::ToArraybuffer() const
2255bebb993Sopenharmony_ci{
2265bebb993Sopenharmony_ci    void *buf = nullptr;
2275bebb993Sopenharmony_ci    size_t bufLen = 0;
2285bebb993Sopenharmony_ci    bool status = napi_get_arraybuffer_info(env_, val_, &buf, &bufLen);
2295bebb993Sopenharmony_ci    return make_tuple(status == napi_ok, buf, bufLen);
2305bebb993Sopenharmony_ci}
2315bebb993Sopenharmony_ci
2325bebb993Sopenharmony_cituple<bool, void *, size_t> NVal::ToTypedArray() const
2335bebb993Sopenharmony_ci{
2345bebb993Sopenharmony_ci    napi_typedarray_type type;
2355bebb993Sopenharmony_ci    napi_value in_array_buffer = nullptr;
2365bebb993Sopenharmony_ci    size_t byte_offset;
2375bebb993Sopenharmony_ci    size_t length;
2385bebb993Sopenharmony_ci    void *data = nullptr;
2395bebb993Sopenharmony_ci    napi_status status =
2405bebb993Sopenharmony_ci        napi_get_typedarray_info(env_, val_, &type, &length, (void **)&data, &in_array_buffer, &byte_offset);
2415bebb993Sopenharmony_ci    return make_tuple(status == napi_ok, data, length);
2425bebb993Sopenharmony_ci}
2435bebb993Sopenharmony_ci
2445bebb993Sopenharmony_cibool NVal::HasProp(string propName) const
2455bebb993Sopenharmony_ci{
2465bebb993Sopenharmony_ci    bool res = false;
2475bebb993Sopenharmony_ci
2485bebb993Sopenharmony_ci    if (!env_ || !val_ || !TypeIs(napi_object)) {
2495bebb993Sopenharmony_ci        return false;
2505bebb993Sopenharmony_ci    }
2515bebb993Sopenharmony_ci
2525bebb993Sopenharmony_ci    napi_status status = napi_has_named_property(env_, val_, propName.c_str(), &res);
2535bebb993Sopenharmony_ci    return (status == napi_ok) && res;
2545bebb993Sopenharmony_ci}
2555bebb993Sopenharmony_ci
2565bebb993Sopenharmony_ci#ifdef WIN_PLATFORM
2575bebb993Sopenharmony_ciNVal NVal::GetPropValue(string propName) const
2585bebb993Sopenharmony_ci#else
2595bebb993Sopenharmony_ciNVal NVal::GetProp(string propName) const
2605bebb993Sopenharmony_ci#endif
2615bebb993Sopenharmony_ci{
2625bebb993Sopenharmony_ci    if (!HasProp(propName)) {
2635bebb993Sopenharmony_ci        return {env_, nullptr};
2645bebb993Sopenharmony_ci    }
2655bebb993Sopenharmony_ci
2665bebb993Sopenharmony_ci    napi_value prop = nullptr;
2675bebb993Sopenharmony_ci    napi_status status = napi_get_named_property(env_, val_, propName.c_str(), &prop);
2685bebb993Sopenharmony_ci    if (status != napi_ok) {
2695bebb993Sopenharmony_ci        return {env_, nullptr};
2705bebb993Sopenharmony_ci    }
2715bebb993Sopenharmony_ci    return NVal(env_, prop);
2725bebb993Sopenharmony_ci}
2735bebb993Sopenharmony_ci
2745bebb993Sopenharmony_cibool NVal::AddProp(vector<napi_property_descriptor> &&propVec) const
2755bebb993Sopenharmony_ci{
2765bebb993Sopenharmony_ci    if (!TypeIs(napi_valuetype::napi_object)) {
2775bebb993Sopenharmony_ci        HILOGE("INNER BUG. Prop should only be added to objects");
2785bebb993Sopenharmony_ci        return false;
2795bebb993Sopenharmony_ci    }
2805bebb993Sopenharmony_ci
2815bebb993Sopenharmony_ci    napi_status status = napi_define_properties(env_, val_, propVec.size(), propVec.data());
2825bebb993Sopenharmony_ci    if (status != napi_ok) {
2835bebb993Sopenharmony_ci        HILOGE("INNER BUG. Cannot define properties because of %{public}d", status);
2845bebb993Sopenharmony_ci        return false;
2855bebb993Sopenharmony_ci    }
2865bebb993Sopenharmony_ci    return true;
2875bebb993Sopenharmony_ci}
2885bebb993Sopenharmony_ci
2895bebb993Sopenharmony_cibool NVal::AddProp(string propName, napi_value val) const
2905bebb993Sopenharmony_ci{
2915bebb993Sopenharmony_ci    if (!TypeIs(napi_valuetype::napi_object) || HasProp(propName)) {
2925bebb993Sopenharmony_ci        HILOGE("INNER BUG. Prop should only be added to objects");
2935bebb993Sopenharmony_ci        return false;
2945bebb993Sopenharmony_ci    }
2955bebb993Sopenharmony_ci
2965bebb993Sopenharmony_ci    napi_status status = napi_set_named_property(env_, val_, propName.c_str(), val);
2975bebb993Sopenharmony_ci    if (status != napi_ok) {
2985bebb993Sopenharmony_ci        HILOGE("INNER BUG. Cannot set named property because of %{public}d", status);
2995bebb993Sopenharmony_ci        return false;
3005bebb993Sopenharmony_ci    }
3015bebb993Sopenharmony_ci    return true;
3025bebb993Sopenharmony_ci}
3035bebb993Sopenharmony_ci
3045bebb993Sopenharmony_ciNVal NVal::CreateUndefined(napi_env env)
3055bebb993Sopenharmony_ci{
3065bebb993Sopenharmony_ci    napi_value res = nullptr;
3075bebb993Sopenharmony_ci    napi_get_undefined(env, &res);
3085bebb993Sopenharmony_ci    return {env, res};
3095bebb993Sopenharmony_ci}
3105bebb993Sopenharmony_ci
3115bebb993Sopenharmony_ciNVal NVal::CreateBigInt64(napi_env env, int64_t val)
3125bebb993Sopenharmony_ci{
3135bebb993Sopenharmony_ci    napi_value res = nullptr;
3145bebb993Sopenharmony_ci    napi_create_bigint_int64(env, val, &res);
3155bebb993Sopenharmony_ci    return { env, res };
3165bebb993Sopenharmony_ci}
3175bebb993Sopenharmony_ci
3185bebb993Sopenharmony_ciNVal NVal::CreateInt64(napi_env env, int64_t val)
3195bebb993Sopenharmony_ci{
3205bebb993Sopenharmony_ci    napi_value res = nullptr;
3215bebb993Sopenharmony_ci    napi_create_int64(env, val, &res);
3225bebb993Sopenharmony_ci    return {env, res};
3235bebb993Sopenharmony_ci}
3245bebb993Sopenharmony_ci
3255bebb993Sopenharmony_ciNVal NVal::CreateInt32(napi_env env, int32_t val)
3265bebb993Sopenharmony_ci{
3275bebb993Sopenharmony_ci    napi_value res = nullptr;
3285bebb993Sopenharmony_ci    napi_create_int32(env, val, &res);
3295bebb993Sopenharmony_ci    return {env, res};
3305bebb993Sopenharmony_ci}
3315bebb993Sopenharmony_ci
3325bebb993Sopenharmony_ciNVal NVal::CreateUint32(napi_env env, int32_t val)
3335bebb993Sopenharmony_ci{
3345bebb993Sopenharmony_ci    napi_value res = nullptr;
3355bebb993Sopenharmony_ci    napi_create_uint32(env, val, &res);
3365bebb993Sopenharmony_ci    return {env, res};
3375bebb993Sopenharmony_ci}
3385bebb993Sopenharmony_ci
3395bebb993Sopenharmony_ciNVal NVal::CreateObject(napi_env env)
3405bebb993Sopenharmony_ci{
3415bebb993Sopenharmony_ci    napi_value res = nullptr;
3425bebb993Sopenharmony_ci    napi_create_object(env, &res);
3435bebb993Sopenharmony_ci    return {env, res};
3445bebb993Sopenharmony_ci}
3455bebb993Sopenharmony_ci
3465bebb993Sopenharmony_ciNVal NVal::CreateBool(napi_env env, bool val)
3475bebb993Sopenharmony_ci{
3485bebb993Sopenharmony_ci    napi_value res = nullptr;
3495bebb993Sopenharmony_ci    napi_get_boolean(env, val, &res);
3505bebb993Sopenharmony_ci    return {env, res};
3515bebb993Sopenharmony_ci}
3525bebb993Sopenharmony_ci
3535bebb993Sopenharmony_ciNVal NVal::CreateUTF8String(napi_env env, std::string str)
3545bebb993Sopenharmony_ci{
3555bebb993Sopenharmony_ci    napi_value res = nullptr;
3565bebb993Sopenharmony_ci    napi_create_string_utf8(env, str.c_str(), str.length(), &res);
3575bebb993Sopenharmony_ci    return {env, res};
3585bebb993Sopenharmony_ci}
3595bebb993Sopenharmony_ci
3605bebb993Sopenharmony_ciNVal NVal::CreateUTF8String(napi_env env, const char *str, ssize_t len)
3615bebb993Sopenharmony_ci{
3625bebb993Sopenharmony_ci    napi_value res = nullptr;
3635bebb993Sopenharmony_ci    napi_create_string_utf8(env, str, len, &res);
3645bebb993Sopenharmony_ci    return {env, res};
3655bebb993Sopenharmony_ci}
3665bebb993Sopenharmony_ci
3675bebb993Sopenharmony_ciNVal NVal::CreateUint8Array(napi_env env, void *buf, size_t bufLen)
3685bebb993Sopenharmony_ci{
3695bebb993Sopenharmony_ci    napi_value output_buffer = nullptr;
3705bebb993Sopenharmony_ci    napi_create_external_arraybuffer(
3715bebb993Sopenharmony_ci        env, buf, bufLen, [](napi_env env, void *finalize_data, void *finalize_hint) { free(finalize_data); }, NULL,
3725bebb993Sopenharmony_ci        &output_buffer);
3735bebb993Sopenharmony_ci    napi_value output_array = nullptr;
3745bebb993Sopenharmony_ci    napi_create_typedarray(env, napi_uint8_array, bufLen, output_buffer, 0, &output_array);
3755bebb993Sopenharmony_ci    return {env, output_array};
3765bebb993Sopenharmony_ci}
3775bebb993Sopenharmony_ci
3785bebb993Sopenharmony_ciNVal NVal::CreateArrayString(napi_env env, vector<string> strs)
3795bebb993Sopenharmony_ci{
3805bebb993Sopenharmony_ci    napi_value res = nullptr;
3815bebb993Sopenharmony_ci    napi_create_array(env, &res);
3825bebb993Sopenharmony_ci    for (size_t i = 0; i < strs.size(); i++) {
3835bebb993Sopenharmony_ci        napi_value filename;
3845bebb993Sopenharmony_ci        napi_create_string_utf8(env, strs[i].c_str(), strs[i].length(), &filename);
3855bebb993Sopenharmony_ci        napi_set_element(env, res, i, filename);
3865bebb993Sopenharmony_ci    }
3875bebb993Sopenharmony_ci    return {env, res};
3885bebb993Sopenharmony_ci}
3895bebb993Sopenharmony_ci
3905bebb993Sopenharmony_cituple<NVal, void *> NVal::CreateArrayBuffer(napi_env env, size_t len)
3915bebb993Sopenharmony_ci{
3925bebb993Sopenharmony_ci    napi_value val;
3935bebb993Sopenharmony_ci    void *buf = nullptr;
3945bebb993Sopenharmony_ci    napi_create_arraybuffer(env, len, &buf, &val);
3955bebb993Sopenharmony_ci    return {{env, val}, {buf}};
3965bebb993Sopenharmony_ci}
3975bebb993Sopenharmony_ci
3985bebb993Sopenharmony_cinapi_property_descriptor NVal::DeclareNapiProperty(const char *name, napi_value val)
3995bebb993Sopenharmony_ci{
4005bebb993Sopenharmony_ci    return {(name), nullptr, nullptr, nullptr, nullptr, val, napi_default, nullptr};
4015bebb993Sopenharmony_ci}
4025bebb993Sopenharmony_ci
4035bebb993Sopenharmony_cinapi_property_descriptor NVal::DeclareNapiStaticProperty(const char *name, napi_value val)
4045bebb993Sopenharmony_ci{
4055bebb993Sopenharmony_ci    return {(name), nullptr, nullptr, nullptr, nullptr, val, napi_static, nullptr};
4065bebb993Sopenharmony_ci}
4075bebb993Sopenharmony_ci
4085bebb993Sopenharmony_cinapi_property_descriptor NVal::DeclareNapiFunction(const char *name, napi_callback func)
4095bebb993Sopenharmony_ci{
4105bebb993Sopenharmony_ci    return {(name), nullptr, (func), nullptr, nullptr, nullptr, napi_default, nullptr};
4115bebb993Sopenharmony_ci}
4125bebb993Sopenharmony_ci
4135bebb993Sopenharmony_cinapi_property_descriptor NVal::DeclareNapiStaticFunction(const char *name, napi_callback func)
4145bebb993Sopenharmony_ci{
4155bebb993Sopenharmony_ci    return {(name), nullptr, (func), nullptr, nullptr, nullptr, napi_static, nullptr};
4165bebb993Sopenharmony_ci}
4175bebb993Sopenharmony_ci
4185bebb993Sopenharmony_cinapi_property_descriptor NVal::DeclareNapiGetter(const char *name, napi_callback getter)
4195bebb993Sopenharmony_ci{
4205bebb993Sopenharmony_ci    return {(name), nullptr, nullptr, (getter), nullptr, nullptr, napi_default, nullptr};
4215bebb993Sopenharmony_ci}
4225bebb993Sopenharmony_ci
4235bebb993Sopenharmony_cinapi_property_descriptor NVal::DeclareNapiSetter(const char *name, napi_callback setter)
4245bebb993Sopenharmony_ci{
4255bebb993Sopenharmony_ci    return {(name), nullptr, nullptr, nullptr, (setter), nullptr, napi_default, nullptr};
4265bebb993Sopenharmony_ci}
4275bebb993Sopenharmony_ci
4285bebb993Sopenharmony_cinapi_property_descriptor NVal::DeclareNapiGetterSetter(const char *name, napi_callback getter, napi_callback setter)
4295bebb993Sopenharmony_ci{
4305bebb993Sopenharmony_ci    return {(name), nullptr, nullptr, (getter), (setter), nullptr, napi_default, nullptr};
4315bebb993Sopenharmony_ci}
4325bebb993Sopenharmony_ci} // namespace LibN
4335bebb993Sopenharmony_ci} // namespace FileManagement
4345bebb993Sopenharmony_ci} // namespace OHOS
435