1/*
2 * Copyright (c) 2021-2023 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#ifndef OHOS_RESOURCE_MANAGER_RESOURCEMANAGER_H
16#define OHOS_RESOURCE_MANAGER_RESOURCEMANAGER_H
17
18#include <map>
19#include <string>
20#include <vector>
21#include <memory>
22#include <tuple>
23#include "res_config.h"
24
25namespace OHOS {
26namespace Global {
27namespace Resource {
28enum FunctionType {
29    SYNC = 0,
30    ASYNC = 1
31};
32class ResourceManager {
33public:
34    std::pair<std::string, std::string> bundleInfo;
35
36    int32_t userId = 100;
37
38    typedef struct {
39        /** the raw file fd */
40        int fd;
41
42        /** the offset from where the raw file starts in the HAP */
43        int64_t offset;
44
45        /** the length of the raw file in the HAP. */
46        int64_t length;
47    } RawFileDescriptor;
48
49    struct Resource {
50        /** the hap bundle name */
51        std::string bundleName;
52
53        /** the hap module name */
54        std::string moduleName;
55
56        /** the resource id in hap */
57        int32_t id;
58    };
59
60    enum class NapiValueType {
61        NAPI_NUMBER = 0,
62        NAPI_STRING = 1
63    };
64
65    virtual ~ResourceManager() = 0;
66
67    /**
68     * Add resource of hap.
69     *
70     * @param path The path of hap.
71     * @param selectedTypes If this param is setted, will only add resource of types specified by this param,
72     *     it will be faster than add all resource, you can set this param by combining flags
73     *     named SELECT_XXX defined in res_common.h. What's more, if you call UpdateResConfig()
74     *     before calling this method, will only add resource that matching the config, for example,
75     *     only add resource of current language, which means it will be further faster.
76     * @return true if init success, else false
77     */
78    virtual bool AddResource(const char *path, const uint32_t &selectedTypes = SELECT_ALL) = 0;
79
80    virtual RState UpdateResConfig(ResConfig &resConfig, bool isUpdateTheme = false) = 0;
81
82    virtual void GetResConfig(ResConfig &resConfig) = 0;
83
84    virtual RState GetStringById(uint32_t id, std::string &outValue) = 0;
85
86    virtual RState GetStringByName(const char *name, std::string &outValue) = 0;
87
88    virtual RState GetStringFormatById(std::string &outValue, uint32_t id, ...) = 0;
89
90    virtual RState GetStringFormatByName(std::string &outValue, const char *name, ...) = 0;
91
92    virtual RState GetStringArrayById(uint32_t id, std::vector<std::string> &outValue) = 0;
93
94    virtual RState GetStringArrayByName(const char *name, std::vector<std::string> &outValue) = 0;
95
96    virtual RState GetPatternById(uint32_t id, std::map<std::string, std::string> &outValue) = 0;
97
98    virtual RState GetPatternByName(const char *name, std::map<std::string, std::string> &outValue) = 0;
99
100    virtual RState GetPluralStringById(uint32_t id, int quantity, std::string &outValue) = 0;
101
102    virtual RState GetPluralStringByName(const char *name, int quantity, std::string &outValue) = 0;
103
104    virtual RState GetPluralStringByIdFormat(std::string &outValue, uint32_t id, int quantity, ...) = 0;
105
106    virtual RState GetPluralStringByNameFormat(std::string &outValue, const char *name, int quantity, ...) = 0;
107
108    virtual RState GetThemeById(uint32_t id, std::map<std::string, std::string> &outValue) = 0;
109
110    virtual RState GetThemeByName(const char *name, std::map<std::string, std::string> &outValue) = 0;
111
112    virtual RState GetBooleanById(uint32_t id, bool &outValue) = 0;
113
114    virtual RState GetBooleanByName(const char *name, bool &outValue) = 0;
115
116    virtual RState GetIntegerById(uint32_t id, int &outValue) = 0;
117
118    virtual RState GetIntegerByName(const char *name, int &outValue) = 0;
119
120    virtual RState GetFloatById(uint32_t id, float &outValue) = 0;
121
122    virtual RState GetFloatById(uint32_t id, float &outValue, std::string &unit) = 0;
123
124    virtual RState GetFloatByName(const char *name, float &outValue) = 0;
125
126    virtual RState GetFloatByName(const char *name, float &outValue, std::string &unit) = 0;
127
128    virtual RState GetIntArrayById(uint32_t id, std::vector<int> &outValue) = 0;
129
130    virtual RState GetIntArrayByName(const char *name, std::vector<int> &outValue) = 0;
131
132    virtual RState GetColorById(uint32_t id, uint32_t &outValue) = 0;
133
134    virtual RState GetColorByName(const char *name, uint32_t &outValue) = 0;
135
136    virtual RState GetProfileById(uint32_t id, std::string &outValue) = 0;
137
138    virtual RState GetProfileByName(const char *name, std::string &outValue) = 0;
139
140    virtual RState GetMediaById(uint32_t id, std::string &outValue, uint32_t density = 0) = 0;
141
142    virtual RState GetMediaByName(const char *name, std::string &outValue, uint32_t density = 0) = 0;
143
144    virtual RState GetRawFilePathByName(const std::string &name, std::string &outValue) = 0;
145
146    virtual RState GetRawFileDescriptor(const std::string &name, RawFileDescriptor &descriptor) = 0;
147
148    virtual RState CloseRawFileDescriptor(const std::string &name) = 0;
149
150    virtual RState GetMediaDataById(uint32_t id, size_t& len, std::unique_ptr<uint8_t[]> &outValue,
151        uint32_t density = 0) = 0;
152
153    virtual RState GetMediaDataByName(const char *name, size_t& len, std::unique_ptr<uint8_t[]> &outValue,
154        uint32_t density = 0) = 0;
155
156    virtual RState GetMediaBase64DataById(uint32_t id,  std::string &outValue, uint32_t density = 0) = 0;
157
158    virtual RState GetMediaBase64DataByName(const char *name,  std::string &outValue, uint32_t density = 0) = 0;
159
160    virtual RState GetProfileDataById(uint32_t id, size_t &len, std::unique_ptr<uint8_t[]> &outValue) = 0;
161
162    virtual RState GetProfileDataByName(const char *name, size_t &len, std::unique_ptr<uint8_t[]> &outValue) = 0;
163
164    virtual RState GetRawFileFromHap(const std::string &rawFileName, size_t &len,
165        std::unique_ptr<uint8_t[]> &outValue) = 0;
166
167    virtual RState GetRawFileDescriptorFromHap(const std::string &rawFileName, RawFileDescriptor &descriptor) = 0;
168
169    virtual RState IsLoadHap(std::string &hapPath) = 0;
170
171    virtual RState GetRawFileList(const std::string &rawDirPath, std::vector<std::string> &rawfileList) = 0;
172
173    virtual RState GetDrawableInfoById(uint32_t id, std::string &type, size_t &len,
174        std::unique_ptr<uint8_t[]> &outValue, uint32_t density = 0) = 0;
175
176    virtual RState GetDrawableInfoByName(const char *name, std::string &type, size_t &len,
177        std::unique_ptr<uint8_t[]> &outValue, uint32_t density = 0) = 0;
178
179    virtual bool AddResource(const std::string &path, const std::vector<std::string> &overlayPaths) = 0;
180
181    virtual bool RemoveResource(const std::string &path, const std::vector<std::string> &overlayPaths) = 0;
182
183    virtual RState GetStringFormatById(uint32_t id, std::string &outValue,
184        std::vector<std::tuple<NapiValueType, std::string>> &jsParams) = 0;
185
186    virtual RState GetStringFormatByName(const char *name, std::string &outValue,
187        std::vector<std::tuple<NapiValueType, std::string>> &jsParams) = 0;
188
189    virtual uint32_t GetResourceLimitKeys() = 0;
190
191    virtual bool AddAppOverlay(const std::string &path) = 0;
192
193    virtual bool RemoveAppOverlay(const std::string &path) = 0;
194
195    virtual RState GetRawFdNdkFromHap(const std::string &rawFileName, RawFileDescriptor &descriptor) = 0;
196
197    virtual RState GetResId(const std::string &resTypeName, uint32_t &resId) = 0;
198
199    virtual void GetLocales(std::vector<std::string> &outValue, bool includeSystem = false) = 0;
200
201    virtual RState GetDrawableInfoById(uint32_t id,
202        std::tuple<std::string, size_t, std::string> &drawableInfo,
203        std::unique_ptr<uint8_t[]> &outValue, uint32_t iconType, uint32_t density = 0) = 0;
204
205    virtual RState GetDrawableInfoByName(const char *name,
206        std::tuple<std::string, size_t, std::string> &drawableInfo,
207        std::unique_ptr<uint8_t[]> &outValue, uint32_t iconType, uint32_t density = 0) = 0;
208
209    virtual RState GetSymbolById(uint32_t id, uint32_t &outValue) = 0;
210
211    virtual RState GetSymbolByName(const char *name, uint32_t &outValue) = 0;
212
213    virtual RState GetThemeIcons(uint32_t resId, std::pair<std::unique_ptr<uint8_t[]>, size_t> &foregroundInfo,
214        std::pair<std::unique_ptr<uint8_t[]>, size_t> &backgroundInfo, uint32_t density = 0,
215        const std::string &abilityName = "") = 0;
216
217    virtual std::string GetThemeMask() = 0;
218
219    virtual bool HasIconInTheme(const std::string &bundleName) = 0;
220
221    virtual RState GetOtherIconsInfo(const std::string &iconName,
222        std::unique_ptr<uint8_t[]> &outValue, size_t &len, bool isGlobalMask) = 0;
223
224    virtual RState IsRawDirFromHap(const std::string &pathName, bool &outValue) = 0;
225
226    virtual std::shared_ptr<ResourceManager> GetOverrideResourceManager(
227        std::shared_ptr<ResConfig> overrideResConfig) = 0;
228
229    virtual RState UpdateOverrideResConfig(ResConfig &resConfig) = 0;
230
231    virtual void GetOverrideResConfig(ResConfig &resConfig) = 0;
232
233    virtual RState GetDynamicIcon(const std::string &resName, std::pair<std::unique_ptr<uint8_t[]>, size_t> &iconInfo,
234        uint32_t density = 0) = 0;
235
236    virtual RState GetStringFormatById(std::string &outValue, uint32_t id, va_list args) = 0;
237
238    virtual RState GetStringFormatByName(std::string &outValue, const char *name, va_list args) = 0;
239
240    virtual RState GetFormatPluralStringById(std::string &outValue, uint32_t id, int quantity,
241        std::vector<std::tuple<ResourceManager::NapiValueType, std::string>> &jsParams) = 0;
242
243    virtual RState GetFormatPluralStringByName(std::string &outValue, const char *name, int quantity,
244        std::vector<std::tuple<ResourceManager::NapiValueType, std::string>> &jsParams) = 0;
245
246    virtual bool AddPatchResource(const char *path, const char *patchPath) = 0;
247};
248
249EXPORT_FUNC ResourceManager *CreateResourceManager();
250
251/**
252 * Get system resource manager, the added system resource is sandbox path. This method should call
253 * after the sandbox mount.
254 *
255 * @return pointer of system resource manager
256 */
257EXPORT_FUNC ResourceManager *GetSystemResourceManager();
258
259/**
260 * Get system resource manager, the added system resource is no sandbox path. This method should call
261 * before the sandbox mount, for example appspawn.
262 *
263 * @return pointer of system resource manager
264 */
265EXPORT_FUNC ResourceManager *GetSystemResourceManagerNoSandBox();
266
267/**
268 * Create app resource manager.
269 *
270 * @param bundleName the hap bundleName
271 * @param moduleName the hap moduleName
272 * @param hapPath the hap resource path
273 * @param overlayPath the hap overlay resource path
274 * @param resConfig the device resConfig
275 * @param appType the app type
276 * @return pointer of app resource manager
277 */
278EXPORT_FUNC std::shared_ptr<ResourceManager> CreateResourceManager(const std::string &bundleName,
279    const std::string &moduleName, const std::string &hapPath, const std::vector<std::string> &overlayPath,
280    ResConfig &resConfig, int32_t appType = 0, int32_t userId = 100);
281
282} // namespace Resource
283} // namespace Global
284} // namespace OHOS
285#endif