136a3a8d0Sopenharmony_ci/*
236a3a8d0Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
336a3a8d0Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
436a3a8d0Sopenharmony_ci * you may not use this file except in compliance with the License.
536a3a8d0Sopenharmony_ci * You may obtain a copy of the License at
636a3a8d0Sopenharmony_ci *
736a3a8d0Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
836a3a8d0Sopenharmony_ci *
936a3a8d0Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1036a3a8d0Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1136a3a8d0Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1236a3a8d0Sopenharmony_ci * See the License for the specific language governing permissions and
1336a3a8d0Sopenharmony_ci * limitations under the License.
1436a3a8d0Sopenharmony_ci */
1536a3a8d0Sopenharmony_ci#include "utils/utils.h"
1636a3a8d0Sopenharmony_ci
1736a3a8d0Sopenharmony_ci#include <fstream>
1836a3a8d0Sopenharmony_ci#include <vector>
1936a3a8d0Sopenharmony_ci#include <sys/stat.h>
2036a3a8d0Sopenharmony_ci#include "hilog_wrapper.h"
2136a3a8d0Sopenharmony_ci#ifdef __LINUX__
2236a3a8d0Sopenharmony_ci#include <cstring>
2336a3a8d0Sopenharmony_ci#endif
2436a3a8d0Sopenharmony_ci
2536a3a8d0Sopenharmony_ci#if !defined(__WINNT__) && !defined(__IDE_PREVIEW__) && !defined(__ARKUI_CROSS__)
2636a3a8d0Sopenharmony_ci#include "hitrace_meter.h"
2736a3a8d0Sopenharmony_ci#endif
2836a3a8d0Sopenharmony_ci
2936a3a8d0Sopenharmony_ci#ifdef __WINNT__
3036a3a8d0Sopenharmony_ci#include <shlwapi.h>
3136a3a8d0Sopenharmony_ci#include <windows.h>
3236a3a8d0Sopenharmony_ci#undef ERROR
3336a3a8d0Sopenharmony_ci#endif
3436a3a8d0Sopenharmony_ci
3536a3a8d0Sopenharmony_cinamespace OHOS {
3636a3a8d0Sopenharmony_cinamespace Global {
3736a3a8d0Sopenharmony_cinamespace Resource {
3836a3a8d0Sopenharmony_ciconstexpr int ERROR_RESULT = -1;
3936a3a8d0Sopenharmony_ci
4036a3a8d0Sopenharmony_ciconst std::set<std::string> Utils::tailSet {
4136a3a8d0Sopenharmony_ci    ".hap",
4236a3a8d0Sopenharmony_ci    ".hsp",
4336a3a8d0Sopenharmony_ci};
4436a3a8d0Sopenharmony_ci
4536a3a8d0Sopenharmony_cistd::vector<char> g_codes = {
4636a3a8d0Sopenharmony_ci    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
4736a3a8d0Sopenharmony_ci    'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
4836a3a8d0Sopenharmony_ci    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
4936a3a8d0Sopenharmony_ci    'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
5036a3a8d0Sopenharmony_ci    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
5136a3a8d0Sopenharmony_ci};
5236a3a8d0Sopenharmony_ci
5336a3a8d0Sopenharmony_ciRState Utils::GetMediaBase64Data(const std::string& iconPath, std::string &base64Data)
5436a3a8d0Sopenharmony_ci{
5536a3a8d0Sopenharmony_ci    size_t len = 0;
5636a3a8d0Sopenharmony_ci    auto tempData = Utils::LoadResourceFile(iconPath, len);
5736a3a8d0Sopenharmony_ci    if (tempData == nullptr) {
5836a3a8d0Sopenharmony_ci        RESMGR_HILOGE(RESMGR_TAG, "get the tempData error");
5936a3a8d0Sopenharmony_ci        return NOT_FOUND;
6036a3a8d0Sopenharmony_ci    }
6136a3a8d0Sopenharmony_ci    auto pos = iconPath.find_last_of('.');
6236a3a8d0Sopenharmony_ci    std::string imgType;
6336a3a8d0Sopenharmony_ci    if (pos != std::string::npos) {
6436a3a8d0Sopenharmony_ci        imgType = iconPath.substr(pos + 1);
6536a3a8d0Sopenharmony_ci    }
6636a3a8d0Sopenharmony_ci    Utils::EncodeBase64(tempData, len, imgType, base64Data);
6736a3a8d0Sopenharmony_ci    return SUCCESS;
6836a3a8d0Sopenharmony_ci}
6936a3a8d0Sopenharmony_ci
7036a3a8d0Sopenharmony_cistd::unique_ptr<uint8_t[]> Utils::LoadResourceFile(const std::string &path, size_t &len)
7136a3a8d0Sopenharmony_ci{
7236a3a8d0Sopenharmony_ci    std::ifstream mediaStream(path, std::ios::binary);
7336a3a8d0Sopenharmony_ci    if (!mediaStream.is_open()) {
7436a3a8d0Sopenharmony_ci        return nullptr;
7536a3a8d0Sopenharmony_ci    }
7636a3a8d0Sopenharmony_ci    mediaStream.seekg(0, std::ios::end);
7736a3a8d0Sopenharmony_ci    int length = mediaStream.tellg();
7836a3a8d0Sopenharmony_ci    if (length == ERROR_RESULT) {
7936a3a8d0Sopenharmony_ci        RESMGR_HILOGE(RESMGR_TAG, "failed to get the file length");
8036a3a8d0Sopenharmony_ci        return nullptr;
8136a3a8d0Sopenharmony_ci    } else {
8236a3a8d0Sopenharmony_ci        len = static_cast<size_t>(length);
8336a3a8d0Sopenharmony_ci    }
8436a3a8d0Sopenharmony_ci    std::unique_ptr<uint8_t[]> tempData = std::make_unique<uint8_t[]>(len);
8536a3a8d0Sopenharmony_ci    if (tempData == nullptr) {
8636a3a8d0Sopenharmony_ci        return nullptr;
8736a3a8d0Sopenharmony_ci    }
8836a3a8d0Sopenharmony_ci    mediaStream.seekg(0, std::ios::beg);
8936a3a8d0Sopenharmony_ci    mediaStream.read(reinterpret_cast<char *>(tempData.get()), len);
9036a3a8d0Sopenharmony_ci    return tempData;
9136a3a8d0Sopenharmony_ci}
9236a3a8d0Sopenharmony_ci
9336a3a8d0Sopenharmony_ciRState Utils::EncodeBase64(std::unique_ptr<uint8_t[]> &data, int srcLen,
9436a3a8d0Sopenharmony_ci    const std::string &imgType, std::string &dstData)
9536a3a8d0Sopenharmony_ci{
9636a3a8d0Sopenharmony_ci    const unsigned char *srcData = data.get();
9736a3a8d0Sopenharmony_ci    if (srcData == nullptr) {
9836a3a8d0Sopenharmony_ci        return ERROR;
9936a3a8d0Sopenharmony_ci    }
10036a3a8d0Sopenharmony_ci    std::string base64data;
10136a3a8d0Sopenharmony_ci    base64data += "data:image/" + imgType + ";base64,";
10236a3a8d0Sopenharmony_ci    int i = 0;
10336a3a8d0Sopenharmony_ci    // encode in groups of every 3 bytes
10436a3a8d0Sopenharmony_ci    for (; i <= srcLen - 3; i += 3) {
10536a3a8d0Sopenharmony_ci        unsigned char byte1 = static_cast<unsigned char>(srcData[i]);
10636a3a8d0Sopenharmony_ci        unsigned char byte2 = static_cast<unsigned char>(srcData[i + 1]);
10736a3a8d0Sopenharmony_ci        unsigned char byte3 = static_cast<unsigned char>(srcData[i + 2]);
10836a3a8d0Sopenharmony_ci        base64data += g_codes[byte1 >> BitOperatorNum::BIT_TWO];
10936a3a8d0Sopenharmony_ci        base64data += g_codes[((byte1 & 0x3) << BitOperatorNum::BIT_FOUR) | (byte2 >> BitOperatorNum::BIT_FOUR)];
11036a3a8d0Sopenharmony_ci        base64data += g_codes[((byte2 & 0xF) << BitOperatorNum::BIT_TWO) | (byte3 >> BitOperatorNum::BIT_SIX)];
11136a3a8d0Sopenharmony_ci        base64data += g_codes[byte3 & 0x3F];
11236a3a8d0Sopenharmony_ci    }
11336a3a8d0Sopenharmony_ci
11436a3a8d0Sopenharmony_ci    if (i >= srcLen) {
11536a3a8d0Sopenharmony_ci        dstData = base64data;
11636a3a8d0Sopenharmony_ci        return SUCCESS;
11736a3a8d0Sopenharmony_ci    }
11836a3a8d0Sopenharmony_ci
11936a3a8d0Sopenharmony_ci    // Handle the case where there is one element left
12036a3a8d0Sopenharmony_ci    if (srcLen % ArrayLen::LEN_THREE == 1) {
12136a3a8d0Sopenharmony_ci        unsigned char byte1 = static_cast<unsigned char>(srcData[i]);
12236a3a8d0Sopenharmony_ci        base64data += g_codes[byte1 >> BitOperatorNum::BIT_TWO];
12336a3a8d0Sopenharmony_ci        base64data += g_codes[(byte1 & 0x3) << BitOperatorNum::BIT_FOUR];
12436a3a8d0Sopenharmony_ci        base64data += '=';
12536a3a8d0Sopenharmony_ci        base64data += '=';
12636a3a8d0Sopenharmony_ci    } else if (srcLen % ArrayLen::LEN_THREE == ArrayIndex::INDEX_TWO) {
12736a3a8d0Sopenharmony_ci        unsigned char byte1 = static_cast<unsigned char>(srcData[i]);
12836a3a8d0Sopenharmony_ci        unsigned char byte2 = static_cast<unsigned char>(srcData[i + 1]);
12936a3a8d0Sopenharmony_ci        base64data += g_codes[byte1 >> BitOperatorNum::BIT_TWO];
13036a3a8d0Sopenharmony_ci        base64data += g_codes[((byte1 & 0x3) << BitOperatorNum::BIT_FOUR) | (byte2 >> BitOperatorNum::BIT_FOUR)];
13136a3a8d0Sopenharmony_ci        base64data += g_codes[(byte2 & 0xF) << BitOperatorNum::BIT_TWO];
13236a3a8d0Sopenharmony_ci        base64data += '=';
13336a3a8d0Sopenharmony_ci    }
13436a3a8d0Sopenharmony_ci    dstData = base64data;
13536a3a8d0Sopenharmony_ci    return SUCCESS;
13636a3a8d0Sopenharmony_ci}
13736a3a8d0Sopenharmony_ci
13836a3a8d0Sopenharmony_cibool Utils::IsAlphaString(const char *s, int32_t len)
13936a3a8d0Sopenharmony_ci{
14036a3a8d0Sopenharmony_ci    if (s == nullptr) {
14136a3a8d0Sopenharmony_ci        return false;
14236a3a8d0Sopenharmony_ci    }
14336a3a8d0Sopenharmony_ci    int32_t i;
14436a3a8d0Sopenharmony_ci    for (i = 0; i < len; i++) {
14536a3a8d0Sopenharmony_ci        char c = *(s + i);
14636a3a8d0Sopenharmony_ci        if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))) {
14736a3a8d0Sopenharmony_ci            return false;
14836a3a8d0Sopenharmony_ci        }
14936a3a8d0Sopenharmony_ci    }
15036a3a8d0Sopenharmony_ci    return true;
15136a3a8d0Sopenharmony_ci}
15236a3a8d0Sopenharmony_ci
15336a3a8d0Sopenharmony_cibool Utils::IsNumericString(const char *s, int32_t len)
15436a3a8d0Sopenharmony_ci{
15536a3a8d0Sopenharmony_ci    if (s == nullptr) {
15636a3a8d0Sopenharmony_ci        return false;
15736a3a8d0Sopenharmony_ci    }
15836a3a8d0Sopenharmony_ci    int32_t i;
15936a3a8d0Sopenharmony_ci    for (i = 0; i < len; i++) {
16036a3a8d0Sopenharmony_ci        char c = *(s + i);
16136a3a8d0Sopenharmony_ci        if (!(c >= '0' && c <= '9')) {
16236a3a8d0Sopenharmony_ci            return false;
16336a3a8d0Sopenharmony_ci        }
16436a3a8d0Sopenharmony_ci    }
16536a3a8d0Sopenharmony_ci
16636a3a8d0Sopenharmony_ci    return true;
16736a3a8d0Sopenharmony_ci}
16836a3a8d0Sopenharmony_ci
16936a3a8d0Sopenharmony_ci/**
17036a3a8d0Sopenharmony_ci * @brief decode 32 bits as script array.
17136a3a8d0Sopenharmony_ci * 31-24 bits is script[0]
17236a3a8d0Sopenharmony_ci * 23-16 bits is script[1]
17336a3a8d0Sopenharmony_ci * 15-8 bits is script[2]
17436a3a8d0Sopenharmony_ci * 0-7 bits is script[3]
17536a3a8d0Sopenharmony_ci *
17636a3a8d0Sopenharmony_ci * @param encodeScript
17736a3a8d0Sopenharmony_ci * @param outValue
17836a3a8d0Sopenharmony_ci */
17936a3a8d0Sopenharmony_civoid Utils::DecodeScript(uint32_t encodeScript, char *outValue)
18036a3a8d0Sopenharmony_ci{
18136a3a8d0Sopenharmony_ci    if (outValue == nullptr) {
18236a3a8d0Sopenharmony_ci        return;
18336a3a8d0Sopenharmony_ci    }
18436a3a8d0Sopenharmony_ci    outValue[ArrayIndex::INDEX_ZERO] = (encodeScript & 0xFF000000) >> BitOperatorNum::BIT_TWENTY_FOUR;
18536a3a8d0Sopenharmony_ci    outValue[ArrayIndex::INDEX_ONE] = (encodeScript & 0x00FF0000) >> BitOperatorNum::BIT_SIXTEEN;
18636a3a8d0Sopenharmony_ci    outValue[ArrayIndex::INDEX_TWO] = (encodeScript & 0x0000FF00) >> BitOperatorNum::BIT_EIGHT;
18736a3a8d0Sopenharmony_ci    outValue[ArrayIndex::INDEX_THREE] = (encodeScript & 0x000000FF);
18836a3a8d0Sopenharmony_ci}
18936a3a8d0Sopenharmony_ci
19036a3a8d0Sopenharmony_cibool Utils::IsStrEmpty(const char *s)
19136a3a8d0Sopenharmony_ci{
19236a3a8d0Sopenharmony_ci    return (s == nullptr || *s == '\0');
19336a3a8d0Sopenharmony_ci}
19436a3a8d0Sopenharmony_ci
19536a3a8d0Sopenharmony_cisize_t Utils::StrLen(const char *s)
19636a3a8d0Sopenharmony_ci{
19736a3a8d0Sopenharmony_ci    if (s == nullptr) {
19836a3a8d0Sopenharmony_ci        return 0;
19936a3a8d0Sopenharmony_ci    }
20036a3a8d0Sopenharmony_ci    return strlen(s);
20136a3a8d0Sopenharmony_ci}
20236a3a8d0Sopenharmony_ci
20336a3a8d0Sopenharmony_ciuint16_t Utils::EncodeLanguage(const char *language)
20436a3a8d0Sopenharmony_ci{
20536a3a8d0Sopenharmony_ci    if (Utils::IsStrEmpty(language)) {
20636a3a8d0Sopenharmony_ci        return NULL_LANGUAGE;
20736a3a8d0Sopenharmony_ci    }
20836a3a8d0Sopenharmony_ci    return Utils::EncodeLanguageOrRegion(language, 'a');
20936a3a8d0Sopenharmony_ci}
21036a3a8d0Sopenharmony_ci
21136a3a8d0Sopenharmony_ci/**
21236a3a8d0Sopenharmony_ci * @brief  locale compose of language,script and region,encode as 64bits.
21336a3a8d0Sopenharmony_ci * 63-48 bits represent language,detail format see EncodeLanguageOrRegion method
21436a3a8d0Sopenharmony_ci * 47-16 bits represent script,detail format see EncodeScript method
21536a3a8d0Sopenharmony_ci * 15-0 bits represent region,detail format see EncodeLanguageOrRegion method
21636a3a8d0Sopenharmony_ci *
21736a3a8d0Sopenharmony_ci * @param language
21836a3a8d0Sopenharmony_ci * @param script
21936a3a8d0Sopenharmony_ci * @param region
22036a3a8d0Sopenharmony_ci * @return uint64_t
22136a3a8d0Sopenharmony_ci */
22236a3a8d0Sopenharmony_ciuint64_t Utils::EncodeLocale(const char *language,
22336a3a8d0Sopenharmony_ci                             const char *script,
22436a3a8d0Sopenharmony_ci                             const char *region)
22536a3a8d0Sopenharmony_ci{
22636a3a8d0Sopenharmony_ci    uint16_t languageData = Utils::EncodeLanguage(language);
22736a3a8d0Sopenharmony_ci    uint32_t scriptData = Utils::EncodeScript(script);
22836a3a8d0Sopenharmony_ci    uint16_t regionData = Utils::EncodeRegion(region);
22936a3a8d0Sopenharmony_ci
23036a3a8d0Sopenharmony_ci    return (uint64_t)(0xffff000000000000 & (((uint64_t)languageData) << BitOperatorNum::BIT_FORTY_EIGHT)) |
23136a3a8d0Sopenharmony_ci           (0x0000ffffffff0000 & (((uint64_t)scriptData) << BitOperatorNum::BIT_SIXTEEN)) |
23236a3a8d0Sopenharmony_ci           (0x000000000000ffff & (uint64_t)(regionData));
23336a3a8d0Sopenharmony_ci}
23436a3a8d0Sopenharmony_ci
23536a3a8d0Sopenharmony_ciuint16_t Utils::EncodeRegionByResLocale(const ResLocale *locale)
23636a3a8d0Sopenharmony_ci{
23736a3a8d0Sopenharmony_ci    if (locale == nullptr) {
23836a3a8d0Sopenharmony_ci        return NULL_REGION;
23936a3a8d0Sopenharmony_ci    }
24036a3a8d0Sopenharmony_ci    return Utils::EncodeRegion(locale->GetRegion());
24136a3a8d0Sopenharmony_ci}
24236a3a8d0Sopenharmony_ci
24336a3a8d0Sopenharmony_ciuint16_t Utils::EncodeLanguageByResLocale(const ResLocale *locale)
24436a3a8d0Sopenharmony_ci{
24536a3a8d0Sopenharmony_ci    if (locale == nullptr) {
24636a3a8d0Sopenharmony_ci        return NULL_LANGUAGE;
24736a3a8d0Sopenharmony_ci    }
24836a3a8d0Sopenharmony_ci    return Utils::EncodeLanguage(locale->GetLanguage());
24936a3a8d0Sopenharmony_ci}
25036a3a8d0Sopenharmony_ci
25136a3a8d0Sopenharmony_ciuint32_t Utils::EncodeScriptByResLocale(const ResLocale *locale)
25236a3a8d0Sopenharmony_ci{
25336a3a8d0Sopenharmony_ci    if (locale == nullptr) {
25436a3a8d0Sopenharmony_ci        return NULL_SCRIPT;
25536a3a8d0Sopenharmony_ci    }
25636a3a8d0Sopenharmony_ci    return Utils::EncodeScript(locale->GetScript());
25736a3a8d0Sopenharmony_ci}
25836a3a8d0Sopenharmony_ci
25936a3a8d0Sopenharmony_ciuint16_t Utils::EncodeRegion(const char *region)
26036a3a8d0Sopenharmony_ci{
26136a3a8d0Sopenharmony_ci    if (Utils::IsStrEmpty(region)) {
26236a3a8d0Sopenharmony_ci        return NULL_REGION;
26336a3a8d0Sopenharmony_ci    }
26436a3a8d0Sopenharmony_ci    if (region[0] >= '0' && region[0] <= '9') {
26536a3a8d0Sopenharmony_ci        return Utils::EncodeLanguageOrRegion(region, '0');
26636a3a8d0Sopenharmony_ci    }
26736a3a8d0Sopenharmony_ci    return Utils::EncodeLanguageOrRegion(region, 'A');
26836a3a8d0Sopenharmony_ci}
26936a3a8d0Sopenharmony_ci
27036a3a8d0Sopenharmony_ci/**
27136a3a8d0Sopenharmony_ci * @brief script is four letter array.encode script array as four bytes.Encode format.
27236a3a8d0Sopenharmony_ci * 31-24 bits represent script[0]
27336a3a8d0Sopenharmony_ci * 23-16 bits represent script[1]
27436a3a8d0Sopenharmony_ci * 15-8 bits represent script[2]
27536a3a8d0Sopenharmony_ci * 0-7 bits represent script[3]
27636a3a8d0Sopenharmony_ci *
27736a3a8d0Sopenharmony_ci * @param script
27836a3a8d0Sopenharmony_ci * @return uint32_t
27936a3a8d0Sopenharmony_ci */
28036a3a8d0Sopenharmony_ciuint32_t Utils::EncodeScript(const char *script)
28136a3a8d0Sopenharmony_ci{
28236a3a8d0Sopenharmony_ci    if (Utils::IsStrEmpty(script)) {
28336a3a8d0Sopenharmony_ci        return NULL_SCRIPT;
28436a3a8d0Sopenharmony_ci    }
28536a3a8d0Sopenharmony_ci    return ((uint8_t)script[ArrayIndex::INDEX_ZERO] << BitOperatorNum::BIT_TWENTY_FOUR) |
28636a3a8d0Sopenharmony_ci        ((uint8_t)script[ArrayIndex::INDEX_ONE] << BitOperatorNum::BIT_SIXTEEN) |
28736a3a8d0Sopenharmony_ci        ((uint8_t)script[ArrayIndex::INDEX_TWO] << BitOperatorNum::BIT_EIGHT) |
28836a3a8d0Sopenharmony_ci        (uint8_t)script[ArrayIndex::INDEX_THREE];
28936a3a8d0Sopenharmony_ci}
29036a3a8d0Sopenharmony_ci
29136a3a8d0Sopenharmony_ci/**
29236a3a8d0Sopenharmony_ci * @brief encode language or region str as two byte.
29336a3a8d0Sopenharmony_ci * language is two or three lowercase.
29436a3a8d0Sopenharmony_ci * region is two capital  letter or three digit.
29536a3a8d0Sopenharmony_ci *
29636a3a8d0Sopenharmony_ci * two char,encode format
29736a3a8d0Sopenharmony_ci * 15-8 bits is the first char
29836a3a8d0Sopenharmony_ci * 7-0 bits is the second char
29936a3a8d0Sopenharmony_ci *
30036a3a8d0Sopenharmony_ci * three chars,encode format
30136a3a8d0Sopenharmony_ci * 15 bit is 1
30236a3a8d0Sopenharmony_ci * 14-10 bits represent the value of  the first char subtract base char,
30336a3a8d0Sopenharmony_ci * 9-5 bits represent the value of the second char subtract base char  .
30436a3a8d0Sopenharmony_ci * 4-0 bits represent the value of the third char subtract base char.
30536a3a8d0Sopenharmony_ci * base char is 'a','A','0'.
30636a3a8d0Sopenharmony_ci * example when base is 'a',max value('z' - 'a') is 26,so five bits can represent a char.
30736a3a8d0Sopenharmony_ci *
30836a3a8d0Sopenharmony_ci * @param str
30936a3a8d0Sopenharmony_ci * @param base is '0' or 'a' or 'A'
31036a3a8d0Sopenharmony_ci * @return uint16_t
31136a3a8d0Sopenharmony_ci */
31236a3a8d0Sopenharmony_ciuint16_t Utils::EncodeLanguageOrRegion(const char *str, char base)
31336a3a8d0Sopenharmony_ci{
31436a3a8d0Sopenharmony_ci    if (str[ArrayIndex::INDEX_TWO] == 0 || str[ArrayIndex::INDEX_TWO] == '-' || str[ArrayIndex::INDEX_TWO] == '_') {
31536a3a8d0Sopenharmony_ci        return ((uint8_t)str[ArrayIndex::INDEX_ZERO] << BitOperatorNum::BIT_EIGHT) |
31636a3a8d0Sopenharmony_ci            ((uint8_t)str[ArrayIndex::INDEX_ONE]);
31736a3a8d0Sopenharmony_ci    }
31836a3a8d0Sopenharmony_ci    uint8_t first = ((uint8_t)(str[ArrayIndex::INDEX_ZERO] - base)) & 0x7f;
31936a3a8d0Sopenharmony_ci    uint8_t second = ((uint8_t)(str[ArrayIndex::INDEX_ONE] - base)) & 0x7f;
32036a3a8d0Sopenharmony_ci    uint8_t third = ((uint8_t)(str[ArrayIndex::INDEX_TWO] - base)) & 0x7f;
32136a3a8d0Sopenharmony_ci    return ((0x80 | (first << BitOperatorNum::BIT_TWO) | (second >> BitOperatorNum::BIT_THREE)) <<
32236a3a8d0Sopenharmony_ci        BitOperatorNum::BIT_EIGHT) | ((second << BitOperatorNum::BIT_FIVE) | third);
32336a3a8d0Sopenharmony_ci};
32436a3a8d0Sopenharmony_ci
32536a3a8d0Sopenharmony_ci/**
32636a3a8d0Sopenharmony_ci * @brief convert hex char as int value
32736a3a8d0Sopenharmony_ci *
32836a3a8d0Sopenharmony_ci * @param c
32936a3a8d0Sopenharmony_ci * @param state
33036a3a8d0Sopenharmony_ci * @return uint32_t
33136a3a8d0Sopenharmony_ci */
33236a3a8d0Sopenharmony_cistatic uint32_t ParseHex(char c, RState &state)
33336a3a8d0Sopenharmony_ci{
33436a3a8d0Sopenharmony_ci    if (c >= '0' && c <= '9') {
33536a3a8d0Sopenharmony_ci        return (c - '0');
33636a3a8d0Sopenharmony_ci    } else if (c >= 'a' && c <= 'f') {
33736a3a8d0Sopenharmony_ci        return (c - 'a' + 0xa);
33836a3a8d0Sopenharmony_ci    } else if (c >= 'A' && c <= 'F') {
33936a3a8d0Sopenharmony_ci        return (c - 'A' + 0xa);
34036a3a8d0Sopenharmony_ci    }
34136a3a8d0Sopenharmony_ci    state = INVALID_FORMAT;
34236a3a8d0Sopenharmony_ci    return -1;
34336a3a8d0Sopenharmony_ci}
34436a3a8d0Sopenharmony_ci
34536a3a8d0Sopenharmony_civoid ConvertColorRgbToUInt32(const char *s, uint32_t &color, RState &parseState)
34636a3a8d0Sopenharmony_ci{
34736a3a8d0Sopenharmony_ci    color |= 0xFF000000;
34836a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_ONE], parseState) << BitOperatorNum::BIT_TWENTY;
34936a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_ONE], parseState) << BitOperatorNum::BIT_SIXTEEN;
35036a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_TWO], parseState) << BitOperatorNum::BIT_TWELVE;
35136a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_TWO], parseState) << BitOperatorNum::BIT_EIGHT;
35236a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_THREE], parseState) << BitOperatorNum::BIT_FOUR;
35336a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_THREE], parseState);
35436a3a8d0Sopenharmony_ci}
35536a3a8d0Sopenharmony_ci
35636a3a8d0Sopenharmony_civoid ConvertColorArgbToUInt32(const char *s, uint32_t &color, RState &parseState)
35736a3a8d0Sopenharmony_ci{
35836a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_ONE], parseState) << BitOperatorNum::BIT_TWENTY_EIGHT;
35936a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_ONE], parseState) << BitOperatorNum::BIT_TWENTY_FOUR;
36036a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_TWO], parseState) << BitOperatorNum::BIT_TWENTY;
36136a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_TWO], parseState) << BitOperatorNum::BIT_SIXTEEN;
36236a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_THREE], parseState) << BitOperatorNum::BIT_TWELVE;
36336a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_THREE], parseState) << BitOperatorNum::BIT_EIGHT;
36436a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_FOUR], parseState) << BitOperatorNum::BIT_FOUR;
36536a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_FOUR], parseState);
36636a3a8d0Sopenharmony_ci}
36736a3a8d0Sopenharmony_ci
36836a3a8d0Sopenharmony_civoid ConvertColorSixRgbToUInt32(const char *s, uint32_t &color, RState &parseState)
36936a3a8d0Sopenharmony_ci{
37036a3a8d0Sopenharmony_ci    color |= 0xFF000000;
37136a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_ONE], parseState) << BitOperatorNum::BIT_TWENTY;
37236a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_TWO], parseState) << BitOperatorNum::BIT_SIXTEEN;
37336a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_THREE], parseState) << BitOperatorNum::BIT_TWELVE;
37436a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_FOUR], parseState) << BitOperatorNum::BIT_EIGHT;
37536a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_FIVE], parseState) << BitOperatorNum::BIT_FOUR;
37636a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_SIX], parseState);
37736a3a8d0Sopenharmony_ci}
37836a3a8d0Sopenharmony_ci
37936a3a8d0Sopenharmony_civoid ConvertColorEightRgbToUInt32(const char *s, uint32_t &color, RState &parseState)
38036a3a8d0Sopenharmony_ci{
38136a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_ONE], parseState) << BitOperatorNum::BIT_TWENTY_EIGHT;
38236a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_TWO], parseState) << BitOperatorNum::BIT_TWENTY_FOUR;
38336a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_THREE], parseState) << BitOperatorNum::BIT_TWENTY;
38436a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_FOUR], parseState) << BitOperatorNum::BIT_SIXTEEN;
38536a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_FIVE], parseState) << BitOperatorNum::BIT_TWELVE;
38636a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_SIX], parseState) << BitOperatorNum::BIT_EIGHT;
38736a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_SEVEN], parseState) << BitOperatorNum::BIT_FOUR;
38836a3a8d0Sopenharmony_ci    color |= ParseHex(s[ArrayIndex::INDEX_EIGHT], parseState);
38936a3a8d0Sopenharmony_ci}
39036a3a8d0Sopenharmony_ci
39136a3a8d0Sopenharmony_ci/**
39236a3a8d0Sopenharmony_ci * @brief  convert color string to 32 bits value 0xaarrggbb.
39336a3a8d0Sopenharmony_ci * color string format is
39436a3a8d0Sopenharmony_ci * #rgb  red (0-f) greed(0-f) blue(0-f)
39536a3a8d0Sopenharmony_ci * #argb transparency(0-f)  red (0-f) greed(0-f) blue(0-f)
39636a3a8d0Sopenharmony_ci * #rrggbb red (00-ff) greed(00-ff) blue(00-ff)
39736a3a8d0Sopenharmony_ci * #aarrggbb transparency(00-ff) red (00-ff) greed(00-ff) blue(00-ff)
39836a3a8d0Sopenharmony_ci *
39936a3a8d0Sopenharmony_ci * @param s
40036a3a8d0Sopenharmony_ci * @param outValue
40136a3a8d0Sopenharmony_ci * @return RState
40236a3a8d0Sopenharmony_ci */
40336a3a8d0Sopenharmony_ciRState Utils::ConvertColorToUInt32(const char *s, uint32_t &outValue)
40436a3a8d0Sopenharmony_ci{
40536a3a8d0Sopenharmony_ci    if (s == nullptr) {
40636a3a8d0Sopenharmony_ci        return INVALID_FORMAT;
40736a3a8d0Sopenharmony_ci    }
40836a3a8d0Sopenharmony_ci    uint32_t color = 0;
40936a3a8d0Sopenharmony_ci    RState parseState = SUCCESS;
41036a3a8d0Sopenharmony_ci    size_t len = strlen(s);
41136a3a8d0Sopenharmony_ci    if (*s == '#') {
41236a3a8d0Sopenharmony_ci        if (len == ArrayLen::LEN_FOUR) {
41336a3a8d0Sopenharmony_ci            ConvertColorRgbToUInt32(s, color, parseState);
41436a3a8d0Sopenharmony_ci        } else if (len == ArrayLen::LEN_FIVE) {
41536a3a8d0Sopenharmony_ci            ConvertColorArgbToUInt32(s, color, parseState);
41636a3a8d0Sopenharmony_ci        } else if (len == ArrayLen::LEN_SEVEN) {
41736a3a8d0Sopenharmony_ci            ConvertColorSixRgbToUInt32(s, color, parseState);
41836a3a8d0Sopenharmony_ci        } else if (len == ArrayLen::LEN_NINE) {
41936a3a8d0Sopenharmony_ci            ConvertColorEightRgbToUInt32(s, color, parseState);
42036a3a8d0Sopenharmony_ci        } else {
42136a3a8d0Sopenharmony_ci            return INVALID_FORMAT;
42236a3a8d0Sopenharmony_ci        }
42336a3a8d0Sopenharmony_ci    } else {
42436a3a8d0Sopenharmony_ci        parseState = INVALID_FORMAT;
42536a3a8d0Sopenharmony_ci    }
42636a3a8d0Sopenharmony_ci    outValue = color;
42736a3a8d0Sopenharmony_ci    return parseState;
42836a3a8d0Sopenharmony_ci}
42936a3a8d0Sopenharmony_ci
43036a3a8d0Sopenharmony_cibool Utils::endWithTail(const std::string& path, const std::string& tail)
43136a3a8d0Sopenharmony_ci{
43236a3a8d0Sopenharmony_ci    if (path.size() < tail.size()) {
43336a3a8d0Sopenharmony_ci        RESMGR_HILOGE(RESMGR_TAG, "the path is shorter than tail");
43436a3a8d0Sopenharmony_ci        return false;
43536a3a8d0Sopenharmony_ci    }
43636a3a8d0Sopenharmony_ci    return path.compare(path.size() - tail.size(), tail.size(), tail) == 0;
43736a3a8d0Sopenharmony_ci}
43836a3a8d0Sopenharmony_ci
43936a3a8d0Sopenharmony_cibool Utils::IsFileExist(const std::string& filePath)
44036a3a8d0Sopenharmony_ci{
44136a3a8d0Sopenharmony_ci    struct stat buffer;
44236a3a8d0Sopenharmony_ci    return (stat(filePath.c_str(), &buffer) == 0);
44336a3a8d0Sopenharmony_ci}
44436a3a8d0Sopenharmony_ci
44536a3a8d0Sopenharmony_cibool Utils::ContainsTail(std::string hapPath, std::set<std::string> tailSet)
44636a3a8d0Sopenharmony_ci{
44736a3a8d0Sopenharmony_ci    for (auto tail : tailSet) {
44836a3a8d0Sopenharmony_ci        if (Utils::endWithTail(hapPath, tail)) {
44936a3a8d0Sopenharmony_ci            return true;
45036a3a8d0Sopenharmony_ci        }
45136a3a8d0Sopenharmony_ci    }
45236a3a8d0Sopenharmony_ci    return false;
45336a3a8d0Sopenharmony_ci}
45436a3a8d0Sopenharmony_ci
45536a3a8d0Sopenharmony_civoid Utils::CanonicalizePath(const char *path, char *outPath, size_t len)
45636a3a8d0Sopenharmony_ci{
45736a3a8d0Sopenharmony_ci#if !defined(__WINNT__) && !defined(__IDE_PREVIEW__) && !defined(__ARKUI_CROSS__)
45836a3a8d0Sopenharmony_ci    HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__);
45936a3a8d0Sopenharmony_ci#endif
46036a3a8d0Sopenharmony_ci    if (path == nullptr) {
46136a3a8d0Sopenharmony_ci        RESMGR_HILOGE(RESMGR_TAG, "path is null");
46236a3a8d0Sopenharmony_ci        return;
46336a3a8d0Sopenharmony_ci    }
46436a3a8d0Sopenharmony_ci    if (strlen(path) >= len) {
46536a3a8d0Sopenharmony_ci        RESMGR_HILOGE(RESMGR_TAG, "the length of path longer than len");
46636a3a8d0Sopenharmony_ci        return;
46736a3a8d0Sopenharmony_ci    }
46836a3a8d0Sopenharmony_ci#ifdef __WINNT__
46936a3a8d0Sopenharmony_ci    if (!PathCanonicalizeA(outPath, path)) {
47036a3a8d0Sopenharmony_ci        RESMGR_HILOGE(RESMGR_TAG, "failed to canonicalize the path");
47136a3a8d0Sopenharmony_ci        return;
47236a3a8d0Sopenharmony_ci    }
47336a3a8d0Sopenharmony_ci#else
47436a3a8d0Sopenharmony_ci    if (realpath(path, outPath) == nullptr) {
47536a3a8d0Sopenharmony_ci        RESMGR_HILOGE(RESMGR_TAG, "failed to realpath the path, %{public}s, errno:%{public}d", path, errno);
47636a3a8d0Sopenharmony_ci        return;
47736a3a8d0Sopenharmony_ci    }
47836a3a8d0Sopenharmony_ci#endif
47936a3a8d0Sopenharmony_ci}
48036a3a8d0Sopenharmony_ci
48136a3a8d0Sopenharmony_ciRState Utils::GetFiles(const std::string &strCurrentDir, std::vector<std::string> &vFiles)
48236a3a8d0Sopenharmony_ci{
48336a3a8d0Sopenharmony_ci#if !defined(__WINNT__) && !defined(__IDE_PREVIEW__)
48436a3a8d0Sopenharmony_ci    char outPath[PATH_MAX + 1] = {0};
48536a3a8d0Sopenharmony_ci    Utils::CanonicalizePath(strCurrentDir.c_str(), outPath, PATH_MAX);
48636a3a8d0Sopenharmony_ci    if (outPath[0] == '\0') {
48736a3a8d0Sopenharmony_ci        RESMGR_HILOGE(RESMGR_TAG, "invalid path, %{public}s", strCurrentDir.c_str());
48836a3a8d0Sopenharmony_ci        return ERROR_CODE_RES_PATH_INVALID;
48936a3a8d0Sopenharmony_ci    }
49036a3a8d0Sopenharmony_ci    DIR *dir;
49136a3a8d0Sopenharmony_ci    struct dirent *pDir;
49236a3a8d0Sopenharmony_ci    if ((dir = opendir(strCurrentDir.c_str())) == nullptr) {
49336a3a8d0Sopenharmony_ci        RESMGR_HILOGE(RESMGR_TAG, "opendir failed strCurrentDir = %{public}s", strCurrentDir.c_str());
49436a3a8d0Sopenharmony_ci        return ERROR_CODE_RES_PATH_INVALID;
49536a3a8d0Sopenharmony_ci    }
49636a3a8d0Sopenharmony_ci    while ((pDir = readdir(dir)) != nullptr) {
49736a3a8d0Sopenharmony_ci        if (strcmp(pDir->d_name, ".") == 0 || strcmp(pDir->d_name, "..") == 0) {
49836a3a8d0Sopenharmony_ci            continue;
49936a3a8d0Sopenharmony_ci        }
50036a3a8d0Sopenharmony_ci        if (pDir->d_type != DT_REG && pDir->d_type != DT_DIR) {
50136a3a8d0Sopenharmony_ci            continue;
50236a3a8d0Sopenharmony_ci        }
50336a3a8d0Sopenharmony_ci        vFiles.emplace_back(pDir->d_name);
50436a3a8d0Sopenharmony_ci    }
50536a3a8d0Sopenharmony_ci    closedir(dir);
50636a3a8d0Sopenharmony_ci#endif
50736a3a8d0Sopenharmony_ci    return SUCCESS;
50836a3a8d0Sopenharmony_ci}
50936a3a8d0Sopenharmony_ci} // namespace Resource
51036a3a8d0Sopenharmony_ci} // namespace Global
51136a3a8d0Sopenharmony_ci} // namespace OHOS
512