14d6c458bSopenharmony_ci/*
24d6c458bSopenharmony_ci * Copyright (c) 2023 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#ifndef PLATFORM_UTIL_HELPER_H
174d6c458bSopenharmony_ci#define PLATFORM_UTIL_HELPER_H
184d6c458bSopenharmony_ci
194d6c458bSopenharmony_ci#include <codecvt>
204d6c458bSopenharmony_ci#include <locale>
214d6c458bSopenharmony_ci#include <string>
224d6c458bSopenharmony_ci
234d6c458bSopenharmony_ci#include "unicode/unistr.h"
244d6c458bSopenharmony_ci#include "unicode/ucnv.h"
254d6c458bSopenharmony_ci#include "napi/native_api.h"
264d6c458bSopenharmony_ci#include "napi/native_node_api.h"
274d6c458bSopenharmony_ci#include "tools/log.h"
284d6c458bSopenharmony_ci
294d6c458bSopenharmony_cinamespace Commonlibrary::Platform {
304d6c458bSopenharmony_ci    constexpr uint32_t STATE_BREAK_ZERO = 0;
314d6c458bSopenharmony_ci    constexpr uint32_t STATE_CONTINUE_ONE = 1;
324d6c458bSopenharmony_ci    constexpr uint32_t STATE_OTHER_TWO = 2;
334d6c458bSopenharmony_ci    constexpr uint8_t HIGER_4_BITS_MASK = 0xF0;
344d6c458bSopenharmony_ci    constexpr uint8_t FOUR_BYTES_STYLE = 0xF0;
354d6c458bSopenharmony_ci    constexpr uint8_t THREE_BYTES_STYLE = 0xE0;
364d6c458bSopenharmony_ci    constexpr uint8_t TWO_BYTES_STYLE1 = 0xD0;
374d6c458bSopenharmony_ci    constexpr uint8_t TWO_BYTES_STYLE2 = 0xC0;
384d6c458bSopenharmony_ci    constexpr uint32_t LOWER_10_BITS_MASK = 0x03FFU;
394d6c458bSopenharmony_ci    constexpr uint8_t LOWER_6_BITS_MASK = 0x3FU;
404d6c458bSopenharmony_ci    constexpr uint8_t LOWER_5_BITS_MASK = 0x1FU;
414d6c458bSopenharmony_ci    constexpr uint8_t LOWER_4_BITS_MASK = 0x0FU;
424d6c458bSopenharmony_ci    constexpr uint8_t LOWER_3_BITS_MASK = 0x07U;
434d6c458bSopenharmony_ci    constexpr uint32_t HIGH_AGENT_MASK = 0xD800U;
444d6c458bSopenharmony_ci    constexpr uint32_t LOW_AGENT_MASK = 0xDC00U;
454d6c458bSopenharmony_ci    constexpr uint32_t UTF8_VALID_BITS = 6;
464d6c458bSopenharmony_ci    constexpr uint32_t UTF16_SPECIAL_VALUE = 0x10000;
474d6c458bSopenharmony_ci    struct TextEcodeInfo {
484d6c458bSopenharmony_ci        TextEcodeInfo(napi_env napiEnv, napi_value srcValue, std::string encodingStr): env(napiEnv),
494d6c458bSopenharmony_ci                                                                                       src(srcValue),
504d6c458bSopenharmony_ci                                                                                       encoding(encodingStr)
514d6c458bSopenharmony_ci        {}
524d6c458bSopenharmony_ci        napi_env env;
534d6c458bSopenharmony_ci        napi_value src;
544d6c458bSopenharmony_ci        std::string encoding;
554d6c458bSopenharmony_ci    };
564d6c458bSopenharmony_ci    struct OutBufferInfo {
574d6c458bSopenharmony_ci        OutBufferInfo(size_t length, std::string inputStr, size_t bufferLength, size_t cnt, std::string bufferRst)
584d6c458bSopenharmony_ci            : writedSize(length),
594d6c458bSopenharmony_ci              rstBuffer(inputStr),
604d6c458bSopenharmony_ci              rstBufferLength(bufferLength),
614d6c458bSopenharmony_ci              cntSize(cnt),
624d6c458bSopenharmony_ci              bufferResult(bufferRst)
634d6c458bSopenharmony_ci        {}
644d6c458bSopenharmony_ci        size_t writedSize;
654d6c458bSopenharmony_ci        std::string rstBuffer;
664d6c458bSopenharmony_ci        size_t rstBufferLength;
674d6c458bSopenharmony_ci        size_t cntSize;
684d6c458bSopenharmony_ci        std::string bufferResult;
694d6c458bSopenharmony_ci    };
704d6c458bSopenharmony_ci    struct InputBufferInfo {
714d6c458bSopenharmony_ci        InputBufferInfo(std::string InputEncoding, size_t charSize): encoding(InputEncoding),
724d6c458bSopenharmony_ci                                                                     inputSize(charSize)
734d6c458bSopenharmony_ci        {}
744d6c458bSopenharmony_ci        std::string encoding;
754d6c458bSopenharmony_ci        size_t inputSize;
764d6c458bSopenharmony_ci    };
774d6c458bSopenharmony_ci    UConverter* CreateConverter(const std::string& encStr_, UErrorCode& codeflag);
784d6c458bSopenharmony_ci    std::string ConvertToString(UChar* uchar, size_t length);
794d6c458bSopenharmony_ci    void EncodeIntoChinese(napi_env env, napi_value src, std::string encoding, std::string& buffer);
804d6c458bSopenharmony_ci    std::string UnicodeConversion(std::string encoding, char16_t* originalBuffer, size_t inputSize);
814d6c458bSopenharmony_ci    void EncodeToUtf8(TextEcodeInfo encodeInfo, char* writeResult, uint32_t* written, size_t length, int32_t* nchars);
824d6c458bSopenharmony_ci    void EncodeConversion(napi_env env, napi_value src, napi_value* arrayBuffer, size_t &outLens,
834d6c458bSopenharmony_ci                          std::string encoding);
844d6c458bSopenharmony_ci    void FreedMemory(char *data);
854d6c458bSopenharmony_ci    int GetMaxByteSize(std::string encoding);
864d6c458bSopenharmony_ci    bool IsOneByte(uint8_t u8Char);
874d6c458bSopenharmony_ci    std::u16string Utf8ToUtf16BE(const std::string &u8Str, bool *ok = nullptr);
884d6c458bSopenharmony_ci    std::u16string Utf16BEToLE(const std::u16string &wstr);
894d6c458bSopenharmony_ci    void OtherEncode(napi_env env, napi_value src, napi_value* arrayBuffer, size_t &outLens, std::string encoding);
904d6c458bSopenharmony_ci    std::u16string EncodeUtf16BE(napi_env env, napi_value src);
914d6c458bSopenharmony_ci    void OtherEncodeUtf8(TextEcodeInfo encodeInfo, char* writeResult, uint32_t* written, size_t length,
924d6c458bSopenharmony_ci                         int32_t* nchars);
934d6c458bSopenharmony_ci    void EncodeTo16BE(TextEcodeInfo encodeInfo, char* writeResult, uint32_t* written, size_t length, int32_t* nchars);
944d6c458bSopenharmony_ci    void FreedMemory(char16_t *&data);
954d6c458bSopenharmony_ci    char16_t *ApplyMemory(const size_t &inputSize);
964d6c458bSopenharmony_ci} // namespace Commonlibrary::Platform
974d6c458bSopenharmony_ci#endif // PLATFORM_UTIL_HELPER_H