13920e296Sopenharmony_ci/*
23920e296Sopenharmony_ci * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
33920e296Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
43920e296Sopenharmony_ci * you may not use this file except in compliance with the License.
53920e296Sopenharmony_ci * You may obtain a copy of the License at
63920e296Sopenharmony_ci *
73920e296Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
83920e296Sopenharmony_ci *
93920e296Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
103920e296Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
113920e296Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
123920e296Sopenharmony_ci * See the License for the specific language governing permissions and
133920e296Sopenharmony_ci * limitations under the License.
143920e296Sopenharmony_ci */
153920e296Sopenharmony_ci
163920e296Sopenharmony_ci#include "resource_util.h"
173920e296Sopenharmony_ci#include <algorithm>
183920e296Sopenharmony_ci#include <cstdlib>
193920e296Sopenharmony_ci#include <fstream>
203920e296Sopenharmony_ci#include <mutex>
213920e296Sopenharmony_ci#include <iostream>
223920e296Sopenharmony_ci#include <iomanip>
233920e296Sopenharmony_ci#include <regex>
243920e296Sopenharmony_ci#include <sstream>
253920e296Sopenharmony_ci#include "file_entry.h"
263920e296Sopenharmony_ci
273920e296Sopenharmony_cinamespace OHOS {
283920e296Sopenharmony_cinamespace Global {
293920e296Sopenharmony_cinamespace Restool {
303920e296Sopenharmony_ciusing namespace std;
313920e296Sopenharmony_ciconst map<string, ResourceUtil::IgnoreType> ResourceUtil::IGNORE_FILE_REGEX = {
323920e296Sopenharmony_ci    { "\\.git", IgnoreType::IGNORE_ALL },
333920e296Sopenharmony_ci    { "\\.svn", IgnoreType::IGNORE_ALL },
343920e296Sopenharmony_ci    { ".+\\.scc", IgnoreType::IGNORE_ALL },
353920e296Sopenharmony_ci    { "\\.ds_store", IgnoreType::IGNORE_ALL },
363920e296Sopenharmony_ci    { "desktop\\.ini", IgnoreType::IGNORE_ALL },
373920e296Sopenharmony_ci    { "picasa\\.ini", IgnoreType::IGNORE_ALL },
383920e296Sopenharmony_ci    { "\\..+", IgnoreType::IGNORE_ALL },
393920e296Sopenharmony_ci    { "cvs", IgnoreType::IGNORE_ALL },
403920e296Sopenharmony_ci    { "thumbs\\.db", IgnoreType::IGNORE_ALL },
413920e296Sopenharmony_ci    { ".+~", IgnoreType::IGNORE_ALL }
423920e296Sopenharmony_ci};
433920e296Sopenharmony_ci
443920e296Sopenharmony_cistatic std::mutex fileMutex_;
453920e296Sopenharmony_ci
463920e296Sopenharmony_civoid ResourceUtil::Split(const string &str, vector<string> &out, const string &splitter)
473920e296Sopenharmony_ci{
483920e296Sopenharmony_ci    string::size_type len = str.size();
493920e296Sopenharmony_ci    string::size_type begin = 0;
503920e296Sopenharmony_ci    string::size_type end = str.find(splitter, begin);
513920e296Sopenharmony_ci    while (end != string::npos) {
523920e296Sopenharmony_ci        string sub = str.substr(begin, end - begin);
533920e296Sopenharmony_ci        out.push_back(sub);
543920e296Sopenharmony_ci        begin = end + splitter.size();
553920e296Sopenharmony_ci        if (begin >= len) {
563920e296Sopenharmony_ci            break;
573920e296Sopenharmony_ci        }
583920e296Sopenharmony_ci        end = str.find(splitter, begin);
593920e296Sopenharmony_ci    }
603920e296Sopenharmony_ci
613920e296Sopenharmony_ci    if (begin < len) {
623920e296Sopenharmony_ci        out.push_back(str.substr(begin));
633920e296Sopenharmony_ci    }
643920e296Sopenharmony_ci}
653920e296Sopenharmony_ci
663920e296Sopenharmony_cibool ResourceUtil::FileExist(const string &path)
673920e296Sopenharmony_ci{
683920e296Sopenharmony_ci    return FileEntry::Exist(path);
693920e296Sopenharmony_ci}
703920e296Sopenharmony_ci
713920e296Sopenharmony_cibool ResourceUtil::RmoveAllDir(const string &path)
723920e296Sopenharmony_ci{
733920e296Sopenharmony_ci    return FileEntry::RemoveAllDir(path);
743920e296Sopenharmony_ci}
753920e296Sopenharmony_ci
763920e296Sopenharmony_cibool ResourceUtil::RmoveFile(const string &path)
773920e296Sopenharmony_ci{
783920e296Sopenharmony_ci    return FileEntry::RemoveFile(path);
793920e296Sopenharmony_ci}
803920e296Sopenharmony_ci
813920e296Sopenharmony_cibool ResourceUtil::OpenJsonFile(const string &path, cJSON **root)
823920e296Sopenharmony_ci{
833920e296Sopenharmony_ci    ifstream ifs(FileEntry::AdaptLongPath(path), ios::binary);
843920e296Sopenharmony_ci    if (!ifs.is_open()) {
853920e296Sopenharmony_ci        cerr << "Error: open json failed '" << path << "', reason: " << strerror(errno) << endl;
863920e296Sopenharmony_ci        return false;
873920e296Sopenharmony_ci    }
883920e296Sopenharmony_ci
893920e296Sopenharmony_ci    string jsonString((istreambuf_iterator<char>(ifs)), istreambuf_iterator<char>());
903920e296Sopenharmony_ci    *root = cJSON_Parse(jsonString.c_str());
913920e296Sopenharmony_ci    if (!*root) {
923920e296Sopenharmony_ci        cerr << "Error: cJSON_Parse failed, please check the JSON file." << NEW_LINE_PATH << path << endl;
933920e296Sopenharmony_ci        cerr << SOLUTIONS << endl;
943920e296Sopenharmony_ci        cerr << SOLUTIONS_ARROW << "Check the JSON file and delete unnecessary commas (,)." << endl;
953920e296Sopenharmony_ci        cerr << SOLUTIONS_ARROW << "Check the JSON file to make sure the root bracket is {}" << endl;
963920e296Sopenharmony_ci        ifs.close();
973920e296Sopenharmony_ci        return false;
983920e296Sopenharmony_ci    }
993920e296Sopenharmony_ci    ifs.close();
1003920e296Sopenharmony_ci    return true;
1013920e296Sopenharmony_ci}
1023920e296Sopenharmony_ci
1033920e296Sopenharmony_cibool ResourceUtil::SaveToJsonFile(const string &path, const cJSON *root)
1043920e296Sopenharmony_ci{
1053920e296Sopenharmony_ci    ofstream out(FileEntry::AdaptLongPath(path), ofstream::out | ofstream::binary);
1063920e296Sopenharmony_ci    if (!out.is_open()) {
1073920e296Sopenharmony_ci        cerr << "Error: SaveToJsonFile open failed '" << path <<"', reason: " << strerror(errno) << endl;
1083920e296Sopenharmony_ci        return false;
1093920e296Sopenharmony_ci    }
1103920e296Sopenharmony_ci    char *jsonString = cJSON_Print(root);
1113920e296Sopenharmony_ci    out << jsonString;
1123920e296Sopenharmony_ci    free(jsonString);
1133920e296Sopenharmony_ci
1143920e296Sopenharmony_ci    out.close();
1153920e296Sopenharmony_ci    return true;
1163920e296Sopenharmony_ci}
1173920e296Sopenharmony_ci
1183920e296Sopenharmony_ciResType ResourceUtil::GetResTypeByDir(const string &name)
1193920e296Sopenharmony_ci{
1203920e296Sopenharmony_ci    auto ret = g_fileClusterMap.find(name);
1213920e296Sopenharmony_ci    if (ret == g_fileClusterMap.end()) {
1223920e296Sopenharmony_ci        return ResType::INVALID_RES_TYPE;
1233920e296Sopenharmony_ci    }
1243920e296Sopenharmony_ci    return ret->second;
1253920e296Sopenharmony_ci}
1263920e296Sopenharmony_ci
1273920e296Sopenharmony_cistring ResourceUtil::ResTypeToString(ResType type)
1283920e296Sopenharmony_ci{
1293920e296Sopenharmony_ci    auto ret = find_if(g_fileClusterMap.begin(), g_fileClusterMap.end(), [type](auto iter) {
1303920e296Sopenharmony_ci        return iter.second == type;
1313920e296Sopenharmony_ci    });
1323920e296Sopenharmony_ci    if (ret != g_fileClusterMap.end()) {
1333920e296Sopenharmony_ci        return ret->first;
1343920e296Sopenharmony_ci    }
1353920e296Sopenharmony_ci
1363920e296Sopenharmony_ci    ret = find_if(g_contentClusterMap.begin(), g_contentClusterMap.end(), [type](auto iter) {
1373920e296Sopenharmony_ci        return iter.second == type;
1383920e296Sopenharmony_ci    });
1393920e296Sopenharmony_ci    if (ret != g_contentClusterMap.end()) {
1403920e296Sopenharmony_ci        return ret->first;
1413920e296Sopenharmony_ci    }
1423920e296Sopenharmony_ci    return "";
1433920e296Sopenharmony_ci}
1443920e296Sopenharmony_ci
1453920e296Sopenharmony_cistring ResourceUtil::GetIdName(const string &name, ResType type)
1463920e296Sopenharmony_ci{
1473920e296Sopenharmony_ci    if (type != ResType::MEDIA && type != ResType::PROF) {
1483920e296Sopenharmony_ci        return name;
1493920e296Sopenharmony_ci    }
1503920e296Sopenharmony_ci
1513920e296Sopenharmony_ci    string::size_type pos = name.find_last_of(".");
1523920e296Sopenharmony_ci    if (pos != string::npos) {
1533920e296Sopenharmony_ci        return name.substr(0, pos);
1543920e296Sopenharmony_ci    }
1553920e296Sopenharmony_ci    return name;
1563920e296Sopenharmony_ci}
1573920e296Sopenharmony_ci
1583920e296Sopenharmony_cistring ResourceUtil::ComposeStrings(const vector<string> &contents, bool addNull)
1593920e296Sopenharmony_ci{
1603920e296Sopenharmony_ci    string result;
1613920e296Sopenharmony_ci    for (const auto &iter : contents) {
1623920e296Sopenharmony_ci        if (iter.length() > UINT16_MAX) {
1633920e296Sopenharmony_ci            return "";
1643920e296Sopenharmony_ci        }
1653920e296Sopenharmony_ci
1663920e296Sopenharmony_ci        uint16_t size = iter.length();
1673920e296Sopenharmony_ci        if (addNull) {
1683920e296Sopenharmony_ci            size += sizeof(char);
1693920e296Sopenharmony_ci        }
1703920e296Sopenharmony_ci        result.append(sizeof(char), (size & 0xff));
1713920e296Sopenharmony_ci        result.append(sizeof(char), (size >> 8)); // Move 8 bits to the right
1723920e296Sopenharmony_ci        result.append(iter);
1733920e296Sopenharmony_ci        result.append(sizeof(char), '\0');
1743920e296Sopenharmony_ci        if (result.length() > UINT16_MAX) {
1753920e296Sopenharmony_ci            return "";
1763920e296Sopenharmony_ci        }
1773920e296Sopenharmony_ci    }
1783920e296Sopenharmony_ci    return result;
1793920e296Sopenharmony_ci}
1803920e296Sopenharmony_ci
1813920e296Sopenharmony_civector<string> ResourceUtil::DecomposeStrings(const string &content)
1823920e296Sopenharmony_ci{
1833920e296Sopenharmony_ci    vector<string> result;
1843920e296Sopenharmony_ci    size_t length = content.length();
1853920e296Sopenharmony_ci    size_t pos = 0;
1863920e296Sopenharmony_ci    const size_t HEAD_LENGTH = 2;
1873920e296Sopenharmony_ci    while (pos < length) {
1883920e296Sopenharmony_ci        if (pos + HEAD_LENGTH >= length) {
1893920e296Sopenharmony_ci            result.clear();
1903920e296Sopenharmony_ci            return result;
1913920e296Sopenharmony_ci        }
1923920e296Sopenharmony_ci        uint16_t size = (content[pos] & 0xff) | ((content[pos + 1] & 0xff) << 8); // Move 8 bits to the left
1933920e296Sopenharmony_ci        pos += HEAD_LENGTH;
1943920e296Sopenharmony_ci
1953920e296Sopenharmony_ci        if (pos + size >= length) {
1963920e296Sopenharmony_ci            result.clear();
1973920e296Sopenharmony_ci            return result;
1983920e296Sopenharmony_ci        }
1993920e296Sopenharmony_ci        string buffer = content.substr(pos, size);
2003920e296Sopenharmony_ci        result.push_back(buffer);
2013920e296Sopenharmony_ci        pos += size + sizeof(char);
2023920e296Sopenharmony_ci    }
2033920e296Sopenharmony_ci    return result;
2043920e296Sopenharmony_ci}
2053920e296Sopenharmony_ci
2063920e296Sopenharmony_ciResType ResourceUtil::GetResTypeFromString(const string &type)
2073920e296Sopenharmony_ci{
2083920e296Sopenharmony_ci    ResType resType = GetResTypeByDir(type);
2093920e296Sopenharmony_ci    if (resType != ResType::INVALID_RES_TYPE) {
2103920e296Sopenharmony_ci        return resType;
2113920e296Sopenharmony_ci    }
2123920e296Sopenharmony_ci
2133920e296Sopenharmony_ci    auto ret = g_contentClusterMap.find(type);
2143920e296Sopenharmony_ci    if (ret != g_contentClusterMap.end()) {
2153920e296Sopenharmony_ci        return ret->second;
2163920e296Sopenharmony_ci    }
2173920e296Sopenharmony_ci    return ResType::INVALID_RES_TYPE;
2183920e296Sopenharmony_ci}
2193920e296Sopenharmony_ci
2203920e296Sopenharmony_cibool ResourceUtil::CopyFileInner(const string &src, const string &dst)
2213920e296Sopenharmony_ci{
2223920e296Sopenharmony_ci    return FileEntry::CopyFileInner(src, dst);
2233920e296Sopenharmony_ci}
2243920e296Sopenharmony_ci
2253920e296Sopenharmony_cibool ResourceUtil::CreateDirs(const string &filePath)
2263920e296Sopenharmony_ci{
2273920e296Sopenharmony_ci    std::lock_guard<std::mutex> lock(fileMutex_);
2283920e296Sopenharmony_ci    if (FileExist(filePath)) {
2293920e296Sopenharmony_ci        return true;
2303920e296Sopenharmony_ci    }
2313920e296Sopenharmony_ci
2323920e296Sopenharmony_ci    if (!FileEntry::CreateDirs(filePath)) {
2333920e296Sopenharmony_ci        cerr << "Error: create dir '" << filePath << "' failed, reason:" << strerror(errno) << endl;
2343920e296Sopenharmony_ci        return false;
2353920e296Sopenharmony_ci    }
2363920e296Sopenharmony_ci    return true;
2373920e296Sopenharmony_ci}
2383920e296Sopenharmony_ci
2393920e296Sopenharmony_cibool ResourceUtil::IsIgnoreFile(const string &filename, bool isFile)
2403920e296Sopenharmony_ci{
2413920e296Sopenharmony_ci    string key = filename;
2423920e296Sopenharmony_ci    transform(key.begin(), key.end(), key.begin(), ::tolower);
2433920e296Sopenharmony_ci    for (const auto &iter : IGNORE_FILE_REGEX) {
2443920e296Sopenharmony_ci        if ((iter.second == IgnoreType::IGNORE_FILE && !isFile) ||
2453920e296Sopenharmony_ci            (iter.second == IgnoreType::IGNORE_DIR && isFile)) {
2463920e296Sopenharmony_ci            continue;
2473920e296Sopenharmony_ci        }
2483920e296Sopenharmony_ci        if (regex_match(key, regex(iter.first))) {
2493920e296Sopenharmony_ci            return true;
2503920e296Sopenharmony_ci        }
2513920e296Sopenharmony_ci    }
2523920e296Sopenharmony_ci    return false;
2533920e296Sopenharmony_ci}
2543920e296Sopenharmony_ci
2553920e296Sopenharmony_cistring ResourceUtil::GenerateHash(const string &key)
2563920e296Sopenharmony_ci{
2573920e296Sopenharmony_ci    hash<string> hash_function;
2583920e296Sopenharmony_ci    return to_string(hash_function(key));
2593920e296Sopenharmony_ci}
2603920e296Sopenharmony_ci
2613920e296Sopenharmony_cistring ResourceUtil::RealPath(const string &path)
2623920e296Sopenharmony_ci{
2633920e296Sopenharmony_ci    return FileEntry::RealPath(path);
2643920e296Sopenharmony_ci}
2653920e296Sopenharmony_ci
2663920e296Sopenharmony_cibool ResourceUtil::IslegalPath(const string &path)
2673920e296Sopenharmony_ci{
2683920e296Sopenharmony_ci    return path == "element" || path == "media" || path == "profile";
2693920e296Sopenharmony_ci}
2703920e296Sopenharmony_ci
2713920e296Sopenharmony_civoid ResourceUtil::StringReplace(string &sourceStr, const string &oldStr, const string &newStr)
2723920e296Sopenharmony_ci{
2733920e296Sopenharmony_ci    string::size_type pos = 0;
2743920e296Sopenharmony_ci    string::size_type oldSize = oldStr.size();
2753920e296Sopenharmony_ci    string::size_type newSize = newStr.size();
2763920e296Sopenharmony_ci    while ((pos = sourceStr.find(oldStr, pos)) != string::npos) {
2773920e296Sopenharmony_ci        sourceStr.replace(pos, oldSize, newStr.c_str());
2783920e296Sopenharmony_ci        pos += newSize;
2793920e296Sopenharmony_ci    }
2803920e296Sopenharmony_ci}
2813920e296Sopenharmony_ci
2823920e296Sopenharmony_cistring ResourceUtil::GetLocaleLimitkey(const KeyParam &KeyParam)
2833920e296Sopenharmony_ci{
2843920e296Sopenharmony_ci    string str(reinterpret_cast<const char *>(&KeyParam.value));
2853920e296Sopenharmony_ci    reverse(str.begin(), str.end());
2863920e296Sopenharmony_ci    return str;
2873920e296Sopenharmony_ci}
2883920e296Sopenharmony_ci
2893920e296Sopenharmony_cistring ResourceUtil::GetDeviceTypeLimitkey(const KeyParam &KeyParam)
2903920e296Sopenharmony_ci{
2913920e296Sopenharmony_ci    auto ret = find_if(g_deviceMap.begin(), g_deviceMap.end(), [KeyParam](const auto &iter) {
2923920e296Sopenharmony_ci        return KeyParam.value == static_cast<const uint32_t>(iter.second);
2933920e296Sopenharmony_ci    });
2943920e296Sopenharmony_ci    if (ret == g_deviceMap.end()) {
2953920e296Sopenharmony_ci        return string();
2963920e296Sopenharmony_ci    }
2973920e296Sopenharmony_ci    return ret->first;
2983920e296Sopenharmony_ci}
2993920e296Sopenharmony_ci
3003920e296Sopenharmony_cistring ResourceUtil::GetResolutionLimitkey(const KeyParam &KeyParam)
3013920e296Sopenharmony_ci{
3023920e296Sopenharmony_ci    auto ret = find_if(g_resolutionMap.begin(), g_resolutionMap.end(), [KeyParam](const auto &iter) {
3033920e296Sopenharmony_ci        return KeyParam.value == static_cast<const uint32_t>(iter.second);
3043920e296Sopenharmony_ci    });
3053920e296Sopenharmony_ci    if (ret == g_resolutionMap.end()) {
3063920e296Sopenharmony_ci        return string();
3073920e296Sopenharmony_ci    }
3083920e296Sopenharmony_ci    return ret->first;
3093920e296Sopenharmony_ci}
3103920e296Sopenharmony_ci
3113920e296Sopenharmony_cistring ResourceUtil::GetKeyParamValue(const KeyParam &KeyParam)
3123920e296Sopenharmony_ci{
3133920e296Sopenharmony_ci    string val;
3143920e296Sopenharmony_ci    switch (KeyParam.keyType) {
3153920e296Sopenharmony_ci        case KeyType::ORIENTATION:
3163920e296Sopenharmony_ci            val = KeyParam.value == static_cast<const uint32_t>(OrientationType::VERTICAL) ? "vertical" : "horizontal";
3173920e296Sopenharmony_ci            break;
3183920e296Sopenharmony_ci        case KeyType::NIGHTMODE:
3193920e296Sopenharmony_ci            val = KeyParam.value == static_cast<const uint32_t>(NightMode::DARK) ? "dark" : "light";
3203920e296Sopenharmony_ci            break;
3213920e296Sopenharmony_ci        case KeyType::DEVICETYPE:
3223920e296Sopenharmony_ci            val = GetDeviceTypeLimitkey(KeyParam);
3233920e296Sopenharmony_ci            break;
3243920e296Sopenharmony_ci        case KeyType::RESOLUTION:
3253920e296Sopenharmony_ci            val = GetResolutionLimitkey(KeyParam);
3263920e296Sopenharmony_ci            break;
3273920e296Sopenharmony_ci        case KeyType::LANGUAGE:
3283920e296Sopenharmony_ci        case KeyType::REGION:
3293920e296Sopenharmony_ci            val = GetLocaleLimitkey(KeyParam);
3303920e296Sopenharmony_ci            break;
3313920e296Sopenharmony_ci        default:
3323920e296Sopenharmony_ci            val = to_string(KeyParam.value);
3333920e296Sopenharmony_ci            break;
3343920e296Sopenharmony_ci    }
3353920e296Sopenharmony_ci    return val;
3363920e296Sopenharmony_ci}
3373920e296Sopenharmony_ci
3383920e296Sopenharmony_cistring ResourceUtil::PaserKeyParam(const vector<KeyParam> &keyParams)
3393920e296Sopenharmony_ci{
3403920e296Sopenharmony_ci    if (keyParams.size() == 0) {
3413920e296Sopenharmony_ci        return "base";
3423920e296Sopenharmony_ci    }
3433920e296Sopenharmony_ci    string result;
3443920e296Sopenharmony_ci    for (const auto &keyparam : keyParams) {
3453920e296Sopenharmony_ci        string limitKey = GetKeyParamValue(keyparam);
3463920e296Sopenharmony_ci        if (limitKey.empty()) {
3473920e296Sopenharmony_ci            continue;
3483920e296Sopenharmony_ci        }
3493920e296Sopenharmony_ci        if (keyparam.keyType == KeyType::MCC) {
3503920e296Sopenharmony_ci            limitKey = "mcc" + limitKey;
3513920e296Sopenharmony_ci        }
3523920e296Sopenharmony_ci        if (keyparam.keyType == KeyType::MNC) {
3533920e296Sopenharmony_ci            limitKey = "mnc" + limitKey;
3543920e296Sopenharmony_ci        }
3553920e296Sopenharmony_ci        if (keyparam.keyType == KeyType::REGION || keyparam.keyType == KeyType::MNC) {
3563920e296Sopenharmony_ci            result = result + "_" + limitKey;
3573920e296Sopenharmony_ci        } else {
3583920e296Sopenharmony_ci            result = result + "-" + limitKey;
3593920e296Sopenharmony_ci        }
3603920e296Sopenharmony_ci    }
3613920e296Sopenharmony_ci    if (!result.empty()) {
3623920e296Sopenharmony_ci        result = result.substr(1);
3633920e296Sopenharmony_ci    }
3643920e296Sopenharmony_ci    return result;
3653920e296Sopenharmony_ci}
3663920e296Sopenharmony_ci
3673920e296Sopenharmony_cistring ResourceUtil::DecToHexStr(const uint32_t i)
3683920e296Sopenharmony_ci{
3693920e296Sopenharmony_ci    stringstream ot;
3703920e296Sopenharmony_ci    string result;
3713920e296Sopenharmony_ci    ot << setiosflags(ios::uppercase) << "0x" << hex << setw(8) << setfill('0') << i; // 0x expadding 8 bit
3723920e296Sopenharmony_ci    ot >> result;
3733920e296Sopenharmony_ci    return result;
3743920e296Sopenharmony_ci}
3753920e296Sopenharmony_ci
3763920e296Sopenharmony_cibool ResourceUtil::CheckHexStr(const string &hex)
3773920e296Sopenharmony_ci{
3783920e296Sopenharmony_ci    if (regex_match(hex, regex("^0[xX][0-9a-fA-F]{8}"))) {
3793920e296Sopenharmony_ci        return true;
3803920e296Sopenharmony_ci    }
3813920e296Sopenharmony_ci    return false;
3823920e296Sopenharmony_ci}
3833920e296Sopenharmony_ci
3843920e296Sopenharmony_cistring ResourceUtil::GetAllRestypeString()
3853920e296Sopenharmony_ci{
3863920e296Sopenharmony_ci    string result;
3873920e296Sopenharmony_ci    for (auto iter = g_contentClusterMap.begin(); iter != g_contentClusterMap.end(); ++iter) {
3883920e296Sopenharmony_ci        result = result + "," + iter->first;
3893920e296Sopenharmony_ci    }
3903920e296Sopenharmony_ci    return result;
3913920e296Sopenharmony_ci}
3923920e296Sopenharmony_ci
3933920e296Sopenharmony_ciFileEntry::FilePath ResourceUtil::GetBaseElementPath(const string input)
3943920e296Sopenharmony_ci{
3953920e296Sopenharmony_ci    return FileEntry::FilePath(input).Append("base").Append("element");
3963920e296Sopenharmony_ci}
3973920e296Sopenharmony_ci
3983920e296Sopenharmony_ciFileEntry::FilePath ResourceUtil::GetMainPath(const string input)
3993920e296Sopenharmony_ci{
4003920e296Sopenharmony_ci    return FileEntry::FilePath(input).GetParent();
4013920e296Sopenharmony_ci}
4023920e296Sopenharmony_ci
4033920e296Sopenharmony_ciuint32_t ResourceUtil::GetNormalSize(const vector<KeyParam> &keyParams, uint32_t index)
4043920e296Sopenharmony_ci{
4053920e296Sopenharmony_ci    string device;
4063920e296Sopenharmony_ci    string dpi;
4073920e296Sopenharmony_ci    if (keyParams.size() == 0) {
4083920e296Sopenharmony_ci        device = "phone";
4093920e296Sopenharmony_ci        dpi = "sdpi";
4103920e296Sopenharmony_ci    }
4113920e296Sopenharmony_ci    for (const auto &keyparam : keyParams) {
4123920e296Sopenharmony_ci        string limitKey = GetKeyParamValue(keyparam);
4133920e296Sopenharmony_ci        if (limitKey.empty()) {
4143920e296Sopenharmony_ci            continue;
4153920e296Sopenharmony_ci        }
4163920e296Sopenharmony_ci        if (keyparam.keyType == KeyType::DEVICETYPE) {
4173920e296Sopenharmony_ci            device = limitKey;
4183920e296Sopenharmony_ci        } else if (keyparam.keyType == KeyType::RESOLUTION) {
4193920e296Sopenharmony_ci            dpi = limitKey;
4203920e296Sopenharmony_ci        }
4213920e296Sopenharmony_ci    }
4223920e296Sopenharmony_ci    if (device.empty()) {
4233920e296Sopenharmony_ci        device = "phone";
4243920e296Sopenharmony_ci    }
4253920e296Sopenharmony_ci    if (dpi.empty()) {
4263920e296Sopenharmony_ci        dpi = "sdpi";
4273920e296Sopenharmony_ci    }
4283920e296Sopenharmony_ci    if (device != "phone" && device != "tablet") {
4293920e296Sopenharmony_ci        return 0;
4303920e296Sopenharmony_ci    }
4313920e296Sopenharmony_ci    return g_normalIconMap.find(dpi + "-" + device)->second[index];
4323920e296Sopenharmony_ci}
4333920e296Sopenharmony_ci
4343920e296Sopenharmony_cibool ResourceUtil::isUnicodeInPlane15or16(int unicode)
4353920e296Sopenharmony_ci{
4363920e296Sopenharmony_ci    return (unicode >= 0xF0000 && unicode <= 0xFFFFF) || (unicode >= 0x100000 && unicode <= 0x10FFFF);
4373920e296Sopenharmony_ci}
4383920e296Sopenharmony_ci
4393920e296Sopenharmony_civoid ResourceUtil::RemoveSpaces(string &str)
4403920e296Sopenharmony_ci{
4413920e296Sopenharmony_ci    str.erase(0, str.find_first_not_of(" "));
4423920e296Sopenharmony_ci    str.erase(str.find_last_not_of(" ") + 1); // move back one place
4433920e296Sopenharmony_ci}
4443920e296Sopenharmony_ci
4453920e296Sopenharmony_cibool ResourceUtil::IsIntValue(const cJSON *node)
4463920e296Sopenharmony_ci{
4473920e296Sopenharmony_ci    if (node && cJSON_IsNumber(node)) {
4483920e296Sopenharmony_ci        double num = node->valuedouble;
4493920e296Sopenharmony_ci        if (num == static_cast<int>(num)) {
4503920e296Sopenharmony_ci            return true;
4513920e296Sopenharmony_ci        } else {
4523920e296Sopenharmony_ci            return false;
4533920e296Sopenharmony_ci        }
4543920e296Sopenharmony_ci    }
4553920e296Sopenharmony_ci    return false;
4563920e296Sopenharmony_ci}
4573920e296Sopenharmony_ci
4583920e296Sopenharmony_cibool ResourceUtil::IsValidName(const string &name)
4593920e296Sopenharmony_ci{
4603920e296Sopenharmony_ci    if (!regex_match(name, regex("[a-zA-Z0-9_]+"))) {
4613920e296Sopenharmony_ci        cerr << "Error: the name '" << name << "' can only contain [a-zA-Z0-9_]." << endl;
4623920e296Sopenharmony_ci        return false;
4633920e296Sopenharmony_ci    }
4643920e296Sopenharmony_ci    return true;
4653920e296Sopenharmony_ci}
4663920e296Sopenharmony_ci
4673920e296Sopenharmony_civoid ResourceUtil::PrintWarningMsg(vector<pair<ResType, string>> &noBaseResource)
4683920e296Sopenharmony_ci{
4693920e296Sopenharmony_ci    for (const auto &item : noBaseResource) {
4703920e296Sopenharmony_ci        cerr << "Warning: the " << ResourceUtil::ResTypeToString(item.first);
4713920e296Sopenharmony_ci        cerr << " of '" << item.second << "' does not have a base resource." << endl;
4723920e296Sopenharmony_ci    }
4733920e296Sopenharmony_ci}
4743920e296Sopenharmony_ci}
4753920e296Sopenharmony_ci}
4763920e296Sopenharmony_ci}
477