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