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