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#ifndef OHOS_RESTOOL_RESOURCE_UTIL_H
173920e296Sopenharmony_ci#define OHOS_RESTOOL_RESOURCE_UTIL_H
183920e296Sopenharmony_ci
193920e296Sopenharmony_ci#include <vector>
203920e296Sopenharmony_ci#include <cJSON.h>
213920e296Sopenharmony_ci#include "file_entry.h"
223920e296Sopenharmony_ci#include "resource_data.h"
233920e296Sopenharmony_ci
243920e296Sopenharmony_cinamespace OHOS {
253920e296Sopenharmony_cinamespace Global {
263920e296Sopenharmony_cinamespace Restool {
273920e296Sopenharmony_ciclass ResourceUtil {
283920e296Sopenharmony_cipublic:
293920e296Sopenharmony_ci    /**
303920e296Sopenharmony_ci     * @brief split the string with given splitter.
313920e296Sopenharmony_ci     * @param str: input string.
323920e296Sopenharmony_ci     * @param out: the array of strings computed by splitter.
333920e296Sopenharmony_ci     * @param splitter: the split string.
343920e296Sopenharmony_ci     */
353920e296Sopenharmony_ci    static void Split(const std::string &str, std::vector<std::string> &out, const std::string &splitter);
363920e296Sopenharmony_ci
373920e296Sopenharmony_ci    /**
383920e296Sopenharmony_ci     * @brief Replace sub-string in string
393920e296Sopenharmony_ci     * @param sourceStr: The original string to operate on
403920e296Sopenharmony_ci     * @param oldStr: The string to be replaced
413920e296Sopenharmony_ci     * @param newStr: The new string used
423920e296Sopenharmony_ci     */
433920e296Sopenharmony_ci    static void StringReplace(std::string &sourceStr, const std::string &oldStr, const std::string &newStr);
443920e296Sopenharmony_ci
453920e296Sopenharmony_ci    /**
463920e296Sopenharmony_ci     * @brief check file exist.
473920e296Sopenharmony_ci     * @param path: file path.
483920e296Sopenharmony_ci     * @return true if exist, other false.
493920e296Sopenharmony_ci     */
503920e296Sopenharmony_ci    static bool FileExist(const std::string &path);
513920e296Sopenharmony_ci
523920e296Sopenharmony_ci    /**
533920e296Sopenharmony_ci     * @brief remove all files in the directory.
543920e296Sopenharmony_ci     * @param path: input directory.
553920e296Sopenharmony_ci     * @return true if remove success, other false.
563920e296Sopenharmony_ci     */
573920e296Sopenharmony_ci    static bool RmoveAllDir(const std::string &path);
583920e296Sopenharmony_ci
593920e296Sopenharmony_ci    /**
603920e296Sopenharmony_ci     * @brief remove file.
613920e296Sopenharmony_ci     * @param path: input file.
623920e296Sopenharmony_ci     * @return true if remove success, other false.
633920e296Sopenharmony_ci     */
643920e296Sopenharmony_ci    static bool RmoveFile(const std::string &path);
653920e296Sopenharmony_ci
663920e296Sopenharmony_ci    /**
673920e296Sopenharmony_ci     * @brief open json file.
683920e296Sopenharmony_ci     * @param path: json file path.
693920e296Sopenharmony_ci     * @param root: json root node
703920e296Sopenharmony_ci     * @return true if open success, other false.
713920e296Sopenharmony_ci     */
723920e296Sopenharmony_ci    static bool OpenJsonFile(const std::string &path, cJSON **root);
733920e296Sopenharmony_ci
743920e296Sopenharmony_ci    /**
753920e296Sopenharmony_ci     * @brief save json file.
763920e296Sopenharmony_ci     * @param path: json file path.
773920e296Sopenharmony_ci     * @param root: json root node
783920e296Sopenharmony_ci     * @return true if save success, other false.
793920e296Sopenharmony_ci     */
803920e296Sopenharmony_ci    static bool SaveToJsonFile(const std::string &path, const cJSON *root);
813920e296Sopenharmony_ci
823920e296Sopenharmony_ci    /**
833920e296Sopenharmony_ci     * @brief get resource type from directory.
843920e296Sopenharmony_ci     * @param name: directory name.
853920e296Sopenharmony_ci     * @return resource type.
863920e296Sopenharmony_ci     */
873920e296Sopenharmony_ci    static ResType GetResTypeByDir(const std::string &name);
883920e296Sopenharmony_ci
893920e296Sopenharmony_ci    /**
903920e296Sopenharmony_ci     * @brief ResType to string
913920e296Sopenharmony_ci     * @param type: ResType
923920e296Sopenharmony_ci     * @return resource type string.
933920e296Sopenharmony_ci     */
943920e296Sopenharmony_ci    static std::string ResTypeToString(ResType type);
953920e296Sopenharmony_ci
963920e296Sopenharmony_ci    /**
973920e296Sopenharmony_ci     * @brief get id name
983920e296Sopenharmony_ci     * @param name; id name or file name
993920e296Sopenharmony_ci     * @param type: ResType
1003920e296Sopenharmony_ci     * @return return id name.
1013920e296Sopenharmony_ci     */
1023920e296Sopenharmony_ci    static std::string GetIdName(const std::string &name, ResType type);
1033920e296Sopenharmony_ci
1043920e296Sopenharmony_ci    /**
1053920e296Sopenharmony_ci     * @brief compose multi strings to string
1063920e296Sopenharmony_ci     * @param contents: multi strings
1073920e296Sopenharmony_ci     * @param addNull: if true, string length contains '\0'.
1083920e296Sopenharmony_ci     * @return return string, empty if error
1093920e296Sopenharmony_ci     */
1103920e296Sopenharmony_ci    static std::string ComposeStrings(const std::vector<std::string> &contents, bool addNull = false);
1113920e296Sopenharmony_ci
1123920e296Sopenharmony_ci    /**
1133920e296Sopenharmony_ci     * @brief decompose string to multi strings
1143920e296Sopenharmony_ci     * @param content: string
1153920e296Sopenharmony_ci     * @return return string vector, empty if error
1163920e296Sopenharmony_ci     */
1173920e296Sopenharmony_ci    static std::vector<std::string> DecomposeStrings(const std::string &content);
1183920e296Sopenharmony_ci
1193920e296Sopenharmony_ci    /**
1203920e296Sopenharmony_ci     * @brief string to ResType
1213920e296Sopenharmony_ci     * @param type: string
1223920e296Sopenharmony_ci     * @return return ResType
1233920e296Sopenharmony_ci     */
1243920e296Sopenharmony_ci    static ResType GetResTypeFromString(const std::string &type);
1253920e296Sopenharmony_ci
1263920e296Sopenharmony_ci    /**
1273920e296Sopenharmony_ci     * @brief copy file
1283920e296Sopenharmony_ci     * @param src: source file path
1293920e296Sopenharmony_ci     * @param dst: destination file path
1303920e296Sopenharmony_ci     * @return true if success, other false
1313920e296Sopenharmony_ci     */
1323920e296Sopenharmony_ci    static bool CopyFileInner(const std::string &src, const std::string &dst);
1333920e296Sopenharmony_ci
1343920e296Sopenharmony_ci    /**
1353920e296Sopenharmony_ci     * @brief create directories
1363920e296Sopenharmony_ci     * @param filePath: directory path
1373920e296Sopenharmony_ci     * @return true if success, other false
1383920e296Sopenharmony_ci     */
1393920e296Sopenharmony_ci    static bool CreateDirs(const std::string &filePath);
1403920e296Sopenharmony_ci
1413920e296Sopenharmony_ci    /**
1423920e296Sopenharmony_ci     * @brief ignore file or directory
1433920e296Sopenharmony_ci     * @param filename: file or directory name
1443920e296Sopenharmony_ci     * @param isFile: ture if is file, other false
1453920e296Sopenharmony_ci     * @return true if ignore, other false
1463920e296Sopenharmony_ci     */
1473920e296Sopenharmony_ci    static bool IsIgnoreFile(const std::string &filename, bool isFile);
1483920e296Sopenharmony_ci
1493920e296Sopenharmony_ci    /**
1503920e296Sopenharmony_ci     * @brief generate hash string
1513920e296Sopenharmony_ci     * @param key: string
1523920e296Sopenharmony_ci     * @return hash string
1533920e296Sopenharmony_ci     */
1543920e296Sopenharmony_ci    static std::string GenerateHash(const std::string &key);
1553920e296Sopenharmony_ci
1563920e296Sopenharmony_ci    /**
1573920e296Sopenharmony_ci     * @brief get an absolute pathname
1583920e296Sopenharmony_ci     * @param path pathname
1593920e296Sopenharmony_ci     * @return absolut pathname
1603920e296Sopenharmony_ci     */
1613920e296Sopenharmony_ci    static std::string RealPath(const std::string &path);
1623920e296Sopenharmony_ci
1633920e296Sopenharmony_ci    /**
1643920e296Sopenharmony_ci     * @brief check the directory is legal
1653920e296Sopenharmony_ci     * @param path pathname
1663920e296Sopenharmony_ci     * @return true is legal, other false;
1673920e296Sopenharmony_ci     */
1683920e296Sopenharmony_ci    static bool IslegalPath(const std::string &path);
1693920e296Sopenharmony_ci
1703920e296Sopenharmony_ci    /**
1713920e296Sopenharmony_ci     * @brief get an keyParams for limitkey
1723920e296Sopenharmony_ci     * @param keyParams
1733920e296Sopenharmony_ci     * @return limitkey
1743920e296Sopenharmony_ci     */
1753920e296Sopenharmony_ci    static std::string PaserKeyParam(const std::vector<KeyParam> &keyParams);
1763920e296Sopenharmony_ci
1773920e296Sopenharmony_ci    /**
1783920e296Sopenharmony_ci     * @brief Decimal to hexadecimal string
1793920e296Sopenharmony_ci     * @param int32_t Decimal
1803920e296Sopenharmony_ci     * @return Hexadecimal string
1813920e296Sopenharmony_ci     */
1823920e296Sopenharmony_ci    static std::string DecToHexStr(const uint32_t id);
1833920e296Sopenharmony_ci
1843920e296Sopenharmony_ci    /**
1853920e296Sopenharmony_ci     * @brief Check hexadecimal string
1863920e296Sopenharmony_ci     * @param string Hexadecimal string
1873920e296Sopenharmony_ci     * @return ture Hexadecimal string is legal, other false;
1883920e296Sopenharmony_ci     */
1893920e296Sopenharmony_ci    static bool CheckHexStr(const std::string &hex);
1903920e296Sopenharmony_ci
1913920e296Sopenharmony_ci    /**
1923920e296Sopenharmony_ci     * @brief get g_contentClusterMap key string
1933920e296Sopenharmony_ci     * @return All restype string
1943920e296Sopenharmony_ci     */
1953920e296Sopenharmony_ci    static std::string GetAllRestypeString();
1963920e296Sopenharmony_ci
1973920e296Sopenharmony_ci    /**
1983920e296Sopenharmony_ci     * @brief get \base\element dir
1993920e296Sopenharmony_ci     * @param string inputpath
2003920e296Sopenharmony_ci     * @return resource\base\element dir
2013920e296Sopenharmony_ci     */
2023920e296Sopenharmony_ci    static FileEntry::FilePath GetBaseElementPath(const std::string input);
2033920e296Sopenharmony_ci
2043920e296Sopenharmony_ci    /**
2053920e296Sopenharmony_ci     * @brief get main dir
2063920e296Sopenharmony_ci     * @param string inputpath
2073920e296Sopenharmony_ci     * @return main dir
2083920e296Sopenharmony_ci     */
2093920e296Sopenharmony_ci    static FileEntry::FilePath GetMainPath(const std::string input);
2103920e296Sopenharmony_ci
2113920e296Sopenharmony_ci    /**
2123920e296Sopenharmony_ci     * @brief Gets the standard size of icons under different qualifier phrases
2133920e296Sopenharmony_ci     * @param keyParams set of qualifiers
2143920e296Sopenharmony_ci     * @param uint32_t index
2153920e296Sopenharmony_ci     * @return standard size of the png
2163920e296Sopenharmony_ci    */
2173920e296Sopenharmony_ci    static uint32_t GetNormalSize(const std::vector<KeyParam> &keyParams, uint32_t index);
2183920e296Sopenharmony_ci
2193920e296Sopenharmony_ci    /**
2203920e296Sopenharmony_ci     * @brief Check if the Unicode code belongs to the 15 plane or 16 plane
2213920e296Sopenharmony_ci     * @param int unicode
2223920e296Sopenharmony_ci     * @return ture Unicode code belongs to the 15 plane or 16 plane, other false;
2233920e296Sopenharmony_ci    */
2243920e296Sopenharmony_ci    static bool isUnicodeInPlane15or16(int unicode);
2253920e296Sopenharmony_ci
2263920e296Sopenharmony_ci    /**
2273920e296Sopenharmony_ci     * @brief Remove spaces before and after strings
2283920e296Sopenharmony_ci     * @param str input string
2293920e296Sopenharmony_ci    */
2303920e296Sopenharmony_ci    static void RemoveSpaces(std::string &str);
2313920e296Sopenharmony_ci
2323920e296Sopenharmony_ci    /**
2333920e296Sopenharmony_ci     * @brief Check whether the value is int
2343920e296Sopenharmony_ci     * @param snode cJSON node
2353920e296Sopenharmony_ci    */
2363920e296Sopenharmony_ci    static bool IsIntValue(const cJSON *node);
2373920e296Sopenharmony_ci
2383920e296Sopenharmony_ci    /**
2393920e296Sopenharmony_ci     * @brief Check whether the resource name is valid
2403920e296Sopenharmony_ci     * @param str resource name
2413920e296Sopenharmony_ci    */
2423920e296Sopenharmony_ci    static bool IsValidName(const std::string &name);
2433920e296Sopenharmony_ci
2443920e296Sopenharmony_ci    /**
2453920e296Sopenharmony_ci     * @brief print warning msg
2463920e296Sopenharmony_ci     * @param noBaseResource set of no base resources
2473920e296Sopenharmony_ci    */
2483920e296Sopenharmony_ci    static void PrintWarningMsg(std::vector<std::pair<ResType, std::string>> &noBaseResource);
2493920e296Sopenharmony_ci
2503920e296Sopenharmony_ciprivate:
2513920e296Sopenharmony_ci    enum class IgnoreType {
2523920e296Sopenharmony_ci        IGNORE_FILE,
2533920e296Sopenharmony_ci        IGNORE_DIR,
2543920e296Sopenharmony_ci        IGNORE_ALL
2553920e296Sopenharmony_ci    };
2563920e296Sopenharmony_ci    static const std::map<std::string, IgnoreType> IGNORE_FILE_REGEX;
2573920e296Sopenharmony_ci    static std::string GetLocaleLimitkey(const KeyParam &KeyParam);
2583920e296Sopenharmony_ci    static std::string GetDeviceTypeLimitkey(const KeyParam &KeyParam);
2593920e296Sopenharmony_ci    static std::string GetResolutionLimitkey(const KeyParam &KeyParam);
2603920e296Sopenharmony_ci    static std::string GetKeyParamValue(const KeyParam &KeyParam);
2613920e296Sopenharmony_ci};
2623920e296Sopenharmony_ci}
2633920e296Sopenharmony_ci}
2643920e296Sopenharmony_ci}
2653920e296Sopenharmony_ci#endif
266