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 <cstring>
174d6c458bSopenharmony_ci
184d6c458bSopenharmony_ci#ifdef IOS_PLATFORM
194d6c458bSopenharmony_ci#include <sys/sysctl.h>
204d6c458bSopenharmony_ci#else
214d6c458bSopenharmony_ci#include <sys/sysinfo.h>
224d6c458bSopenharmony_ci#endif
234d6c458bSopenharmony_ci
244d6c458bSopenharmony_ci#include <unistd.h>
254d6c458bSopenharmony_ci#include "napi/native_api.h"
264d6c458bSopenharmony_ci#include "napi/native_node_api.h"
274d6c458bSopenharmony_ci
284d6c458bSopenharmony_ci#ifndef UTIL_JS_BASE64_H
294d6c458bSopenharmony_ci#define UTIL_JS_BASE64_H
304d6c458bSopenharmony_ci
314d6c458bSopenharmony_cinamespace OHOS::Util {
324d6c458bSopenharmony_ci
334d6c458bSopenharmony_ci    enum Type {
344d6c458bSopenharmony_ci        BASIC,
354d6c458bSopenharmony_ci        MIME,
364d6c458bSopenharmony_ci        BASIC_URL_SAFE,
374d6c458bSopenharmony_ci        MIME_URL_SAFE,
384d6c458bSopenharmony_ci        TYPED_FIRST = BASIC,
394d6c458bSopenharmony_ci        TYPED_LAST = MIME_URL_SAFE
404d6c458bSopenharmony_ci    };
414d6c458bSopenharmony_ci
424d6c458bSopenharmony_ci    struct EncodeInfo {
434d6c458bSopenharmony_ci        napi_async_work worker = nullptr;
444d6c458bSopenharmony_ci        napi_deferred deferred = nullptr;
454d6c458bSopenharmony_ci        napi_value promise = nullptr;
464d6c458bSopenharmony_ci        unsigned char *sinputEncode = nullptr;
474d6c458bSopenharmony_ci        unsigned char *sinputEncoding = nullptr;
484d6c458bSopenharmony_ci        size_t slength = 0;
494d6c458bSopenharmony_ci        size_t soutputLen = 0;
504d6c458bSopenharmony_ci        napi_env env;
514d6c458bSopenharmony_ci        Type valueType = BASIC;
524d6c458bSopenharmony_ci    };
534d6c458bSopenharmony_ci
544d6c458bSopenharmony_ci    struct DecodeInfo {
554d6c458bSopenharmony_ci        napi_async_work worker = nullptr;
564d6c458bSopenharmony_ci        napi_deferred deferred = nullptr;
574d6c458bSopenharmony_ci        napi_value promise = nullptr;
584d6c458bSopenharmony_ci        char *sinputDecode = nullptr;
594d6c458bSopenharmony_ci        unsigned char *sinputDecoding = nullptr;
604d6c458bSopenharmony_ci        size_t slength = 0;
614d6c458bSopenharmony_ci        size_t decodeOutLen = 0;
624d6c458bSopenharmony_ci        size_t retLen = 0;
634d6c458bSopenharmony_ci        napi_env env;
644d6c458bSopenharmony_ci        Type valueType = BASIC;
654d6c458bSopenharmony_ci    };
664d6c458bSopenharmony_ci
674d6c458bSopenharmony_ci    enum ConverterFlags {
684d6c458bSopenharmony_ci        BIT_FLG = 0x40,
694d6c458bSopenharmony_ci        SIXTEEN_FLG = 0x3F,
704d6c458bSopenharmony_ci        XFF_FLG = 0xFF,
714d6c458bSopenharmony_ci    };
724d6c458bSopenharmony_ci
734d6c458bSopenharmony_ci    void FreeMemory(unsigned char *&address);
744d6c458bSopenharmony_ci    void FreeMemory(char *&address);
754d6c458bSopenharmony_ci    unsigned char *EncodeAchieves(napi_env env, EncodeInfo *encodeInfo);
764d6c458bSopenharmony_ci    unsigned char *DecodeAchieves(napi_env env, DecodeInfo *decodeInfo);
774d6c458bSopenharmony_ci    unsigned char *EncodeAchievesInner(unsigned char *ret, EncodeInfo *encodeInfo,
784d6c458bSopenharmony_ci                                       const char *searchArray, size_t inputLen, const unsigned char *input);
794d6c458bSopenharmony_ci    unsigned char *DecodeAchievesInner(size_t inputLen, size_t equalCount,
804d6c458bSopenharmony_ci                                       const char *input, DecodeInfo *decodeInfo, unsigned char *retDecode);
814d6c458bSopenharmony_ci
824d6c458bSopenharmony_ci    class Base64 {
834d6c458bSopenharmony_ci    public:
844d6c458bSopenharmony_ci        /**
854d6c458bSopenharmony_ci         * Constructor of Base64.
864d6c458bSopenharmony_ci         */
874d6c458bSopenharmony_ci        explicit Base64() {}
884d6c458bSopenharmony_ci
894d6c458bSopenharmony_ci        /**
904d6c458bSopenharmony_ci         * Destructor of Base64.
914d6c458bSopenharmony_ci         */
924d6c458bSopenharmony_ci        virtual ~Base64() {}
934d6c458bSopenharmony_ci
944d6c458bSopenharmony_ci        /**
954d6c458bSopenharmony_ci         * Output the corresponding text after encoding the input parameters.
964d6c458bSopenharmony_ci         *
974d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
984d6c458bSopenharmony_ci         * @param src Encode the input uint8 array.
994d6c458bSopenharmony_ci         */
1004d6c458bSopenharmony_ci        napi_value EncodeSync(napi_env env, napi_value src, Type valueType);
1014d6c458bSopenharmony_ci
1024d6c458bSopenharmony_ci        /**
1034d6c458bSopenharmony_ci         * Output the corresponding text after encoding the input parameters.
1044d6c458bSopenharmony_ci         *
1054d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
1064d6c458bSopenharmony_ci         * @param src Encode the input uint8 array.
1074d6c458bSopenharmony_ci         */
1084d6c458bSopenharmony_ci        napi_value EncodeToStringSync(napi_env env, napi_value src, Type valueType);
1094d6c458bSopenharmony_ci
1104d6c458bSopenharmony_ci        /**
1114d6c458bSopenharmony_ci         * Output the corresponding text after encoding the input parameters.
1124d6c458bSopenharmony_ci         *
1134d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
1144d6c458bSopenharmony_ci         * @param src Decode the input uint8 array or string.
1154d6c458bSopenharmony_ci         */
1164d6c458bSopenharmony_ci        napi_value DecodeSync(napi_env env, napi_value src, Type valueType);
1174d6c458bSopenharmony_ci
1184d6c458bSopenharmony_ci        /**
1194d6c458bSopenharmony_ci         * Output the corresponding text after asynchronously encoding the input parameters.
1204d6c458bSopenharmony_ci         *
1214d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
1224d6c458bSopenharmony_ci         * @param src Asynchronously encoded input uint8 array.
1234d6c458bSopenharmony_ci         */
1244d6c458bSopenharmony_ci        napi_value Encode(napi_env env, napi_value src, Type valueType);
1254d6c458bSopenharmony_ci
1264d6c458bSopenharmony_ci        /**
1274d6c458bSopenharmony_ci         * Output the corresponding text after asynchronously encoding the input parameters.
1284d6c458bSopenharmony_ci         *
1294d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
1304d6c458bSopenharmony_ci         * @param src Asynchronously encoded input uint8 array.
1314d6c458bSopenharmony_ci         */
1324d6c458bSopenharmony_ci        napi_value EncodeToString(napi_env env, napi_value src, Type valueType);
1334d6c458bSopenharmony_ci
1344d6c458bSopenharmony_ci        /**
1354d6c458bSopenharmony_ci         * Output the corresponding text after asynchronously encoding the input parameters.
1364d6c458bSopenharmony_ci         *
1374d6c458bSopenharmony_ci         * @param env NAPI environment parameters.
1384d6c458bSopenharmony_ci         * @param src Asynchronously decode the input uint8 array or string.
1394d6c458bSopenharmony_ci         */
1404d6c458bSopenharmony_ci        napi_value Decode(napi_env env, napi_value src, Type valueType);
1414d6c458bSopenharmony_ci
1424d6c458bSopenharmony_ci    private:
1434d6c458bSopenharmony_ci        unsigned char *DecodeAchieve(napi_env env, const char *input, size_t inputLen, Type valueType);
1444d6c458bSopenharmony_ci        unsigned char *EncodeAchieve(const unsigned char *input, size_t inputLen, Type valueType);
1454d6c458bSopenharmony_ci        int Finds(napi_env env, char ch, Type valueType);
1464d6c458bSopenharmony_ci        size_t DecodeOut(size_t equalCount, size_t retLen);
1474d6c458bSopenharmony_ci        size_t retLen = 0;
1484d6c458bSopenharmony_ci        size_t decodeOutLen = 0;
1494d6c458bSopenharmony_ci        size_t outputLen = 0;
1504d6c458bSopenharmony_ci        unsigned char *pret = nullptr;
1514d6c458bSopenharmony_ci        const unsigned char *inputEncode_ = nullptr;
1524d6c458bSopenharmony_ci        const char *inputDecode_ = nullptr;
1534d6c458bSopenharmony_ci        unsigned char *retDecode = nullptr;
1544d6c458bSopenharmony_ci        void CreateEncodePromise(napi_env env, unsigned char *inputDecode, size_t length, Type valueType);
1554d6c458bSopenharmony_ci        void CreateEncodeToStringPromise(napi_env env, unsigned char *inputDecode, size_t length, Type valueType);
1564d6c458bSopenharmony_ci        void CreateDecodePromise(napi_env env, char *inputDecode, size_t length, Type valueType);
1574d6c458bSopenharmony_ci        EncodeInfo *stdEncodeInfo_ = nullptr;
1584d6c458bSopenharmony_ci        DecodeInfo *stdDecodeInfo_ = nullptr;
1594d6c458bSopenharmony_ci        static void ReadStdEncode(napi_env env, void *data);
1604d6c458bSopenharmony_ci        static void EndStdEncode(napi_env env, napi_status status, void *buffer);
1614d6c458bSopenharmony_ci        static void ReadStdEncodeToString(napi_env env, void *data);
1624d6c458bSopenharmony_ci        static void EndStdEncodeToString(napi_env env, napi_status status, void *buffer);
1634d6c458bSopenharmony_ci        static void ReadStdDecode(napi_env env, void *data);
1644d6c458bSopenharmony_ci        static void EndStdDecode(napi_env env, napi_status status, void *buffer);
1654d6c458bSopenharmony_ci        unsigned char *EncodeAchieveInner(const unsigned char *input, unsigned char *ret,
1664d6c458bSopenharmony_ci                                          const char *searchArray, size_t inputLen, Type valueType);
1674d6c458bSopenharmony_ci        bool DecodeSyncInner(napi_env env, napi_value src, Type valueType);
1684d6c458bSopenharmony_ci        unsigned char *DecodeAchieveInner(napi_env env, const char *input,
1694d6c458bSopenharmony_ci                                          size_t inputLen, size_t equalCount, Type valueType);
1704d6c458bSopenharmony_ci    };
1714d6c458bSopenharmony_ci}
1724d6c458bSopenharmony_ci#endif // UTIL_JS_BASE64_H
173