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