14d6c458bSopenharmony_ci/*
24d6c458bSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
34d6c458bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
44d6c458bSopenharmony_ci * you may not use this file except in compliance with the License.
54d6c458bSopenharmony_ci * You may obtain a copy of the License at
64d6c458bSopenharmony_ci *
74d6c458bSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
84d6c458bSopenharmony_ci *
94d6c458bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
104d6c458bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
114d6c458bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124d6c458bSopenharmony_ci * See the License for the specific language governing permissions and
134d6c458bSopenharmony_ci * limitations under the License.
144d6c458bSopenharmony_ci */
154d6c458bSopenharmony_ci
164d6c458bSopenharmony_ci#include <algorithm>
174d6c458bSopenharmony_ci#include <codecvt>
184d6c458bSopenharmony_ci#include <iostream>
194d6c458bSopenharmony_ci#include <locale>
204d6c458bSopenharmony_ci#include <vector>
214d6c458bSopenharmony_ci
224d6c458bSopenharmony_ci#include "commonlibrary/ets_utils/js_api_module/buffer/js_blob.h"
234d6c458bSopenharmony_ci#include "commonlibrary/ets_utils/js_api_module/buffer/js_buffer.h"
244d6c458bSopenharmony_ci#include "napi/native_api.h"
254d6c458bSopenharmony_ci#include "napi/native_node_api.h"
264d6c458bSopenharmony_ci
274d6c458bSopenharmony_ciusing namespace std;
284d6c458bSopenharmony_ci
294d6c458bSopenharmony_ciextern const char _binary_js_buffer_js_start[];
304d6c458bSopenharmony_ciextern const char _binary_js_buffer_js_end[];
314d6c458bSopenharmony_ciextern const char _binary_buffer_abc_start[];
324d6c458bSopenharmony_ciextern const char _binary_buffer_abc_end[];
334d6c458bSopenharmony_ci
344d6c458bSopenharmony_cinamespace OHOS::buffer {
354d6c458bSopenharmony_cienum class ParaType:int32_t {
364d6c458bSopenharmony_ci    NUMBER = 0,
374d6c458bSopenharmony_ci    BUFFER,
384d6c458bSopenharmony_ci    UINT8ARRAY,
394d6c458bSopenharmony_ci    ARRAYBUFFER,
404d6c458bSopenharmony_ci    NUMBERS,
414d6c458bSopenharmony_ci    STRING
424d6c458bSopenharmony_ci};
434d6c458bSopenharmony_civoid FinalizeBufferCallback(napi_env env, void *finalizeData, void *finalizeHint)
444d6c458bSopenharmony_ci{
454d6c458bSopenharmony_ci    if (finalizeData != nullptr) {
464d6c458bSopenharmony_ci        auto obj = reinterpret_cast<Buffer *>(finalizeData);
474d6c458bSopenharmony_ci        delete obj;
484d6c458bSopenharmony_ci    }
494d6c458bSopenharmony_ci}
504d6c458bSopenharmony_ci
514d6c458bSopenharmony_civoid FinalizeBlobCallback(napi_env env, void *finalizeData, void *finalizeHint)
524d6c458bSopenharmony_ci{
534d6c458bSopenharmony_ci    if (finalizeData != nullptr) {
544d6c458bSopenharmony_ci        auto obj = reinterpret_cast<Blob *>(finalizeData);
554d6c458bSopenharmony_ci        delete obj;
564d6c458bSopenharmony_ci    }
574d6c458bSopenharmony_ci}
584d6c458bSopenharmony_ci
594d6c458bSopenharmony_cistatic string GetStringUtf8(napi_env env, napi_value strValue)
604d6c458bSopenharmony_ci{
614d6c458bSopenharmony_ci    string str = "";
624d6c458bSopenharmony_ci    size_t strSize = 0;
634d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_string_utf8(env, strValue, nullptr, 0, &strSize));
644d6c458bSopenharmony_ci    str.reserve(strSize + 1);
654d6c458bSopenharmony_ci    str.resize(strSize);
664d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_string_utf8(env, strValue, const_cast<char *>(str.data()), strSize + 1, &strSize));
674d6c458bSopenharmony_ci    int pos = count(str.begin(), str.end(), '\0');
684d6c458bSopenharmony_ci    if (pos != 0) {
694d6c458bSopenharmony_ci        str.resize(strSize);
704d6c458bSopenharmony_ci    }
714d6c458bSopenharmony_ci    return str;
724d6c458bSopenharmony_ci}
734d6c458bSopenharmony_ci
744d6c458bSopenharmony_cistatic string GetStringASCII(napi_env env, napi_value strValue)
754d6c458bSopenharmony_ci{
764d6c458bSopenharmony_ci    string str = "";
774d6c458bSopenharmony_ci    size_t strSize = 0;
784d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_string_latin1(env, strValue, nullptr, 0, &strSize));
794d6c458bSopenharmony_ci    str.reserve(strSize + 1);
804d6c458bSopenharmony_ci    str.resize(strSize);
814d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_string_latin1(env, strValue, const_cast<char *>(str.data()), strSize + 1, &strSize));
824d6c458bSopenharmony_ci    return str;
834d6c458bSopenharmony_ci}
844d6c458bSopenharmony_ci
854d6c458bSopenharmony_cistatic string GetString(napi_env env, EncodingType encodingType, napi_value strValue)
864d6c458bSopenharmony_ci{
874d6c458bSopenharmony_ci    if (encodingType == BASE64 || encodingType == BASE64URL) {
884d6c458bSopenharmony_ci        return GetStringASCII(env, strValue);
894d6c458bSopenharmony_ci    } else {
904d6c458bSopenharmony_ci        return GetStringUtf8(env, strValue);
914d6c458bSopenharmony_ci    }
924d6c458bSopenharmony_ci}
934d6c458bSopenharmony_ci
944d6c458bSopenharmony_cistatic napi_value FromStringUtf8(napi_env env, napi_value thisVar, napi_value str)
954d6c458bSopenharmony_ci{
964d6c458bSopenharmony_ci    string utf8Str = GetStringUtf8(env, str);
974d6c458bSopenharmony_ci    Buffer *buffer = nullptr;
984d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void **>(&buffer)));
994d6c458bSopenharmony_ci    buffer->WriteString(utf8Str, utf8Str.length());
1004d6c458bSopenharmony_ci
1014d6c458bSopenharmony_ci    return thisVar;
1024d6c458bSopenharmony_ci}
1034d6c458bSopenharmony_ci
1044d6c458bSopenharmony_cistatic napi_value FromStringASCII(napi_env env, napi_value thisVar, napi_value str, uint32_t size)
1054d6c458bSopenharmony_ci{
1064d6c458bSopenharmony_ci    string asciiStr = GetStringASCII(env, str);
1074d6c458bSopenharmony_ci    Buffer *buffer = nullptr;
1084d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void **>(&buffer)));
1094d6c458bSopenharmony_ci
1104d6c458bSopenharmony_ci    buffer->WriteString(asciiStr, size);
1114d6c458bSopenharmony_ci    return thisVar;
1124d6c458bSopenharmony_ci}
1134d6c458bSopenharmony_ci
1144d6c458bSopenharmony_cistatic std::u16string GetStringUtf16LE(napi_env env, napi_value strValue)
1154d6c458bSopenharmony_ci{
1164d6c458bSopenharmony_ci    string utf8Str = GetStringUtf8(env, strValue);
1174d6c458bSopenharmony_ci    u16string u16Str = Utf8ToUtf16BE(utf8Str);
1184d6c458bSopenharmony_ci    return Utf16BEToLE(u16Str);
1194d6c458bSopenharmony_ci}
1204d6c458bSopenharmony_ci
1214d6c458bSopenharmony_cistatic napi_value FromStringUtf16LE(napi_env env, napi_value thisVar, napi_value str)
1224d6c458bSopenharmony_ci{
1234d6c458bSopenharmony_ci    string utf8Str = GetStringUtf8(env, str);
1244d6c458bSopenharmony_ci    Buffer *buffer = nullptr;
1254d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void **>(&buffer)));
1264d6c458bSopenharmony_ci    u16string u16Str = Utf8ToUtf16BE(utf8Str);
1274d6c458bSopenharmony_ci    // 2 : the size of string is 2 times of u16str's length
1284d6c458bSopenharmony_ci    buffer->WriteString(u16Str, 0, u16Str.size() * 2);
1294d6c458bSopenharmony_ci
1304d6c458bSopenharmony_ci    return thisVar;
1314d6c458bSopenharmony_ci}
1324d6c458bSopenharmony_ci
1334d6c458bSopenharmony_cistatic std::string GetStringBase64(napi_env env, napi_value str, EncodingType type)
1344d6c458bSopenharmony_ci{
1354d6c458bSopenharmony_ci    string base64Str = GetStringASCII(env, str);
1364d6c458bSopenharmony_ci    string strDecoded = Base64Decode(base64Str, type);
1374d6c458bSopenharmony_ci    return strDecoded;
1384d6c458bSopenharmony_ci}
1394d6c458bSopenharmony_ci
1404d6c458bSopenharmony_cistatic napi_value FromStringBase64(napi_env env, napi_value thisVar, napi_value str, uint32_t size, EncodingType type)
1414d6c458bSopenharmony_ci{
1424d6c458bSopenharmony_ci    string strDecoded = GetStringBase64(env, str, type);
1434d6c458bSopenharmony_ci    Buffer *buffer = nullptr;
1444d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void **>(&buffer)));
1454d6c458bSopenharmony_ci
1464d6c458bSopenharmony_ci    buffer->WriteString(strDecoded, size);
1474d6c458bSopenharmony_ci    return thisVar;
1484d6c458bSopenharmony_ci}
1494d6c458bSopenharmony_ci
1504d6c458bSopenharmony_cistatic std::string GetStringHex(napi_env env, napi_value str)
1514d6c458bSopenharmony_ci{
1524d6c458bSopenharmony_ci    string hexStr = GetStringASCII(env, str);
1534d6c458bSopenharmony_ci    string strDecoded = HexDecode(hexStr);
1544d6c458bSopenharmony_ci    return strDecoded;
1554d6c458bSopenharmony_ci}
1564d6c458bSopenharmony_ci
1574d6c458bSopenharmony_cistatic napi_value FromStringHex(napi_env env, napi_value thisVar, napi_value str)
1584d6c458bSopenharmony_ci{
1594d6c458bSopenharmony_ci    string hexStr = GetStringASCII(env, str);
1604d6c458bSopenharmony_ci    Buffer *buffer = nullptr;
1614d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&buffer)));
1624d6c458bSopenharmony_ci
1634d6c458bSopenharmony_ci    string strDecoded = HexDecode(hexStr);
1644d6c458bSopenharmony_ci    buffer->WriteString(strDecoded, strDecoded.length());
1654d6c458bSopenharmony_ci    buffer->SetLength(strDecoded.length());
1664d6c458bSopenharmony_ci
1674d6c458bSopenharmony_ci    return thisVar;
1684d6c458bSopenharmony_ci}
1694d6c458bSopenharmony_ci
1704d6c458bSopenharmony_cistatic napi_value FromString(napi_env env, napi_callback_info info)
1714d6c458bSopenharmony_ci{
1724d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
1734d6c458bSopenharmony_ci    size_t argc = 3;
1744d6c458bSopenharmony_ci    napi_value args[3] = { nullptr };
1754d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
1764d6c458bSopenharmony_ci    // 2 : the third argument
1774d6c458bSopenharmony_ci    NAPI_ASSERT(env, argc > 2, "Wrong number of arguments");
1784d6c458bSopenharmony_ci
1794d6c458bSopenharmony_ci    uint32_t size = 0;
1804d6c458bSopenharmony_ci    // 2 : the third argument
1814d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[2], &size));
1824d6c458bSopenharmony_ci
1834d6c458bSopenharmony_ci    string type = GetStringASCII(env, args[1]);
1844d6c458bSopenharmony_ci    EncodingType eType = Buffer::GetEncodingType(type);
1854d6c458bSopenharmony_ci    switch (eType) {
1864d6c458bSopenharmony_ci        case ASCII:
1874d6c458bSopenharmony_ci        case LATIN1:
1884d6c458bSopenharmony_ci        case BINARY:
1894d6c458bSopenharmony_ci            return FromStringASCII(env, thisVar, args[0], size);
1904d6c458bSopenharmony_ci        case UTF8:
1914d6c458bSopenharmony_ci            return FromStringUtf8(env, thisVar, args[0]);
1924d6c458bSopenharmony_ci        case UTF16LE:
1934d6c458bSopenharmony_ci            return FromStringUtf16LE(env, thisVar, args[0]);
1944d6c458bSopenharmony_ci        case BASE64:
1954d6c458bSopenharmony_ci        case BASE64URL:
1964d6c458bSopenharmony_ci            return FromStringBase64(env, thisVar, args[0], size, eType);
1974d6c458bSopenharmony_ci        case HEX:
1984d6c458bSopenharmony_ci            return FromStringHex(env, thisVar, args[0]);
1994d6c458bSopenharmony_ci        default:
2004d6c458bSopenharmony_ci            break;
2014d6c458bSopenharmony_ci    }
2024d6c458bSopenharmony_ci
2034d6c458bSopenharmony_ci    napi_value result = nullptr;
2044d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
2054d6c458bSopenharmony_ci    return result;
2064d6c458bSopenharmony_ci}
2074d6c458bSopenharmony_ci
2084d6c458bSopenharmony_cistatic vector<uint8_t> GetArray(napi_env env, napi_value arr)
2094d6c458bSopenharmony_ci{
2104d6c458bSopenharmony_ci    uint32_t length = 0;
2114d6c458bSopenharmony_ci    napi_get_array_length(env, arr, &length);
2124d6c458bSopenharmony_ci    napi_value napiNumber = nullptr;
2134d6c458bSopenharmony_ci    vector<uint8_t> vec;
2144d6c458bSopenharmony_ci    for (size_t i = 0; i < length; i++) {
2154d6c458bSopenharmony_ci        napi_get_element(env, arr, i, &napiNumber);
2164d6c458bSopenharmony_ci        int32_t num = 0;
2174d6c458bSopenharmony_ci        napi_get_value_int32(env, napiNumber, &num);
2184d6c458bSopenharmony_ci        // 255 : the max number of one byte unsigned value
2194d6c458bSopenharmony_ci        num = num & 0xFF;
2204d6c458bSopenharmony_ci        vec.push_back(num);
2214d6c458bSopenharmony_ci    }
2224d6c458bSopenharmony_ci    return vec;
2234d6c458bSopenharmony_ci}
2244d6c458bSopenharmony_ci
2254d6c458bSopenharmony_cistatic void freeBolbMemory(Blob *&blob)
2264d6c458bSopenharmony_ci{
2274d6c458bSopenharmony_ci    if (blob != nullptr) {
2284d6c458bSopenharmony_ci        delete blob;
2294d6c458bSopenharmony_ci        blob = nullptr;
2304d6c458bSopenharmony_ci    }
2314d6c458bSopenharmony_ci}
2324d6c458bSopenharmony_ci
2334d6c458bSopenharmony_cistatic napi_value BlobConstructor(napi_env env, napi_callback_info info)
2344d6c458bSopenharmony_ci{
2354d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
2364d6c458bSopenharmony_ci    Blob *blob = new (std::nothrow) Blob();
2374d6c458bSopenharmony_ci    if (blob == nullptr) {
2384d6c458bSopenharmony_ci        return nullptr;
2394d6c458bSopenharmony_ci    }
2404d6c458bSopenharmony_ci    size_t argc = 3; // the argument's count is 3
2414d6c458bSopenharmony_ci    napi_value argv[3] = { nullptr }; // the argument's count is 3
2424d6c458bSopenharmony_ci    if (napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr) != napi_ok) {
2434d6c458bSopenharmony_ci        freeBolbMemory(blob);
2444d6c458bSopenharmony_ci        return nullptr;
2454d6c458bSopenharmony_ci    }
2464d6c458bSopenharmony_ci    if (argc == 1) { // Array
2474d6c458bSopenharmony_ci        vector<uint8_t> arr = GetArray(env, argv[0]);
2484d6c458bSopenharmony_ci        blob->Init(arr.data(), arr.size());
2494d6c458bSopenharmony_ci    } else { // Blob
2504d6c458bSopenharmony_ci        Blob *blobIn = nullptr;
2514d6c458bSopenharmony_ci        int32_t start = -1;
2524d6c458bSopenharmony_ci        if (napi_get_value_int32(env, argv[1], &start) != napi_ok ||
2534d6c458bSopenharmony_ci            napi_unwrap(env, argv[0], reinterpret_cast<void **>(&blobIn)) != napi_ok) {
2544d6c458bSopenharmony_ci            freeBolbMemory(blob);
2554d6c458bSopenharmony_ci            return nullptr;
2564d6c458bSopenharmony_ci        }
2574d6c458bSopenharmony_ci        if (argc == 2) { // 2 : the argument's count is 2
2584d6c458bSopenharmony_ci            blob->Init(blobIn, start);
2594d6c458bSopenharmony_ci        } else if (argc == 3) { // 3 : the argument's count is 3
2604d6c458bSopenharmony_ci            int32_t end = -1;
2614d6c458bSopenharmony_ci            if (napi_get_value_int32(env, argv[2], &end) != napi_ok) { // 2 : the third argument
2624d6c458bSopenharmony_ci                freeBolbMemory(blob);
2634d6c458bSopenharmony_ci                return nullptr;
2644d6c458bSopenharmony_ci            }
2654d6c458bSopenharmony_ci            blob->Init(blobIn, start, end);
2664d6c458bSopenharmony_ci        } else {
2674d6c458bSopenharmony_ci            freeBolbMemory(blob);
2684d6c458bSopenharmony_ci            return nullptr;
2694d6c458bSopenharmony_ci        }
2704d6c458bSopenharmony_ci    }
2714d6c458bSopenharmony_ci    if (napi_wrap(env, thisVar, blob,  FinalizeBlobCallback, nullptr, nullptr) != napi_ok) {
2724d6c458bSopenharmony_ci        freeBolbMemory(blob);
2734d6c458bSopenharmony_ci        return nullptr;
2744d6c458bSopenharmony_ci    }
2754d6c458bSopenharmony_ci    return thisVar;
2764d6c458bSopenharmony_ci}
2774d6c458bSopenharmony_ci
2784d6c458bSopenharmony_cistatic napi_value GetBufferWrapValue(napi_env env, napi_value thisVar, Buffer *buffer)
2794d6c458bSopenharmony_ci{
2804d6c458bSopenharmony_ci    napi_status status = napi_wrap(env, thisVar, buffer, FinalizeBufferCallback, nullptr, nullptr);
2814d6c458bSopenharmony_ci    if (status != napi_ok) {
2824d6c458bSopenharmony_ci        if (buffer != nullptr) {
2834d6c458bSopenharmony_ci            delete buffer;
2844d6c458bSopenharmony_ci        }
2854d6c458bSopenharmony_ci        HILOG_ERROR("can not wrap buffer");
2864d6c458bSopenharmony_ci        return nullptr;
2874d6c458bSopenharmony_ci    }
2884d6c458bSopenharmony_ci    return thisVar;
2894d6c458bSopenharmony_ci}
2904d6c458bSopenharmony_ci
2914d6c458bSopenharmony_cistatic void freeBufferMemory(Buffer *&buffer)
2924d6c458bSopenharmony_ci{
2934d6c458bSopenharmony_ci    if (buffer != nullptr) {
2944d6c458bSopenharmony_ci        delete buffer;
2954d6c458bSopenharmony_ci        buffer = nullptr;
2964d6c458bSopenharmony_ci    }
2974d6c458bSopenharmony_ci}
2984d6c458bSopenharmony_ci
2994d6c458bSopenharmony_cistatic Buffer* DealParaTypeBuffer(napi_env env, size_t argc, napi_value* argv, uint32_t length, Buffer*& buffer)
3004d6c458bSopenharmony_ci{
3014d6c458bSopenharmony_ci    Buffer *valueBuffer = nullptr;
3024d6c458bSopenharmony_ci    if (napi_unwrap(env, argv[1], reinterpret_cast<void **>(&valueBuffer)) != napi_ok) {
3034d6c458bSopenharmony_ci        return nullptr;
3044d6c458bSopenharmony_ci    }
3054d6c458bSopenharmony_ci    if (argc == 2) { // the count of argument is 2
3064d6c458bSopenharmony_ci        buffer->Init(valueBuffer);
3074d6c458bSopenharmony_ci    } else if (argc == 4) { // the count of argument is 4
3084d6c458bSopenharmony_ci        uint32_t poolOffset = 0;
3094d6c458bSopenharmony_ci        if (napi_get_value_uint32(env, argv[2], &poolOffset) != napi_ok || // 2 : the third argument
3104d6c458bSopenharmony_ci            napi_get_value_uint32(env, argv[3], &length) != napi_ok) { // 3 : the forth argument
3114d6c458bSopenharmony_ci            return nullptr;
3124d6c458bSopenharmony_ci        }
3134d6c458bSopenharmony_ci        buffer->Init(valueBuffer, poolOffset, length);
3144d6c458bSopenharmony_ci    } else {
3154d6c458bSopenharmony_ci        return nullptr;
3164d6c458bSopenharmony_ci    }
3174d6c458bSopenharmony_ci    return buffer;
3184d6c458bSopenharmony_ci}
3194d6c458bSopenharmony_ci
3204d6c458bSopenharmony_cistatic bool InitAnyArrayBuffer(napi_env env, napi_value* argv, Buffer *&buffer)
3214d6c458bSopenharmony_ci{
3224d6c458bSopenharmony_ci    void *data = nullptr;
3234d6c458bSopenharmony_ci    size_t bufferSize = 0;
3244d6c458bSopenharmony_ci    uint32_t byteOffset = 0;
3254d6c458bSopenharmony_ci    uint32_t length = 0;
3264d6c458bSopenharmony_ci    bool isShared = false;
3274d6c458bSopenharmony_ci    if (napi_get_value_uint32(env, argv[2], &byteOffset) != napi_ok || // 2 : the third argument
3284d6c458bSopenharmony_ci        napi_get_value_uint32(env, argv[3], &length) != napi_ok) { // 3 : the fourth argument
3294d6c458bSopenharmony_ci        freeBufferMemory(buffer);
3304d6c458bSopenharmony_ci        return false;
3314d6c458bSopenharmony_ci    }
3324d6c458bSopenharmony_ci    if (napi_is_shared_array_buffer(env, argv[1], &isShared) != napi_ok) {
3334d6c458bSopenharmony_ci        freeBufferMemory(buffer);
3344d6c458bSopenharmony_ci        return false;
3354d6c458bSopenharmony_ci    }
3364d6c458bSopenharmony_ci    if (isShared) {
3374d6c458bSopenharmony_ci        if (napi_get_shared_array_buffer_info(env, argv[1], &data, &bufferSize) != napi_ok) {
3384d6c458bSopenharmony_ci            freeBufferMemory(buffer);
3394d6c458bSopenharmony_ci            return false;
3404d6c458bSopenharmony_ci        }
3414d6c458bSopenharmony_ci        buffer->Init(reinterpret_cast<uint8_t*>(data), byteOffset, length);
3424d6c458bSopenharmony_ci        return true;
3434d6c458bSopenharmony_ci    }
3444d6c458bSopenharmony_ci    if (napi_get_arraybuffer_info(env, argv[1], &data, &bufferSize) != napi_ok) {
3454d6c458bSopenharmony_ci        freeBufferMemory(buffer);
3464d6c458bSopenharmony_ci        return false;
3474d6c458bSopenharmony_ci    }
3484d6c458bSopenharmony_ci    buffer->Init(reinterpret_cast<uint8_t*>(data), byteOffset, length);
3494d6c458bSopenharmony_ci    return true;
3504d6c458bSopenharmony_ci}
3514d6c458bSopenharmony_ci
3524d6c458bSopenharmony_cistatic Buffer* BufferConstructorInner(napi_env env, size_t argc, napi_value* argv, ParaType paraType)
3534d6c458bSopenharmony_ci{
3544d6c458bSopenharmony_ci    Buffer *buffer = new (std::nothrow) Buffer();
3554d6c458bSopenharmony_ci    if (buffer == nullptr) {
3564d6c458bSopenharmony_ci        HILOG_ERROR("BufferStructor:: buffer is nullptr");
3574d6c458bSopenharmony_ci        return nullptr;
3584d6c458bSopenharmony_ci    }
3594d6c458bSopenharmony_ci    uint32_t length = 0;
3604d6c458bSopenharmony_ci    if (paraType == ParaType::NUMBER) {
3614d6c458bSopenharmony_ci        if (napi_get_value_uint32(env, argv[1], &length) != napi_ok) {
3624d6c458bSopenharmony_ci            freeBufferMemory(buffer);
3634d6c458bSopenharmony_ci            return nullptr;
3644d6c458bSopenharmony_ci        }
3654d6c458bSopenharmony_ci        buffer->Init(length);
3664d6c458bSopenharmony_ci    } else if (paraType == ParaType::NUMBERS) {
3674d6c458bSopenharmony_ci        vector<uint8_t> arr = GetArray(env, argv[1]);
3684d6c458bSopenharmony_ci        buffer->Init(arr.size());
3694d6c458bSopenharmony_ci        buffer->SetArray(arr);
3704d6c458bSopenharmony_ci    } else if (paraType == ParaType::BUFFER) {
3714d6c458bSopenharmony_ci        auto rstBuffer = DealParaTypeBuffer(env, argc, argv, length, buffer);
3724d6c458bSopenharmony_ci        if (rstBuffer == nullptr) {
3734d6c458bSopenharmony_ci            freeBufferMemory(buffer);
3744d6c458bSopenharmony_ci            return nullptr;
3754d6c458bSopenharmony_ci        }
3764d6c458bSopenharmony_ci    } else if (paraType == ParaType::UINT8ARRAY) {
3774d6c458bSopenharmony_ci        napi_typedarray_type type = napi_int8_array;
3784d6c458bSopenharmony_ci        size_t offset = 0;
3794d6c458bSopenharmony_ci        size_t aryLen = 0;
3804d6c458bSopenharmony_ci        void *resultData = nullptr;
3814d6c458bSopenharmony_ci        napi_value resultBuffer = nullptr;
3824d6c458bSopenharmony_ci        if (napi_get_typedarray_info(env, argv[1], &type, &aryLen, &resultData, &resultBuffer, &offset) != napi_ok) {
3834d6c458bSopenharmony_ci            freeBufferMemory(buffer);
3844d6c458bSopenharmony_ci            return nullptr;
3854d6c458bSopenharmony_ci        }
3864d6c458bSopenharmony_ci        buffer->Init(reinterpret_cast<uint8_t *>(resultData) - offset, offset, aryLen);
3874d6c458bSopenharmony_ci    } else if (paraType == ParaType::ARRAYBUFFER) {
3884d6c458bSopenharmony_ci        if (!InitAnyArrayBuffer(env, argv, buffer)) {
3894d6c458bSopenharmony_ci            return nullptr;
3904d6c458bSopenharmony_ci        }
3914d6c458bSopenharmony_ci    } else {
3924d6c458bSopenharmony_ci        freeBufferMemory(buffer);
3934d6c458bSopenharmony_ci        napi_throw_error(env, nullptr, "parameter type is error");
3944d6c458bSopenharmony_ci        return nullptr;
3954d6c458bSopenharmony_ci    }
3964d6c458bSopenharmony_ci    return buffer;
3974d6c458bSopenharmony_ci}
3984d6c458bSopenharmony_ci
3994d6c458bSopenharmony_cistatic napi_value BufferConstructor(napi_env env, napi_callback_info info)
4004d6c458bSopenharmony_ci{
4014d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
4024d6c458bSopenharmony_ci    size_t argc = 4; // the count of argument is 4
4034d6c458bSopenharmony_ci    napi_value argv[4] = { nullptr };  // // the count of argument is 4
4044d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr));
4054d6c458bSopenharmony_ci
4064d6c458bSopenharmony_ci    int32_t pType = -1;
4074d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_int32(env, argv[0], &pType));
4084d6c458bSopenharmony_ci    ParaType paraType = static_cast<ParaType>(pType);
4094d6c458bSopenharmony_ci    if (paraType == ParaType::STRING) {
4104d6c458bSopenharmony_ci        return nullptr;
4114d6c458bSopenharmony_ci    }
4124d6c458bSopenharmony_ci    Buffer *buffer = BufferConstructorInner(env, argc, argv, paraType);
4134d6c458bSopenharmony_ci    if (buffer == nullptr) {
4144d6c458bSopenharmony_ci        return nullptr;
4154d6c458bSopenharmony_ci    }
4164d6c458bSopenharmony_ci
4174d6c458bSopenharmony_ci    return GetBufferWrapValue(env, thisVar, buffer);
4184d6c458bSopenharmony_ci}
4194d6c458bSopenharmony_ci
4204d6c458bSopenharmony_ciBuffer *GetValueOffsetAndBuf(napi_env env, napi_callback_info info, int32_t *pValue, uint32_t *pOffset)
4214d6c458bSopenharmony_ci{
4224d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
4234d6c458bSopenharmony_ci    size_t argc = 2;
4244d6c458bSopenharmony_ci    napi_value args[2] = { nullptr };
4254d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
4264d6c458bSopenharmony_ci    NAPI_ASSERT(env, argc > 1, "Wrong number of arguments.");
4274d6c458bSopenharmony_ci
4284d6c458bSopenharmony_ci    Buffer *buf = nullptr;
4294d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void **>(&buf)));
4304d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_int32(env, args[0], pValue));
4314d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[1], pOffset));
4324d6c458bSopenharmony_ci    return buf;
4334d6c458bSopenharmony_ci}
4344d6c458bSopenharmony_ci
4354d6c458bSopenharmony_ciBuffer *GetOffsetAndBuf(napi_env env, napi_callback_info info, uint32_t *pOffset)
4364d6c458bSopenharmony_ci{
4374d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
4384d6c458bSopenharmony_ci    size_t argc = 1;
4394d6c458bSopenharmony_ci    napi_value args[1] = { nullptr };
4404d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
4414d6c458bSopenharmony_ci    NAPI_ASSERT(env, argc > 0, "Wrong number of arguments.");
4424d6c458bSopenharmony_ci
4434d6c458bSopenharmony_ci    Buffer *buf = nullptr;
4444d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void **>(&buf)));
4454d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[0], pOffset));
4464d6c458bSopenharmony_ci    return buf;
4474d6c458bSopenharmony_ci}
4484d6c458bSopenharmony_ci
4494d6c458bSopenharmony_cistatic napi_value WriteInt32BE(napi_env env, napi_callback_info info)
4504d6c458bSopenharmony_ci{
4514d6c458bSopenharmony_ci    int32_t value = 0;
4524d6c458bSopenharmony_ci    uint32_t offset = 0;
4534d6c458bSopenharmony_ci    Buffer *buf = GetValueOffsetAndBuf(env, info, &value, &offset);
4544d6c458bSopenharmony_ci    if (buf != nullptr) {
4554d6c458bSopenharmony_ci        buf->WriteInt32BE(value, offset);
4564d6c458bSopenharmony_ci    }
4574d6c458bSopenharmony_ci    napi_value result = nullptr;
4584d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
4594d6c458bSopenharmony_ci    return result;
4604d6c458bSopenharmony_ci}
4614d6c458bSopenharmony_ci
4624d6c458bSopenharmony_cistatic napi_value ReadInt32BE(napi_env env, napi_callback_info info)
4634d6c458bSopenharmony_ci{
4644d6c458bSopenharmony_ci    uint32_t offset = 0;
4654d6c458bSopenharmony_ci    Buffer *buf = GetOffsetAndBuf(env, info, &offset);
4664d6c458bSopenharmony_ci    int32_t res = 0;
4674d6c458bSopenharmony_ci    if (buf != nullptr) {
4684d6c458bSopenharmony_ci        res = buf->ReadInt32BE(offset);
4694d6c458bSopenharmony_ci    }
4704d6c458bSopenharmony_ci    napi_value result = nullptr;
4714d6c458bSopenharmony_ci    napi_create_int32(env, res, &result);
4724d6c458bSopenharmony_ci    return result;
4734d6c458bSopenharmony_ci}
4744d6c458bSopenharmony_ci
4754d6c458bSopenharmony_cistatic napi_value SetArray(napi_env env, napi_callback_info info)
4764d6c458bSopenharmony_ci{
4774d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
4784d6c458bSopenharmony_ci    size_t argc = 1;
4794d6c458bSopenharmony_ci    napi_value args[1] = { nullptr };
4804d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
4814d6c458bSopenharmony_ci    NAPI_ASSERT(env, argc > 0, "Wrong number of arguments.");
4824d6c458bSopenharmony_ci
4834d6c458bSopenharmony_ci    bool isArray = false;
4844d6c458bSopenharmony_ci    NAPI_CALL(env, napi_is_array(env, args[0], &isArray));
4854d6c458bSopenharmony_ci    if (isArray) {
4864d6c458bSopenharmony_ci        Buffer *buf = nullptr;
4874d6c458bSopenharmony_ci        NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void **>(&buf)));
4884d6c458bSopenharmony_ci        vector<uint8_t> arr = GetArray(env, args[0]);
4894d6c458bSopenharmony_ci        buf->SetArray(arr);
4904d6c458bSopenharmony_ci    }
4914d6c458bSopenharmony_ci    napi_value result = nullptr;
4924d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
4934d6c458bSopenharmony_ci    return result;
4944d6c458bSopenharmony_ci}
4954d6c458bSopenharmony_ci
4964d6c458bSopenharmony_cistatic napi_value GetLength(napi_env env, napi_callback_info info)
4974d6c458bSopenharmony_ci{
4984d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
4994d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
5004d6c458bSopenharmony_ci    Buffer *buf = nullptr;
5014d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void **>(&buf)));
5024d6c458bSopenharmony_ci    uint32_t res = buf->GetLength();
5034d6c458bSopenharmony_ci    napi_value result = nullptr;
5044d6c458bSopenharmony_ci    napi_create_uint32(env, res, &result);
5054d6c458bSopenharmony_ci    return result;
5064d6c458bSopenharmony_ci}
5074d6c458bSopenharmony_ci
5084d6c458bSopenharmony_cistatic napi_value GetByteOffset(napi_env env, napi_callback_info info)
5094d6c458bSopenharmony_ci{
5104d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
5114d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
5124d6c458bSopenharmony_ci    Buffer *buf = nullptr;
5134d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void **>(&buf)));
5144d6c458bSopenharmony_ci    uint32_t res = buf->GetByteOffset();
5154d6c458bSopenharmony_ci    napi_value result = nullptr;
5164d6c458bSopenharmony_ci    napi_create_uint32(env, res, &result);
5174d6c458bSopenharmony_ci    return result;
5184d6c458bSopenharmony_ci}
5194d6c458bSopenharmony_ci
5204d6c458bSopenharmony_cistatic napi_value WriteString(napi_env env, napi_callback_info info)
5214d6c458bSopenharmony_ci{
5224d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
5234d6c458bSopenharmony_ci    size_t argc = 4;
5244d6c458bSopenharmony_ci    napi_value args[4] = { nullptr };
5254d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
5264d6c458bSopenharmony_ci    // 4 : 4 arguments is right
5274d6c458bSopenharmony_ci    NAPI_ASSERT(env, argc == 4, "Wrong number of arguments.");
5284d6c458bSopenharmony_ci
5294d6c458bSopenharmony_ci    // 3 : the forth argument
5304d6c458bSopenharmony_ci    string encoding = GetStringASCII(env, args[3]);
5314d6c458bSopenharmony_ci    EncodingType encodingType = Buffer::GetEncodingType(encoding);
5324d6c458bSopenharmony_ci    string value = GetString(env, encodingType, args[0]);
5334d6c458bSopenharmony_ci
5344d6c458bSopenharmony_ci    uint32_t offset = 0;
5354d6c458bSopenharmony_ci    uint32_t length = 0;
5364d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[1], &offset));
5374d6c458bSopenharmony_ci    // 2 : the third argument
5384d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[2], &length));
5394d6c458bSopenharmony_ci
5404d6c458bSopenharmony_ci    Buffer *buf = nullptr;
5414d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void **>(&buf)));
5424d6c458bSopenharmony_ci    length = (value.length() < length) ? value.length() : length;
5434d6c458bSopenharmony_ci    unsigned int lengthWrote = buf->WriteString(value, offset, length, encoding);
5444d6c458bSopenharmony_ci
5454d6c458bSopenharmony_ci    napi_value result = nullptr;
5464d6c458bSopenharmony_ci    napi_create_uint32(env, lengthWrote, &result);
5474d6c458bSopenharmony_ci    return result;
5484d6c458bSopenharmony_ci}
5494d6c458bSopenharmony_ci
5504d6c458bSopenharmony_cistatic napi_value FillString(napi_env env, napi_callback_info info)
5514d6c458bSopenharmony_ci{
5524d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
5534d6c458bSopenharmony_ci    size_t argc = 4;
5544d6c458bSopenharmony_ci    napi_value args[4] = { nullptr };
5554d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
5564d6c458bSopenharmony_ci    NAPI_ASSERT(env, argc > 3, "Wrong number of arguments."); // 3:The number of parameters is 3
5574d6c458bSopenharmony_ci
5584d6c458bSopenharmony_ci    string encoding = GetStringASCII(env, args[3]);
5594d6c458bSopenharmony_ci    EncodingType encodingType = Buffer::GetEncodingType(encoding);
5604d6c458bSopenharmony_ci    string value = GetString(env, encodingType, args[0]);
5614d6c458bSopenharmony_ci
5624d6c458bSopenharmony_ci    uint32_t offset = 0;
5634d6c458bSopenharmony_ci    uint32_t end = 0;
5644d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[1], &offset));
5654d6c458bSopenharmony_ci    // 2 : the third argument
5664d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[2], &end));
5674d6c458bSopenharmony_ci
5684d6c458bSopenharmony_ci    Buffer *buf = nullptr;
5694d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void **>(&buf)));
5704d6c458bSopenharmony_ci    buf->FillString(value, offset, end, encoding);
5714d6c458bSopenharmony_ci
5724d6c458bSopenharmony_ci    napi_value result = nullptr;
5734d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
5744d6c458bSopenharmony_ci    return result;
5754d6c458bSopenharmony_ci}
5764d6c458bSopenharmony_ci
5774d6c458bSopenharmony_cistatic napi_value FillNumbers(napi_env env, napi_callback_info info)
5784d6c458bSopenharmony_ci{
5794d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
5804d6c458bSopenharmony_ci    size_t argc = 3;
5814d6c458bSopenharmony_ci    napi_value args[3] = { nullptr };
5824d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
5834d6c458bSopenharmony_ci    // 2 : the third argument
5844d6c458bSopenharmony_ci    NAPI_ASSERT(env, argc > 2, "Wrong number of arguments.");
5854d6c458bSopenharmony_ci
5864d6c458bSopenharmony_ci    uint32_t offset = 0;
5874d6c458bSopenharmony_ci    uint32_t end = 0;
5884d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[1], &offset));
5894d6c458bSopenharmony_ci    // 2 : the third argument
5904d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[2], &end));
5914d6c458bSopenharmony_ci
5924d6c458bSopenharmony_ci    Buffer *buf = nullptr;
5934d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void **>(&buf)));
5944d6c458bSopenharmony_ci    vector<uint8_t> arr = GetArray(env, args[0]);
5954d6c458bSopenharmony_ci    buf->FillNumber(arr, offset, end);
5964d6c458bSopenharmony_ci
5974d6c458bSopenharmony_ci    napi_value result = nullptr;
5984d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
5994d6c458bSopenharmony_ci    return result;
6004d6c458bSopenharmony_ci}
6014d6c458bSopenharmony_ci
6024d6c458bSopenharmony_cistatic napi_value FillBuffer(napi_env env, napi_callback_info info)
6034d6c458bSopenharmony_ci{
6044d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
6054d6c458bSopenharmony_ci    size_t argc = 3;
6064d6c458bSopenharmony_ci    napi_value args[3] = { nullptr };
6074d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
6084d6c458bSopenharmony_ci    // 2 : the third argument
6094d6c458bSopenharmony_ci    NAPI_ASSERT(env, argc > 2, "Wrong number of arguments.");
6104d6c458bSopenharmony_ci
6114d6c458bSopenharmony_ci    uint32_t offset = 0;
6124d6c458bSopenharmony_ci    uint32_t end = 0;
6134d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[1], &offset));
6144d6c458bSopenharmony_ci    // 2 : the third argument
6154d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[2], &end));
6164d6c458bSopenharmony_ci
6174d6c458bSopenharmony_ci    Buffer *buffer = nullptr;
6184d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, args[0], reinterpret_cast<void **>(&buffer)));
6194d6c458bSopenharmony_ci    Buffer *ego = nullptr;
6204d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void **>(&ego)));
6214d6c458bSopenharmony_ci    ego->FillBuffer(buffer, offset, end);
6224d6c458bSopenharmony_ci
6234d6c458bSopenharmony_ci    napi_value result = nullptr;
6244d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
6254d6c458bSopenharmony_ci    return result;
6264d6c458bSopenharmony_ci}
6274d6c458bSopenharmony_ci
6284d6c458bSopenharmony_cistatic napi_value Utf8ByteLength(napi_env env, napi_callback_info info)
6294d6c458bSopenharmony_ci{
6304d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
6314d6c458bSopenharmony_ci    size_t argc = 1;
6324d6c458bSopenharmony_ci    napi_value args[1] = { nullptr };
6334d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
6344d6c458bSopenharmony_ci    NAPI_ASSERT(env, argc > 0, "Wrong number of arguments.");
6354d6c458bSopenharmony_ci    size_t byteLen = 0;
6364d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_string_utf8(env, args[0], nullptr, 0, &byteLen));
6374d6c458bSopenharmony_ci    napi_value result = nullptr;
6384d6c458bSopenharmony_ci    napi_create_uint32(env, byteLen, &result);
6394d6c458bSopenharmony_ci    return result;
6404d6c458bSopenharmony_ci}
6414d6c458bSopenharmony_ci
6424d6c458bSopenharmony_cistatic napi_value GetBufferData(napi_env env, napi_callback_info info)
6434d6c458bSopenharmony_ci{
6444d6c458bSopenharmony_ci    napi_value result = nullptr;
6454d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
6464d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
6474d6c458bSopenharmony_ci    Buffer *buf = nullptr;
6484d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void **>(&buf)));
6494d6c458bSopenharmony_ci    uint32_t length = buf->GetLength();
6504d6c458bSopenharmony_ci    uint8_t* data = new (std::nothrow) uint8_t[length];
6514d6c458bSopenharmony_ci    if (data == nullptr) {
6524d6c458bSopenharmony_ci        HILOG_ERROR("buffer:: data is nullptr");
6534d6c458bSopenharmony_ci        return result;
6544d6c458bSopenharmony_ci    }
6554d6c458bSopenharmony_ci    buf->ReadBytes(data, 0, length);
6564d6c458bSopenharmony_ci    NAPI_CALL(env, napi_create_array(env, &result));
6574d6c458bSopenharmony_ci    size_t key = 0;
6584d6c458bSopenharmony_ci    napi_value value = nullptr;
6594d6c458bSopenharmony_ci    for (uint32_t i = 0, len = length; i < len; i++) {
6604d6c458bSopenharmony_ci        napi_create_uint32(env, data[i], &value);
6614d6c458bSopenharmony_ci        napi_set_element(env, result, key, value);
6624d6c458bSopenharmony_ci        key++;
6634d6c458bSopenharmony_ci    }
6644d6c458bSopenharmony_ci    delete[] data;
6654d6c458bSopenharmony_ci    data = nullptr;
6664d6c458bSopenharmony_ci    return result;
6674d6c458bSopenharmony_ci}
6684d6c458bSopenharmony_ci
6694d6c458bSopenharmony_cistatic napi_value GetArrayBuffer(napi_env env, napi_callback_info info)
6704d6c458bSopenharmony_ci{
6714d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
6724d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
6734d6c458bSopenharmony_ci    Buffer *buf = nullptr;
6744d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void **>(&buf)));
6754d6c458bSopenharmony_ci    uint32_t length = buf->GetLength();
6764d6c458bSopenharmony_ci    void *data = nullptr;
6774d6c458bSopenharmony_ci    napi_value arrayBuffer = nullptr;
6784d6c458bSopenharmony_ci    NAPI_CALL(env, napi_create_arraybuffer(env, length, &data, &arrayBuffer));
6794d6c458bSopenharmony_ci    buf->ReadBytesForArrayBuffer(data, length);
6804d6c458bSopenharmony_ci    return arrayBuffer;
6814d6c458bSopenharmony_ci}
6824d6c458bSopenharmony_ci
6834d6c458bSopenharmony_cistatic napi_value Get(napi_env env, napi_callback_info info)
6844d6c458bSopenharmony_ci{
6854d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
6864d6c458bSopenharmony_ci    size_t argc = 1;
6874d6c458bSopenharmony_ci    napi_value args[1] = { nullptr };
6884d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
6894d6c458bSopenharmony_ci    NAPI_ASSERT(env, argc > 0, "Wrong number of arguments.");
6904d6c458bSopenharmony_ci    uint32_t index = 0;
6914d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[0], &index));
6924d6c458bSopenharmony_ci    Buffer *buf = nullptr;
6934d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void **>(&buf)));
6944d6c458bSopenharmony_ci    int32_t value = buf->Get(index);
6954d6c458bSopenharmony_ci    napi_value result = nullptr;
6964d6c458bSopenharmony_ci    napi_create_int32(env, value, &result);
6974d6c458bSopenharmony_ci    return result;
6984d6c458bSopenharmony_ci}
6994d6c458bSopenharmony_ci
7004d6c458bSopenharmony_cistatic napi_value Set(napi_env env, napi_callback_info info)
7014d6c458bSopenharmony_ci{
7024d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
7034d6c458bSopenharmony_ci    size_t argc = 2;
7044d6c458bSopenharmony_ci    napi_value args[2] = { nullptr };
7054d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
7064d6c458bSopenharmony_ci    NAPI_ASSERT(env, argc > 1, "Wrong number of arguments.");
7074d6c458bSopenharmony_ci
7084d6c458bSopenharmony_ci    Buffer *buf = nullptr;
7094d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void **>(&buf)));
7104d6c458bSopenharmony_ci
7114d6c458bSopenharmony_ci    uint32_t index = 0;
7124d6c458bSopenharmony_ci    int32_t value = 0;
7134d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[0], &index));
7144d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_int32(env, args[1], &value));
7154d6c458bSopenharmony_ci    buf->Set(index, value);
7164d6c458bSopenharmony_ci    napi_value result = nullptr;
7174d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
7184d6c458bSopenharmony_ci    return result;
7194d6c458bSopenharmony_ci}
7204d6c458bSopenharmony_ci
7214d6c458bSopenharmony_cistatic napi_value WriteInt32LE(napi_env env, napi_callback_info info)
7224d6c458bSopenharmony_ci{
7234d6c458bSopenharmony_ci    int32_t value = 0;
7244d6c458bSopenharmony_ci    uint32_t offset = 0;
7254d6c458bSopenharmony_ci    Buffer *buf = GetValueOffsetAndBuf(env, info, &value, &offset);
7264d6c458bSopenharmony_ci    if (buf != nullptr) {
7274d6c458bSopenharmony_ci        buf->WriteInt32LE(value, offset);
7284d6c458bSopenharmony_ci    }
7294d6c458bSopenharmony_ci    napi_value result = nullptr;
7304d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
7314d6c458bSopenharmony_ci    return result;
7324d6c458bSopenharmony_ci}
7334d6c458bSopenharmony_ci
7344d6c458bSopenharmony_cistatic napi_value ReadInt32LE(napi_env env, napi_callback_info info)
7354d6c458bSopenharmony_ci{
7364d6c458bSopenharmony_ci    uint32_t offset = 0;
7374d6c458bSopenharmony_ci    Buffer *buf = GetOffsetAndBuf(env, info, &offset);
7384d6c458bSopenharmony_ci    int32_t res = 0;
7394d6c458bSopenharmony_ci    if (buf != nullptr) {
7404d6c458bSopenharmony_ci        res = buf->ReadInt32LE(offset);
7414d6c458bSopenharmony_ci    }
7424d6c458bSopenharmony_ci    napi_value result = nullptr;
7434d6c458bSopenharmony_ci    napi_create_int32(env, res, &result);
7444d6c458bSopenharmony_ci    return result;
7454d6c458bSopenharmony_ci}
7464d6c458bSopenharmony_ci
7474d6c458bSopenharmony_cistatic napi_value WriteUInt32BE(napi_env env, napi_callback_info info)
7484d6c458bSopenharmony_ci{
7494d6c458bSopenharmony_ci    int32_t value = 0;
7504d6c458bSopenharmony_ci    uint32_t offset = 0;
7514d6c458bSopenharmony_ci    Buffer *buf = GetValueOffsetAndBuf(env, info, &value, &offset);
7524d6c458bSopenharmony_ci    if (buf != nullptr) {
7534d6c458bSopenharmony_ci        buf->WriteUInt32BE(value, offset);
7544d6c458bSopenharmony_ci    }
7554d6c458bSopenharmony_ci    napi_value result = nullptr;
7564d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
7574d6c458bSopenharmony_ci    return result;
7584d6c458bSopenharmony_ci}
7594d6c458bSopenharmony_ci
7604d6c458bSopenharmony_cistatic napi_value ReadUInt32BE(napi_env env, napi_callback_info info)
7614d6c458bSopenharmony_ci{
7624d6c458bSopenharmony_ci    uint32_t offset = 0;
7634d6c458bSopenharmony_ci    Buffer *buf = GetOffsetAndBuf(env, info, &offset);
7644d6c458bSopenharmony_ci    uint32_t res = 0;
7654d6c458bSopenharmony_ci    if (buf != nullptr) {
7664d6c458bSopenharmony_ci        res = buf->ReadUInt32BE(offset);
7674d6c458bSopenharmony_ci    }
7684d6c458bSopenharmony_ci    napi_value result = nullptr;
7694d6c458bSopenharmony_ci    napi_create_uint32(env, res, &result);
7704d6c458bSopenharmony_ci    return result;
7714d6c458bSopenharmony_ci}
7724d6c458bSopenharmony_ci
7734d6c458bSopenharmony_cistatic napi_value WriteUInt32LE(napi_env env, napi_callback_info info)
7744d6c458bSopenharmony_ci{
7754d6c458bSopenharmony_ci    int32_t value = 0;
7764d6c458bSopenharmony_ci    uint32_t offset = 0;
7774d6c458bSopenharmony_ci    Buffer *buf = GetValueOffsetAndBuf(env, info, &value, &offset);
7784d6c458bSopenharmony_ci    if (buf != nullptr) {
7794d6c458bSopenharmony_ci        buf->WriteUInt32LE(value, offset);
7804d6c458bSopenharmony_ci    }
7814d6c458bSopenharmony_ci    napi_value result = nullptr;
7824d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
7834d6c458bSopenharmony_ci    return result;
7844d6c458bSopenharmony_ci}
7854d6c458bSopenharmony_ci
7864d6c458bSopenharmony_cistatic napi_value ReadUInt32LE(napi_env env, napi_callback_info info)
7874d6c458bSopenharmony_ci{
7884d6c458bSopenharmony_ci    uint32_t offset = 0;
7894d6c458bSopenharmony_ci    Buffer *buf = GetOffsetAndBuf(env, info, &offset);
7904d6c458bSopenharmony_ci    uint32_t res = 0;
7914d6c458bSopenharmony_ci    if (buf != nullptr) {
7924d6c458bSopenharmony_ci        res = buf->ReadUInt32LE(offset);
7934d6c458bSopenharmony_ci    }
7944d6c458bSopenharmony_ci    napi_value result = nullptr;
7954d6c458bSopenharmony_ci    napi_create_uint32(env, res, &result);
7964d6c458bSopenharmony_ci    return result;
7974d6c458bSopenharmony_ci}
7984d6c458bSopenharmony_ci
7994d6c458bSopenharmony_cistatic napi_value SubBuffer(napi_env env, napi_callback_info info)
8004d6c458bSopenharmony_ci{
8014d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
8024d6c458bSopenharmony_ci    size_t argc = 3;
8034d6c458bSopenharmony_ci    napi_value args[3] = { nullptr };
8044d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
8054d6c458bSopenharmony_ci    NAPI_ASSERT(env, argc == 3, "Wrong number of arguments");
8064d6c458bSopenharmony_ci
8074d6c458bSopenharmony_ci    Buffer *newBuf = nullptr;
8084d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void **>(&newBuf)));
8094d6c458bSopenharmony_ci    Buffer *targetBuf = nullptr;
8104d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, args[0], reinterpret_cast<void **>(&targetBuf)));
8114d6c458bSopenharmony_ci
8124d6c458bSopenharmony_ci    uint32_t start = 0;
8134d6c458bSopenharmony_ci    uint32_t end = 0;
8144d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[1], &start));
8154d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[2], &end));
8164d6c458bSopenharmony_ci    newBuf->SubBuffer(targetBuf, start, end);
8174d6c458bSopenharmony_ci    napi_value result = nullptr;
8184d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_undefined(env, &result));
8194d6c458bSopenharmony_ci    return result;
8204d6c458bSopenharmony_ci}
8214d6c458bSopenharmony_ci
8224d6c458bSopenharmony_cistatic napi_value Copy(napi_env env, napi_callback_info info)
8234d6c458bSopenharmony_ci{
8244d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
8254d6c458bSopenharmony_ci    size_t argc = 4;
8264d6c458bSopenharmony_ci    napi_value args[4] = { nullptr };
8274d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
8284d6c458bSopenharmony_ci    // 4 : 4 arguments is right
8294d6c458bSopenharmony_ci    NAPI_ASSERT(env, argc == 4, "Wrong number of arguments");
8304d6c458bSopenharmony_ci    uint32_t targetStart = 0;
8314d6c458bSopenharmony_ci    uint32_t sourceStart = 0;
8324d6c458bSopenharmony_ci    uint32_t sourceEnd = 0;
8334d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[1], &targetStart));
8344d6c458bSopenharmony_ci    // 2 : the third argument
8354d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[2], &sourceStart));
8364d6c458bSopenharmony_ci    // 3 : the forth argument
8374d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[3], &sourceEnd));
8384d6c458bSopenharmony_ci    Buffer *targetBuf = nullptr;
8394d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, args[0], reinterpret_cast<void **>(&targetBuf)));
8404d6c458bSopenharmony_ci    Buffer *sBuf = nullptr;
8414d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void **>(&sBuf)));
8424d6c458bSopenharmony_ci    uint32_t cLength = sBuf->Copy(targetBuf, targetStart, sourceStart, sourceEnd);
8434d6c458bSopenharmony_ci    napi_value result = nullptr;
8444d6c458bSopenharmony_ci    napi_create_int32(env, cLength, &result);
8454d6c458bSopenharmony_ci    return result;
8464d6c458bSopenharmony_ci}
8474d6c458bSopenharmony_ci
8484d6c458bSopenharmony_cistatic napi_value Compare(napi_env env, napi_callback_info info)
8494d6c458bSopenharmony_ci{
8504d6c458bSopenharmony_ci    napi_value result = nullptr;
8514d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
8524d6c458bSopenharmony_ci    size_t argc = 4;
8534d6c458bSopenharmony_ci    napi_value args[4] = { nullptr };
8544d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
8554d6c458bSopenharmony_ci    uint32_t targetStart = 0;
8564d6c458bSopenharmony_ci    uint32_t sourceStart = 0;
8574d6c458bSopenharmony_ci    uint32_t length = 0;
8584d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[1], &targetStart));
8594d6c458bSopenharmony_ci    // 2 : the third argument
8604d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[2], &sourceStart));
8614d6c458bSopenharmony_ci    // 3 : the forth argument
8624d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[3], &length));
8634d6c458bSopenharmony_ci    Buffer *targetBuf = nullptr;
8644d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, args[0], reinterpret_cast<void **>(&targetBuf)));
8654d6c458bSopenharmony_ci    if (targetBuf == nullptr) {
8664d6c458bSopenharmony_ci        HILOG_FATAL("buffer:: targetBuf is NULL");
8674d6c458bSopenharmony_ci    }
8684d6c458bSopenharmony_ci    Buffer *sBuf = nullptr;
8694d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void **>(&sBuf)));
8704d6c458bSopenharmony_ci    if (sBuf == nullptr) {
8714d6c458bSopenharmony_ci        HILOG_FATAL("buffer:: sBuf is NULL");
8724d6c458bSopenharmony_ci        napi_create_int32(env, 0, &result);
8734d6c458bSopenharmony_ci        return result;
8744d6c458bSopenharmony_ci    }
8754d6c458bSopenharmony_ci    int res = sBuf->Compare(targetBuf, targetStart, sourceStart, length);
8764d6c458bSopenharmony_ci    napi_create_int32(env, res, &result);
8774d6c458bSopenharmony_ci    return result;
8784d6c458bSopenharmony_ci}
8794d6c458bSopenharmony_ci
8804d6c458bSopenharmony_cistatic napi_value ToUtf8(napi_env env, napi_callback_info info)
8814d6c458bSopenharmony_ci{
8824d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
8834d6c458bSopenharmony_ci    napi_value result = nullptr;
8844d6c458bSopenharmony_ci    size_t argc = 2;
8854d6c458bSopenharmony_ci    napi_value args[2] = { nullptr };
8864d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
8874d6c458bSopenharmony_ci    uint32_t start = 0;
8884d6c458bSopenharmony_ci    uint32_t end = 0;
8894d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[0], &start));
8904d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[1], &end));
8914d6c458bSopenharmony_ci    Buffer *buf = nullptr;
8924d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&buf)));
8934d6c458bSopenharmony_ci    uint32_t length = end - start;
8944d6c458bSopenharmony_ci    std::string data = "";
8954d6c458bSopenharmony_ci    data.reserve(length + 1);
8964d6c458bSopenharmony_ci    data.resize(length);
8974d6c458bSopenharmony_ci    buf->ReadBytes(const_cast<uint8_t *>(reinterpret_cast<const uint8_t *>(data.c_str())), start, length);
8984d6c458bSopenharmony_ci    napi_create_string_utf8(env, data.c_str(), length, &result);
8994d6c458bSopenharmony_ci    return result;
9004d6c458bSopenharmony_ci}
9014d6c458bSopenharmony_ci
9024d6c458bSopenharmony_cistatic napi_value ToBase64(napi_env env, napi_callback_info info)
9034d6c458bSopenharmony_ci{
9044d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
9054d6c458bSopenharmony_ci    size_t argc = 2;
9064d6c458bSopenharmony_ci    napi_value args[2] = { nullptr };
9074d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
9084d6c458bSopenharmony_ci    uint32_t start = 0;
9094d6c458bSopenharmony_ci    uint32_t end = 0;
9104d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[0], &start));
9114d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[1], &end));
9124d6c458bSopenharmony_ci    Buffer *buf = nullptr;
9134d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&buf)));
9144d6c458bSopenharmony_ci    uint32_t length = end - start;
9154d6c458bSopenharmony_ci    std::string str = buf->ToBase64(start, length);
9164d6c458bSopenharmony_ci    napi_value result = nullptr;
9174d6c458bSopenharmony_ci    napi_create_string_latin1(env, str.c_str(), str.length(), &result);
9184d6c458bSopenharmony_ci    return result;
9194d6c458bSopenharmony_ci}
9204d6c458bSopenharmony_ci
9214d6c458bSopenharmony_cistatic napi_value ToBase64Url(napi_env env, napi_callback_info info)
9224d6c458bSopenharmony_ci{
9234d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
9244d6c458bSopenharmony_ci    size_t argc = 2;
9254d6c458bSopenharmony_ci    napi_value args[2] = { nullptr };
9264d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
9274d6c458bSopenharmony_ci    uint32_t start = 0;
9284d6c458bSopenharmony_ci    uint32_t end = 0;
9294d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[0], &start));
9304d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[1], &end));
9314d6c458bSopenharmony_ci    Buffer *buf = nullptr;
9324d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void**>(&buf)));
9334d6c458bSopenharmony_ci    uint32_t length = end - start;
9344d6c458bSopenharmony_ci    std::string str = buf->ToBase64Url(start, length);
9354d6c458bSopenharmony_ci    napi_value result = nullptr;
9364d6c458bSopenharmony_ci    napi_create_string_latin1(env, str.c_str(), str.length(), &result);
9374d6c458bSopenharmony_ci    return result;
9384d6c458bSopenharmony_ci}
9394d6c458bSopenharmony_ci
9404d6c458bSopenharmony_ciuint32_t GetValue(napi_env env, EncodingType &eType, std::string &str, napi_value &args)
9414d6c458bSopenharmony_ci{
9424d6c458bSopenharmony_ci    std::u16string u16Str = u"";
9434d6c458bSopenharmony_ci    uint32_t len = 0;
9444d6c458bSopenharmony_ci    switch (eType) {
9454d6c458bSopenharmony_ci        case ASCII:
9464d6c458bSopenharmony_ci        case LATIN1:
9474d6c458bSopenharmony_ci        case BINARY:
9484d6c458bSopenharmony_ci            str = GetStringASCII(env, args);
9494d6c458bSopenharmony_ci            break;
9504d6c458bSopenharmony_ci        case UTF8:
9514d6c458bSopenharmony_ci            str = GetStringUtf8(env, args);
9524d6c458bSopenharmony_ci            break;
9534d6c458bSopenharmony_ci        case UTF16LE: {
9544d6c458bSopenharmony_ci            u16Str = GetStringUtf16LE(env, args);
9554d6c458bSopenharmony_ci            str = std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> {}.to_bytes(u16Str);
9564d6c458bSopenharmony_ci            len = u16Str.length() * 2; // 2 : 2 means the length of wide char String is 2 times of char String
9574d6c458bSopenharmony_ci            break;
9584d6c458bSopenharmony_ci        }
9594d6c458bSopenharmony_ci        case BASE64:
9604d6c458bSopenharmony_ci        case BASE64URL:
9614d6c458bSopenharmony_ci            str = GetStringBase64(env, args, eType);
9624d6c458bSopenharmony_ci            break;
9634d6c458bSopenharmony_ci        case HEX:
9644d6c458bSopenharmony_ci            str = GetStringHex(env, args);
9654d6c458bSopenharmony_ci            break;
9664d6c458bSopenharmony_ci        default:
9674d6c458bSopenharmony_ci            break;
9684d6c458bSopenharmony_ci    }
9694d6c458bSopenharmony_ci    return len;
9704d6c458bSopenharmony_ci}
9714d6c458bSopenharmony_ci
9724d6c458bSopenharmony_cistatic napi_value IndexOf(napi_env env, napi_callback_info info)
9734d6c458bSopenharmony_ci{
9744d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
9754d6c458bSopenharmony_ci    size_t argc = 4; // 4:The number of parameters is 4
9764d6c458bSopenharmony_ci    napi_value args[4] = { nullptr }; // 4:The number of parameters is 4
9774d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
9784d6c458bSopenharmony_ci    uint32_t offset = 0;
9794d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_uint32(env, args[1], &offset));
9804d6c458bSopenharmony_ci
9814d6c458bSopenharmony_ci    // 2 : the third argument
9824d6c458bSopenharmony_ci    string type = GetStringASCII(env, args[2]);
9834d6c458bSopenharmony_ci    EncodingType eType = Buffer::GetEncodingType(type);
9844d6c458bSopenharmony_ci    std::string str = "";
9854d6c458bSopenharmony_ci    uint32_t len = 0;
9864d6c458bSopenharmony_ci    len = GetValue(env, eType, str, args[0]);
9874d6c458bSopenharmony_ci    Buffer *buf = nullptr;
9884d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void **>(&buf)));
9894d6c458bSopenharmony_ci    bool isReverse = false;
9904d6c458bSopenharmony_ci    // 3 : the forth argument
9914d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_value_bool(env, args[3], &isReverse));
9924d6c458bSopenharmony_ci    int index = -1;
9934d6c458bSopenharmony_ci    int indexNumber = -1;
9944d6c458bSopenharmony_ci    uint64_t resultIndex = 0;
9954d6c458bSopenharmony_ci    if (isReverse) {
9964d6c458bSopenharmony_ci        len = (eType == UTF16LE) ? len : str.length();
9974d6c458bSopenharmony_ci        index = buf->LastIndexOf(str.c_str(), offset, len);
9984d6c458bSopenharmony_ci    } else {
9994d6c458bSopenharmony_ci        len = (eType == UTF16LE) ? len : str.length();
10004d6c458bSopenharmony_ci        indexNumber = buf->IndexOf(str.c_str(), offset, len, resultIndex);
10014d6c458bSopenharmony_ci        if (indexNumber == -1) {
10024d6c458bSopenharmony_ci            index = indexNumber;
10034d6c458bSopenharmony_ci        } else {
10044d6c458bSopenharmony_ci            napi_value result = nullptr;
10054d6c458bSopenharmony_ci            napi_create_int64(env, resultIndex, &result);
10064d6c458bSopenharmony_ci            return result;
10074d6c458bSopenharmony_ci        }
10084d6c458bSopenharmony_ci    }
10094d6c458bSopenharmony_ci    napi_value result = nullptr;
10104d6c458bSopenharmony_ci    napi_create_int32(env, index, &result);
10114d6c458bSopenharmony_ci    return result;
10124d6c458bSopenharmony_ci}
10134d6c458bSopenharmony_ci
10144d6c458bSopenharmony_cistatic napi_value Utf8StringToNumbers(napi_env env, napi_callback_info info)
10154d6c458bSopenharmony_ci{
10164d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
10174d6c458bSopenharmony_ci    size_t argc = 1;
10184d6c458bSopenharmony_ci    napi_value args[1] = { nullptr };
10194d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr));
10204d6c458bSopenharmony_ci
10214d6c458bSopenharmony_ci    std::string str = GetStringUtf8(env, args[0]);
10224d6c458bSopenharmony_ci    napi_value result = nullptr;
10234d6c458bSopenharmony_ci    NAPI_CALL(env, napi_create_array(env, &result));
10244d6c458bSopenharmony_ci    size_t key = 0;
10254d6c458bSopenharmony_ci    napi_value value = nullptr;
10264d6c458bSopenharmony_ci    for (uint32_t i = 0; i < str.length(); i++) {
10274d6c458bSopenharmony_ci        napi_create_uint32(env, uint32_t(str.at(i) & 0xFF), &value);
10284d6c458bSopenharmony_ci        napi_set_element(env, result, key, value);
10294d6c458bSopenharmony_ci        key++;
10304d6c458bSopenharmony_ci    }
10314d6c458bSopenharmony_ci    return result;
10324d6c458bSopenharmony_ci}
10334d6c458bSopenharmony_ci
10344d6c458bSopenharmony_cistruct PromiseInfo {
10354d6c458bSopenharmony_ci    napi_env env = nullptr;
10364d6c458bSopenharmony_ci    napi_async_work worker = nullptr;
10374d6c458bSopenharmony_ci    napi_deferred deferred = nullptr;
10384d6c458bSopenharmony_ci    napi_ref blobDataRef = nullptr;
10394d6c458bSopenharmony_ci};
10404d6c458bSopenharmony_ci
10414d6c458bSopenharmony_cistatic void CopiedBlobToString(napi_env env, napi_status status, void *data)
10424d6c458bSopenharmony_ci{
10434d6c458bSopenharmony_ci    auto promiseInfo = reinterpret_cast<PromiseInfo *>(data);
10444d6c458bSopenharmony_ci    napi_value string = nullptr;
10454d6c458bSopenharmony_ci    napi_get_reference_value(env, promiseInfo->blobDataRef, &string);
10464d6c458bSopenharmony_ci    napi_resolve_deferred(env, promiseInfo->deferred, string);
10474d6c458bSopenharmony_ci    napi_delete_reference(env, promiseInfo->blobDataRef);
10484d6c458bSopenharmony_ci    napi_delete_async_work(env, promiseInfo->worker);
10494d6c458bSopenharmony_ci    delete promiseInfo;
10504d6c458bSopenharmony_ci}
10514d6c458bSopenharmony_ci
10524d6c458bSopenharmony_cistatic void CopiedBlobToArrayBuffer(napi_env env, napi_status status, void *data)
10534d6c458bSopenharmony_ci{
10544d6c458bSopenharmony_ci    auto promiseInfo = reinterpret_cast<PromiseInfo *>(data);
10554d6c458bSopenharmony_ci    napi_value arrayBuffer = nullptr;
10564d6c458bSopenharmony_ci    napi_get_reference_value(env, promiseInfo->blobDataRef, &arrayBuffer);
10574d6c458bSopenharmony_ci    napi_resolve_deferred(env, promiseInfo->deferred, arrayBuffer);
10584d6c458bSopenharmony_ci    napi_delete_reference(env, promiseInfo->blobDataRef);
10594d6c458bSopenharmony_ci    napi_delete_async_work(env, promiseInfo->worker);
10604d6c458bSopenharmony_ci    delete promiseInfo;
10614d6c458bSopenharmony_ci}
10624d6c458bSopenharmony_ci
10634d6c458bSopenharmony_cistatic napi_value ArrayBufferAsync(napi_env env, napi_callback_info info)
10644d6c458bSopenharmony_ci{
10654d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
10664d6c458bSopenharmony_ci    napi_value resourceName = nullptr;
10674d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
10684d6c458bSopenharmony_ci    Blob *blob = nullptr;
10694d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void **>(&blob)));
10704d6c458bSopenharmony_ci    size_t bufferSize = blob->GetLength();
10714d6c458bSopenharmony_ci    void *bufdata = nullptr;
10724d6c458bSopenharmony_ci    napi_value arrayBuffer = nullptr;
10734d6c458bSopenharmony_ci    napi_value bufferPromise = nullptr;
10744d6c458bSopenharmony_ci    PromiseInfo *promiseInfo = new (std::nothrow) PromiseInfo();
10754d6c458bSopenharmony_ci    if (promiseInfo == nullptr) {
10764d6c458bSopenharmony_ci        HILOG_ERROR("buffer:: promiseInfo is nullptr");
10774d6c458bSopenharmony_ci        return nullptr;
10784d6c458bSopenharmony_ci    }
10794d6c458bSopenharmony_ci    napi_create_arraybuffer(env, bufferSize, &bufdata, &arrayBuffer);
10804d6c458bSopenharmony_ci    blob->ReadBytes(reinterpret_cast<uint8_t *>(bufdata), bufferSize);
10814d6c458bSopenharmony_ci    napi_create_reference(env, arrayBuffer, 1, &promiseInfo->blobDataRef);
10824d6c458bSopenharmony_ci    napi_create_promise(env, &promiseInfo->deferred, &bufferPromise);
10834d6c458bSopenharmony_ci    napi_create_string_utf8(env, "CopyBlobToArrayBuffer", NAPI_AUTO_LENGTH, &resourceName);
10844d6c458bSopenharmony_ci    napi_create_async_work(env, nullptr, resourceName, [](napi_env env, void* data) {}, CopiedBlobToArrayBuffer,
10854d6c458bSopenharmony_ci                           reinterpret_cast<void *>(promiseInfo), &promiseInfo->worker);
10864d6c458bSopenharmony_ci    napi_queue_async_work_with_qos(env, promiseInfo->worker, napi_qos_user_initiated);
10874d6c458bSopenharmony_ci    return bufferPromise;
10884d6c458bSopenharmony_ci}
10894d6c458bSopenharmony_ci
10904d6c458bSopenharmony_cistatic napi_value TextAsync(napi_env env, napi_callback_info info)
10914d6c458bSopenharmony_ci{
10924d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
10934d6c458bSopenharmony_ci    napi_value resourceName = nullptr;
10944d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
10954d6c458bSopenharmony_ci    Blob *blob = nullptr;
10964d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void **>(&blob)));
10974d6c458bSopenharmony_ci    napi_value string = nullptr;
10984d6c458bSopenharmony_ci    PromiseInfo *promiseInfo = new (std::nothrow) PromiseInfo();
10994d6c458bSopenharmony_ci    if (promiseInfo == nullptr) {
11004d6c458bSopenharmony_ci        HILOG_ERROR("buffer:: promiseInfo is nullptr");
11014d6c458bSopenharmony_ci        return nullptr;
11024d6c458bSopenharmony_ci    }
11034d6c458bSopenharmony_ci    napi_create_string_utf8(env, reinterpret_cast<char *>(blob->GetRaw()), blob->GetLength(), &string);
11044d6c458bSopenharmony_ci    napi_create_reference(env, string, 1, &promiseInfo->blobDataRef);
11054d6c458bSopenharmony_ci    napi_value textPromise = nullptr;
11064d6c458bSopenharmony_ci    napi_create_promise(env, &promiseInfo->deferred, &textPromise);
11074d6c458bSopenharmony_ci    napi_create_string_utf8(env, "GetPromiseOfString", NAPI_AUTO_LENGTH, &resourceName);
11084d6c458bSopenharmony_ci    napi_create_async_work(env, nullptr, resourceName, [](napi_env env, void* data) {}, CopiedBlobToString,
11094d6c458bSopenharmony_ci                           reinterpret_cast<void *>(promiseInfo), &promiseInfo->worker);
11104d6c458bSopenharmony_ci    napi_queue_async_work_with_qos(env, promiseInfo->worker, napi_qos_user_initiated);
11114d6c458bSopenharmony_ci    return textPromise;
11124d6c458bSopenharmony_ci}
11134d6c458bSopenharmony_ci
11144d6c458bSopenharmony_cistatic napi_value GetBytes(napi_env env, napi_callback_info info)
11154d6c458bSopenharmony_ci{
11164d6c458bSopenharmony_ci    napi_value thisVar = nullptr;
11174d6c458bSopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr));
11184d6c458bSopenharmony_ci    Blob *blob = nullptr;
11194d6c458bSopenharmony_ci    NAPI_CALL(env, napi_unwrap(env, thisVar, reinterpret_cast<void **>(&blob)));
11204d6c458bSopenharmony_ci    napi_value result = nullptr;
11214d6c458bSopenharmony_ci    NAPI_CALL(env, napi_create_array(env, &result));
11224d6c458bSopenharmony_ci    size_t key = 0;
11234d6c458bSopenharmony_ci    napi_value value = nullptr;
11244d6c458bSopenharmony_ci    for (unsigned int i = 0; i < blob->GetLength(); i++) {
11254d6c458bSopenharmony_ci        napi_create_uint32(env, uint32_t(blob->GetByte(i) & 0xFF), &value);
11264d6c458bSopenharmony_ci        napi_set_element(env, result, key, value);
11274d6c458bSopenharmony_ci        key++;
11284d6c458bSopenharmony_ci    }
11294d6c458bSopenharmony_ci    return result;
11304d6c458bSopenharmony_ci}
11314d6c458bSopenharmony_ci
11324d6c458bSopenharmony_cistatic napi_value BufferInit(napi_env env, napi_value exports)
11334d6c458bSopenharmony_ci{
11344d6c458bSopenharmony_ci    string className = "Buffer";
11354d6c458bSopenharmony_ci    napi_value bufferClass = nullptr;
11364d6c458bSopenharmony_ci    napi_property_descriptor bufferDesc[] = {
11374d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("writeInt32BE", WriteInt32BE),
11384d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("readInt32BE", ReadInt32BE),
11394d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("writeInt32LE", WriteInt32LE),
11404d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("readInt32LE", ReadInt32LE),
11414d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("writeUInt32BE", WriteUInt32BE),
11424d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("readUInt32BE", ReadUInt32BE),
11434d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("writeUInt32LE", WriteUInt32LE),
11444d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("readUInt32LE", ReadUInt32LE),
11454d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("setArray", SetArray),
11464d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("getLength", GetLength),
11474d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("getByteOffset", GetByteOffset),
11484d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("writeString", WriteString),
11494d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("fromString", FromString),
11504d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("fillString", FillString),
11514d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("fillNumbers", FillNumbers),
11524d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("fillBuffer", FillBuffer),
11534d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("getBufferData", GetBufferData),
11544d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("getArrayBuffer", GetArrayBuffer),
11554d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("get", Get),
11564d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("set", Set),
11574d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("subBuffer", SubBuffer),
11584d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("copy", Copy),
11594d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("compare", Compare),
11604d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("toUtf8", ToUtf8),
11614d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("toBase64", ToBase64),
11624d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("toBase64Url", ToBase64Url),
11634d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("indexOf", IndexOf),
11644d6c458bSopenharmony_ci    };
11654d6c458bSopenharmony_ci    NAPI_CALL(env, napi_define_class(env, className.c_str(), className.length(), BufferConstructor,
11664d6c458bSopenharmony_ci                                     nullptr, sizeof(bufferDesc) / sizeof(bufferDesc[0]), bufferDesc, &bufferClass));
11674d6c458bSopenharmony_ci    napi_property_descriptor desc[] = {
11684d6c458bSopenharmony_ci        DECLARE_NAPI_PROPERTY("Buffer", bufferClass),
11694d6c458bSopenharmony_ci    };
11704d6c458bSopenharmony_ci    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
11714d6c458bSopenharmony_ci    return exports;
11724d6c458bSopenharmony_ci}
11734d6c458bSopenharmony_ci
11744d6c458bSopenharmony_cistatic napi_value BlobInit(napi_env env, napi_value exports)
11754d6c458bSopenharmony_ci{
11764d6c458bSopenharmony_ci    string className = "Blob";
11774d6c458bSopenharmony_ci    napi_value blobClass = nullptr;
11784d6c458bSopenharmony_ci    napi_property_descriptor blobDesc[] = {
11794d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("arraybuffer", ArrayBufferAsync),
11804d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("text", TextAsync),
11814d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("getBytes", GetBytes),
11824d6c458bSopenharmony_ci    };
11834d6c458bSopenharmony_ci    NAPI_CALL(env, napi_define_class(env, className.c_str(), className.length(), BlobConstructor,
11844d6c458bSopenharmony_ci                                     nullptr, sizeof(blobDesc) / sizeof(blobDesc[0]), blobDesc, &blobClass));
11854d6c458bSopenharmony_ci    napi_property_descriptor desc[] = {
11864d6c458bSopenharmony_ci        DECLARE_NAPI_PROPERTY("Blob", blobClass),
11874d6c458bSopenharmony_ci    };
11884d6c458bSopenharmony_ci    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
11894d6c458bSopenharmony_ci    return exports;
11904d6c458bSopenharmony_ci}
11914d6c458bSopenharmony_ci
11924d6c458bSopenharmony_cistatic napi_value Init(napi_env env, napi_value exports)
11934d6c458bSopenharmony_ci{
11944d6c458bSopenharmony_ci    napi_property_descriptor desc[] = {
11954d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("utf8ByteLength", Utf8ByteLength),
11964d6c458bSopenharmony_ci        DECLARE_NAPI_FUNCTION("utf8StringToNumbers", Utf8StringToNumbers),
11974d6c458bSopenharmony_ci    };
11984d6c458bSopenharmony_ci    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
11994d6c458bSopenharmony_ci    BufferInit(env, exports);
12004d6c458bSopenharmony_ci    BlobInit(env, exports);
12014d6c458bSopenharmony_ci    return exports;
12024d6c458bSopenharmony_ci}
12034d6c458bSopenharmony_ci
12044d6c458bSopenharmony_ciextern "C"
12054d6c458bSopenharmony_ci__attribute__((visibility("default"))) void NAPI_buffer_GetJSCode(const char **buf, int *bufLen)
12064d6c458bSopenharmony_ci{
12074d6c458bSopenharmony_ci    if (buf != nullptr) {
12084d6c458bSopenharmony_ci        *buf = _binary_js_buffer_js_start;
12094d6c458bSopenharmony_ci    }
12104d6c458bSopenharmony_ci
12114d6c458bSopenharmony_ci    if (bufLen != nullptr) {
12124d6c458bSopenharmony_ci        *bufLen = _binary_js_buffer_js_end - _binary_js_buffer_js_start;
12134d6c458bSopenharmony_ci    }
12144d6c458bSopenharmony_ci}
12154d6c458bSopenharmony_ci
12164d6c458bSopenharmony_ciextern "C"
12174d6c458bSopenharmony_ci__attribute__((visibility("default"))) void NAPI_buffer_GetABCCode(const char** buf, int* buflen)
12184d6c458bSopenharmony_ci{
12194d6c458bSopenharmony_ci    if (buf != nullptr) {
12204d6c458bSopenharmony_ci        *buf = _binary_buffer_abc_start;
12214d6c458bSopenharmony_ci    }
12224d6c458bSopenharmony_ci    if (buflen != nullptr) {
12234d6c458bSopenharmony_ci        *buflen = _binary_buffer_abc_end - _binary_buffer_abc_start;
12244d6c458bSopenharmony_ci    }
12254d6c458bSopenharmony_ci}
12264d6c458bSopenharmony_ci
12274d6c458bSopenharmony_cistatic napi_module_with_js bufferModule = {
12284d6c458bSopenharmony_ci    .nm_version = 1,
12294d6c458bSopenharmony_ci    .nm_flags = 0,
12304d6c458bSopenharmony_ci    .nm_filename = nullptr,
12314d6c458bSopenharmony_ci    .nm_register_func = Init,
12324d6c458bSopenharmony_ci    .nm_modname = "buffer",
12334d6c458bSopenharmony_ci    .nm_priv = reinterpret_cast<void *>(0),
12344d6c458bSopenharmony_ci    .nm_get_abc_code = NAPI_buffer_GetABCCode,
12354d6c458bSopenharmony_ci    .nm_get_js_code = NAPI_buffer_GetJSCode,
12364d6c458bSopenharmony_ci};
12374d6c458bSopenharmony_ci
12384d6c458bSopenharmony_ciextern "C" __attribute__((constructor)) void BufferRegisterModule()
12394d6c458bSopenharmony_ci{
12404d6c458bSopenharmony_ci    napi_module_with_js_register(&bufferModule);
12414d6c458bSopenharmony_ci}
12424d6c458bSopenharmony_ci} // namespace OHOS::Buffer
1243