1 /*
2  * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef OHOS_RESTOOL_RESOURCE_DATA_H
17 #define OHOS_RESTOOL_RESOURCE_DATA_H
18 
19 #include <cstdint>
20 #include <map>
21 #include <set>
22 #include <stdint.h>
23 #include <string>
24 #include <vector>
25 
26 namespace OHOS {
27 namespace Global {
28 namespace Restool {
29 const static std::string TOOL_NAME = "restool";
30 const static std::string RESOURCES_DIR = "resources";
31 const static std::string CACHES_DIR = ".caches";
32 const static std::string CONFIG_JSON = "config.json";
33 const static std::string MODULE_JSON = "module.json";
34 const static std::string RAW_FILE_DIR = "rawfile";
35 const static std::string RES_FILE_DIR = "resfile";
36 const static std::string ID_DEFINED_FILE = "id_defined.json";
37 const static std::string RESOURCE_INDEX_FILE = "resources.index";
38 const static std::string JSON_EXTENSION = ".json";
39 #ifdef __WIN32
40 const static std::string SEPARATOR_FILE = "\\";
41 #else
42 const static std::string SEPARATOR_FILE = "/";
43 #endif
44 const static std::string SEPARATOR = "/";
45 const static std::string WIN_SEPARATOR = "\\";
46 const static std::string NEW_LINE_PATH = "\nat ";
47 const static std::string SOLUTIONS = "Solutions:";
48 const static std::string SOLUTIONS_ARROW = "> ";
49 const static std::string LONG_PATH_HEAD = "\\\\?\\";
50 const static int32_t VERSION_MAX_LEN = 128;
51 const static int32_t INT_TO_BYTES = sizeof(uint32_t);
52 static const int8_t RESTOOL_VERSION[VERSION_MAX_LEN] = { "Restool 5.012" };
53 const static int32_t TAG_LEN = 4;
54 static std::set<std::string> g_resourceSet;
55 const static int8_t THREAD_POOL_SIZE = 2;
56 const static int8_t INVALID_ID = -1;
57 
58 enum class KeyType {
59     LANGUAGE = 0,
60     REGION = 1,
61     RESOLUTION = 2,
62     ORIENTATION = 3,
63     DEVICETYPE = 4,
64     SCRIPT = 5,
65     NIGHTMODE = 6,
66     MCC = 7,
67     MNC = 8,
68     // RESERVER 9
69     INPUTDEVICE = 10,
70     KEY_TYPE_MAX,
71     OTHER,
72 };
73 
74 enum class ResType {
75     ELEMENT = 0,
76     RAW = 6,
77     INTEGER = 8,
78     STRING = 9,
79     STRARRAY = 10,
80     INTARRAY = 11,
81     BOOLEAN = 12,
82     COLOR = 14,
83     ID = 15,
84     THEME = 16,
85     PLURAL = 17,
86     FLOAT = 18,
87     MEDIA = 19,
88     PROF = 20,
89     PATTERN = 22,
90     SYMBOL = 23,
91     RES = 24,
92     INVALID_RES_TYPE = -1,
93 };
94 
95 enum class OrientationType {
96     VERTICAL = 0,
97     HORIZONTAL = 1,
98 };
99 
100 enum class DeviceType {
101     PHONE = 0,
102     TABLET = 1,
103     CAR = 2,
104     // RESERVER 3
105     TV = 4,
106     WEARABLE = 6,
107     TWOINONE = 7,
108 };
109 
110 enum class ResolutionType {
111     SDPI = 120,
112     MDPI = 160,
113     LDPI = 240,
114     XLDPI = 320,
115     XXLDPI = 480,
116     XXXLDPI = 640,
117 };
118 
119 enum class NightMode {
120     DARK = 0,
121     LIGHT = 1,
122 };
123 
124 enum class InputDevice {
125     INPUTDEVICE_NOT_SET = -1,
126     INPUTDEVICE_POINTINGDEVICE = 0,
127 };
128 
129 enum class ResourceIdCluster {
130     RES_ID_APP = 0,
131     RES_ID_SYS,
132     RES_ID_TYPE_MAX,
133 };
134 
135 enum Option {
136     END = -1,
137     IDS = 1,
138     DEFINED_IDS = 2,
139     DEPENDENTRY = 3,
140     ICON_CHECK = 4,
141     TARGET_CONFIG = 5,
142     DEFINED_SYSIDS = 6,
143     COMPRESSED_CONFIG = 7,
144     STARTID = 'e',
145     FORCEWRITE = 'f',
146     HELP = 'h',
147     INPUTPATH = 'i',
148     JSON = 'j',
149     FILELIST = 'l',
150     MODULES = 'm',
151     OUTPUTPATH = 'o',
152     PACKAGENAME = 'p',
153     RESHEADER = 'r',
154     VERSION = 'v',
155     APPEND = 'x',
156     COMBINE = 'z',
157     UNKNOWN = '?',
158     NO_ARGUMENT = ':',
159 };
160 
161 const std::map<std::string, OrientationType> g_orientaionMap = {
162     { "vertical", OrientationType::VERTICAL },
163     { "horizontal", OrientationType::HORIZONTAL },
164 };
165 
166 const std::map<std::string, DeviceType> g_deviceMap = {
167     { "phone", DeviceType::PHONE },
168     { "tablet", DeviceType::TABLET },
169     { "car", DeviceType::CAR },
170     { "tv", DeviceType::TV },
171     { "wearable", DeviceType::WEARABLE },
172     { "2in1", DeviceType::TWOINONE },
173 };
174 
175 const std::map<std::string, ResolutionType> g_resolutionMap = {
176     { "sdpi", ResolutionType::SDPI },
177     { "mdpi",  ResolutionType::MDPI },
178     { "ldpi",  ResolutionType::LDPI },
179     { "xldpi", ResolutionType::XLDPI },
180     { "xxldpi", ResolutionType::XXLDPI },
181     { "xxxldpi", ResolutionType::XXXLDPI },
182 };
183 
184 const std::map<std::string, NightMode> g_nightModeMap = {
185     { "dark", NightMode::DARK },
186     { "light", NightMode::LIGHT },
187 };
188 
189 const std::map<std::string, InputDevice> g_inputDeviceMap = {
190     { "pointingdevice", InputDevice::INPUTDEVICE_POINTINGDEVICE },
191 };
192 
193 struct KeyParam {
194     KeyType keyType;
195     uint32_t value;
operator ==OHOS::Global::Restool::KeyParam196     bool operator == (const KeyParam &other)
197     {
198         return keyType == other.keyType && value == other.value;
199     }
200 };
201 
202 struct IdData {
203     uint32_t id;
204     uint32_t dataOffset;
205 };
206 
207 struct ResourceId {
208     int64_t id;
209     int64_t seq;
210     std::string type;
211     std::string name;
212 };
213 
214 struct CompressFilter {
215     std::vector<std::string> path;
216     std::vector<std::string> excludePath;
217     std::string rules;
218     std::string excludeRules;
219     std::string method;
220 };
221 
222 const std::map<std::string, ResType> g_copyFileMap = {
223     { RAW_FILE_DIR, ResType::RAW },
224     { RES_FILE_DIR, ResType::RES },
225 };
226 
227 const std::map<std::string, ResType> g_fileClusterMap = {
228     { "element", ResType::ELEMENT },
229     { "media", ResType::MEDIA },
230     { "profile", ResType::PROF },
231 };
232 
233 const std::map<std::string, ResType> g_contentClusterMap = {
234     { "id", ResType::ID },
235     { "integer", ResType::INTEGER },
236     { "string", ResType::STRING },
237     { "strarray", ResType::STRARRAY },
238     { "intarray", ResType::INTARRAY },
239     { "color", ResType::COLOR },
240     { "plural", ResType::PLURAL },
241     { "boolean", ResType::BOOLEAN },
242     { "pattern", ResType::PATTERN },
243     { "theme", ResType::THEME },
244     { "float", ResType::FLOAT },
245     { "symbol", ResType::SYMBOL }
246 };
247 
248 const std::map<int32_t, ResType> g_resTypeMap = {
249     { static_cast<int32_t>(ResType::ELEMENT), ResType::ELEMENT},
250     { static_cast<int32_t>(ResType::RAW), ResType::RAW},
251     { static_cast<int32_t>(ResType::INTEGER), ResType::INTEGER},
252     { static_cast<int32_t>(ResType::STRING), ResType::STRING},
253     { static_cast<int32_t>(ResType::STRARRAY), ResType::STRARRAY},
254     { static_cast<int32_t>(ResType::INTARRAY), ResType::INTARRAY},
255     { static_cast<int32_t>(ResType::BOOLEAN), ResType::BOOLEAN},
256     { static_cast<int32_t>(ResType::COLOR), ResType::COLOR},
257     { static_cast<int32_t>(ResType::ID), ResType::ID},
258     { static_cast<int32_t>(ResType::THEME), ResType::THEME},
259     { static_cast<int32_t>(ResType::PLURAL), ResType::PLURAL},
260     { static_cast<int32_t>(ResType::FLOAT), ResType::FLOAT},
261     { static_cast<int32_t>(ResType::MEDIA), ResType::MEDIA},
262     { static_cast<int32_t>(ResType::PROF), ResType::PROF},
263     { static_cast<int32_t>(ResType::PATTERN), ResType::PATTERN},
264     { static_cast<int32_t>(ResType::SYMBOL), ResType::SYMBOL},
265     { static_cast<int32_t>(ResType::RES), ResType::RES},
266     { static_cast<int32_t>(ResType::INVALID_RES_TYPE), ResType::INVALID_RES_TYPE},
267 };
268 
269 const std::map<std::string, std::vector<uint32_t>> g_normalIconMap = {
270     { "sdpi-phone", {41, 144} },
271     { "sdpi-tablet", {51, 192} },
272     { "mdpi-phone", {54, 192} },
273     { "mdpi-tablet", {68, 256} },
274     { "ldpi-phone", {81, 288} },
275     { "ldpi-tablet", {102, 384} },
276     { "xldpi-phone", {108, 384} },
277     { "xldpi-tablet", {136, 512} },
278     { "xxldpi-phone", {162, 576} },
279     { "xxldpi-tablet", {204, 768} },
280     { "xxxldpi-phone", {216, 768} },
281     { "xxxldpi-tablet", {272, 1024} },
282 };
283 
284 const std::map<std::string, uint32_t> g_keyNodeIndexs = {
285     { "icon", 0 },
286     { "startWindowIcon", 1 },
287 };
288 
289 struct DirectoryInfo {
290     std::string limitKey;
291     std::string fileCluster;
292     std::string dirPath;
293     std::vector<KeyParam> keyParams;
294     ResType dirType;
295 };
296 
297 struct FileInfo : DirectoryInfo {
298     std::string filePath;
299     std::string filename;
300     ResType fileType;
301 };
302 
303 struct TargetConfig {
304     std::vector<KeyParam> mccmnc;
305     std::vector<KeyParam> locale;
306     std::vector<KeyParam> orientation;
307     std::vector<KeyParam> device;
308     std::vector<KeyParam> colormode;
309     std::vector<KeyParam> density;
310 };
311 
312 struct Mccmnc {
313     KeyParam mcc;
314     KeyParam mnc;
operator ==OHOS::Global::Restool::Mccmnc315     bool operator == (const Mccmnc &other)
316     {
317         if (mcc.value != other.mcc.value) {
318             return false;
319         }
320         if (mnc.keyType != KeyType::OTHER && other.mnc.keyType != KeyType::OTHER &&
321             mnc.value != other.mnc.value) {
322             return false;
323         }
324         return true;
325     }
326 };
327 
328 struct Locale {
329     KeyParam language;
330     KeyParam script;
331     KeyParam region;
operator ==OHOS::Global::Restool::Locale332     bool operator == (const Locale &other)
333     {
334         if (language.value != other.language.value) {
335             return false;
336         }
337         if (script.keyType != KeyType::OTHER && other.script.keyType != KeyType::OTHER &&
338             script.value != other.script.value) {
339             return false;
340         }
341         if (region.keyType != KeyType::OTHER && other.region.keyType != KeyType::OTHER &&
342             region.value != other.region.value) {
343             return false;
344         }
345         return true;
346     }
347 };
348 
349 }
350 }
351 }
352 #endif
353