• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025 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 BUNDLE_FRAMEWORK_INTERFACES_KITS_ANI_ENUM_UTIL_H
17 #define BUNDLE_FRAMEWORK_INTERFACES_KITS_ANI_ENUM_UTIL_H
18 
19 #include <array>
20 #include <string>
21 
22 #include "app_log_wrapper.h"
23 #include "bundle_mgr_interface.h"
24 
25 namespace OHOS {
26 namespace AppExecFwk {
27 namespace CommonFunAniNS {
28 constexpr int32_t UNSPECIFIED = 255;
29 
30 constexpr const char* CLASSNAME_BUNDLEMANAGER_BUNDLE_FLAG = "L@ohos/bundle/bundleManager/bundleManager/BundleFlag;";
31 constexpr const char* CLASSNAME_BUNDLEMANAGER_BUNDLE_TYPE = "L@ohos/bundle/bundleManager/bundleManager/BundleType;";
32 constexpr const char* CLASSNAME_BUNDLEMANAGER_MULTIAPPMODE_TYPE =
33     "L@ohos/bundle/bundleManager/bundleManager/MultiAppModeType;";
34 constexpr const char* CLASSNAME_BUNDLEMANAGER_DISPLAYORIENTATION =
35     "L@ohos/bundle/bundleManager/bundleManager/DisplayOrientation;";
36 constexpr const char* CLASSNAME_BUNDLEMANAGER_LAUNCH_TYPE = "L@ohos/bundle/bundleManager/bundleManager/LaunchType;";
37 constexpr const char* CLASSNAME_BUNDLEMANAGER_SUPPORTWINDOWMODE =
38     "L@ohos/bundle/bundleManager/bundleManager/SupportWindowMode;";
39 constexpr const char* CLASSNAME_BUNDLEMANAGER_EXTENSIONABILITY_TYPE =
40     "L@ohos/bundle/bundleManager/bundleManager/ExtensionAbilityType;";
41 constexpr const char* CLASSNAME_BUNDLEMANAGER_MODULE_TYPE = "L@ohos/bundle/bundleManager/bundleManager/ModuleType;";
42 constexpr const char* CLASSNAME_BUNDLEMANAGER_PERMISSIONGRANTSTATE =
43     "L@ohos/bundle/bundleManager/bundleManager/PermissionGrantState;";
44 constexpr const char* CLASSNAME_BUNDLEMANAGER_APPLICATION_FLAG =
45     "L@ohos/bundle/bundleManager/bundleManager/ApplicationFlag;";
46 constexpr const char* CLASSNAME_BUNDLE_DISPLAYORIENTATION = "L@ohos/bundle/bundle/DisplayOrientation;";
47 constexpr const char* CLASSNAME_BUNDLE_ABILITY_TYPE = "L@ohos/bundle/bundle/AbilityType;";
48 constexpr const char* CLASSNAME_BUNDLE_ABILITYSUB_TYPE = "L@ohos/bundle/bundle/AbilitySubType;";
49 constexpr const char* CLASSNAME_BUNDLE_LAUNCHMODE = "L@ohos/bundle/bundle/LaunchMode;";
50 constexpr const char* CLASSNAME_ZLIB_COMPRESSLEVEL = "L@ohos/zlib/zlib/CompressLevel;";
51 constexpr const char* CLASSNAME_ZLIB_MEMLEVEL = "L@ohos/zlib/zlib/MemLevel;";
52 constexpr const char* CLASSNAME_ZLIB_COMPRESSSTRATEGY = "L@ohos/zlib/zlib/CompressStrategy;";
53 } // namespace CommonFunAniNS
54 class EnumUtils {
55 private:
EnumNativeToETSByIndex(ani_env * env,const char * enumClassName,const size_t index)56     static ani_enum_item EnumNativeToETSByIndex(ani_env* env, const char* enumClassName, const size_t index)
57     {
58         if (env == nullptr) {
59             APP_LOGE("null env");
60             return nullptr;
61         }
62 
63         ani_enum aniEnum = nullptr;
64         ani_status status = env->FindEnum(enumClassName, &aniEnum);
65         if (status != ANI_OK) {
66             APP_LOGE("FindEnum failed %{public}d", status);
67             return nullptr;
68         }
69 
70         ani_enum_item enumItem = nullptr;
71         status = env->Enum_GetEnumItemByIndex(aniEnum, index, &enumItem);
72         if (status != ANI_OK) {
73             APP_LOGE("Enum_GetEnumItemByIndex failed %{public}d", status);
74             return nullptr;
75         }
76         return enumItem;
77     }
78 
79     // enum offset = enum value - enum index
EnumNativeToETSByOffset(ani_env * env,const char * enumClassName,const int32_t enumValue,const int32_t offset)80     static inline ani_enum_item EnumNativeToETSByOffset(
81         ani_env* env, const char* enumClassName, const int32_t enumValue, const int32_t offset)
82     {
83         if (enumValue < offset) {
84             APP_LOGE("invalid index");
85             return nullptr;
86         }
87         return EnumNativeToETSByIndex(env, enumClassName, enumValue - offset);
88     }
89 
90     template<std::size_t tableSize>
EnumNativeToETSByTable(ani_env * env,const char * enumClassName,const int32_t enumValue,const std::array<int32_t,tableSize> & table)91     static inline ani_enum_item EnumNativeToETSByTable(
92         ani_env* env, const char* enumClassName, const int32_t enumValue, const std::array<int32_t, tableSize>& table)
93     {
94         for (std::size_t index = 0; index < table.size(); ++index) {
95             if (enumValue == table[index]) {
96                 return EnumNativeToETSByIndex(env, enumClassName, index);
97             }
98         }
99 
100         APP_LOGE("Not found %{public}d", enumValue);
101         return nullptr;
102     }
103 
104     /* bundleManager.BundleFlag
105     enum BundleFlag {
106         GET_BUNDLE_INFO_DEFAULT = 0x00000000,
107         GET_BUNDLE_INFO_WITH_APPLICATION = 0x00000001,
108         GET_BUNDLE_INFO_WITH_HAP_MODULE = 0x00000002,
109         GET_BUNDLE_INFO_WITH_ABILITY = 0x00000004,
110         GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY = 0x00000008,
111         GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION = 0x00000010,
112         GET_BUNDLE_INFO_WITH_METADATA = 0x00000020,
113         GET_BUNDLE_INFO_WITH_DISABLE = 0x00000040,
114         GET_BUNDLE_INFO_WITH_SIGNATURE_INFO = 0x00000080,
115         GET_BUNDLE_INFO_WITH_MENU = 0x00000100,
116         GET_BUNDLE_INFO_WITH_ROUTER_MAP = 0x00000200,
117         GET_BUNDLE_INFO_WITH_SKILL = 0x00000800,
118         GET_BUNDLE_INFO_ONLY_WITH_LAUNCHER_ABILITY = 0x00001000,
119         GET_BUNDLE_INFO_OF_ANY_USER = 0x00002000,
120         GET_BUNDLE_INFO_EXCLUDE_CLONE = 0x00004000,
121         GET_BUNDLE_INFO_WITH_CLOUD_KIT = 0x00008000,
122     } */
123     static constexpr std::array<int, 16> Array_BundleManager_BundleFlag = {
124         0x00000000,
125         0x00000001,
126         0x00000002,
127         0x00000004,
128         0x00000008,
129         0x00000010,
130         0x00000020,
131         0x00000040,
132         0x00000080,
133         0x00000100,
134         0x00000200,
135         0x00000800,
136         0x00001000,
137         0x00002000,
138         0x00004000,
139         0x00008000,
140     };
141     /* bundleManager.ExtensionAbilityType
142     enum ExtensionAbilityType {
143         FORM = 0,
144         WORK_SCHEDULER = 1,
145         INPUT_METHOD = 2,
146         SERVICE = 3,
147         ACCESSIBILITY = 4,
148         DATA_SHARE = 5,
149         FILE_SHARE = 6,
150         STATIC_SUBSCRIBER = 7,
151         WALLPAPER = 8,
152         BACKUP = 9,
153         WINDOW = 10,
154         ENTERPRISE_ADMIN = 11,
155         THUMBNAIL = 13,
156         PREVIEW = 14,
157         PRINT = 15,
158         SHARE = 16,
159         PUSH = 17,
160         DRIVER = 18,
161         ACTION = 19,
162         ADS_SERVICE = 20,
163         EMBEDDED_UI = 21,
164         INSIGHT_INTENT_UI = 22,
165         FENCE = 24,
166         CALLER_INFO_QUERY = 25,
167         ASSET_ACCELERATION = 26,
168         FORM_EDIT = 27,
169         DISTRIBUTED = 28,
170         APP_SERVICE = 29,
171         LIVE_FORM = 30,
172         UNSPECIFIED = 255
173     } */
174     static constexpr std::array<int, 30> Array_BundleManager_ExtensionAbilityType = {
175         0,
176         1,
177         2,
178         3,
179         4,
180         5,
181         6,
182         7,
183         8,
184         9,
185         10,
186         11,
187         13,
188         14,
189         15,
190         16,
191         17,
192         18,
193         19,
194         20,
195         21,
196         22,
197         24,
198         25,
199         26,
200         27,
201         28,
202         29,
203         30,
204         255,
205     };
206     /* bundleManager.ApplicationFlag
207     enum ApplicationFlag {
208         GET_APPLICATION_INFO_DEFAULT = 0x00000000,
209         GET_APPLICATION_INFO_WITH_PERMISSION = 0x00000001,
210         GET_APPLICATION_INFO_WITH_METADATA = 0x00000002,
211         GET_APPLICATION_INFO_WITH_DISABLE = 0x00000004
212     } */
213     static constexpr std::array<int, 4> Array_BundleManager_ApplicationFlag = {
214         0x00000000,
215         0x00000001,
216         0x00000002,
217         0x00000004,
218     };
219     /* zlib.CompressLevel
220     enum CompressLevel {
221         COMPRESS_LEVEL_NO_COMPRESSION = 0,
222         COMPRESS_LEVEL_BEST_SPEED = 1,
223         COMPRESS_LEVEL_BEST_COMPRESSION = 9,
224         COMPRESS_LEVEL_DEFAULT_COMPRESSION = -1
225     }*/
226     static constexpr std::array<int, 4> Array_Zlib_CompressLevel = {
227         0,
228         1,
229         9,
230         -1,
231     };
232     /* zlib.MemLevel
233     enum MemLevel {
234         MEM_LEVEL_MIN = 1,
235         MEM_LEVEL_MAX = 9,
236         MEM_LEVEL_DEFAULT = 8
237     } */
238     static constexpr std::array<int, 3> Array_Zlib_MemLevel = {
239         1,
240         9,
241         8,
242     };
243 
244 public:
245     template<typename enumType>
EnumETSToNative(ani_env * env,ani_enum_item enumItem,enumType & enumValue)246     static bool EnumETSToNative(ani_env* env, ani_enum_item enumItem, enumType& enumValue)
247     {
248         if (env == nullptr) {
249             APP_LOGE("null env");
250             return false;
251         }
252 
253         if (enumItem == nullptr) {
254             APP_LOGE("null enumItem");
255             return false;
256         }
257 
258         ani_int value {};
259         ani_status status = env->EnumItem_GetValue_Int(enumItem, &value);
260         if (status != ANI_OK) {
261             APP_LOGE("EnumItem_GetValue_Int failed %{public}d", status);
262             return false;
263         }
264 
265         enumValue = static_cast<enumType>(value);
266         return true;
267     }
268 
269     // bundleManager.BundleFlag
EnumNativeToETS_BundleManager_BundleFlag(ani_env * env,const int32_t value)270     static inline ani_enum_item EnumNativeToETS_BundleManager_BundleFlag(ani_env* env, const int32_t value)
271     {
272         return EnumNativeToETSByTable(
273             env, CommonFunAniNS::CLASSNAME_BUNDLEMANAGER_BUNDLE_FLAG, value, Array_BundleManager_BundleFlag);
274     }
275 
276     /* bundleManager.BundleType
277     enum BundleType {
278         APP = 0,
279         ATOMIC_SERVICE = 1
280     } */
EnumNativeToETS_BundleManager_BundleType(ani_env * env,const int32_t value)281     static inline ani_enum_item EnumNativeToETS_BundleManager_BundleType(ani_env* env, const int32_t value)
282     {
283         return EnumNativeToETSByOffset(env, CommonFunAniNS::CLASSNAME_BUNDLEMANAGER_BUNDLE_TYPE, value, 0);
284     }
285 
286     /* bundleManager.MultiAppModeType
287     enum MultiAppModeType {
288         UNSPECIFIED = 0,
289         MULTI_INSTANCE = 1,
290         APP_CLONE = 2,
291     } */
EnumNativeToETS_BundleManager_MultiAppModeType(ani_env * env,const int32_t value)292     static inline ani_enum_item EnumNativeToETS_BundleManager_MultiAppModeType(ani_env* env, const int32_t value)
293     {
294         return EnumNativeToETSByOffset(env, CommonFunAniNS::CLASSNAME_BUNDLEMANAGER_MULTIAPPMODE_TYPE, value, 0);
295     }
296 
297     /* bundleManager.DisplayOrientation
298     enum DisplayOrientation {
299         UNSPECIFIED,
300         LANDSCAPE,
301         PORTRAIT,
302         FOLLOW_RECENT,
303         LANDSCAPE_INVERTED,
304         PORTRAIT_INVERTED,
305         AUTO_ROTATION,
306         AUTO_ROTATION_LANDSCAPE,
307         AUTO_ROTATION_PORTRAIT,
308         AUTO_ROTATION_RESTRICTED,
309         AUTO_ROTATION_LANDSCAPE_RESTRICTED,
310         AUTO_ROTATION_PORTRAIT_RESTRICTED,
311         LOCKED,
312         AUTO_ROTATION_UNSPECIFIED,
313         FOLLOW_DESKTOP
314     } */
EnumNativeToETS_BundleManager_DisplayOrientation(ani_env * env,const int32_t value)315     static inline ani_enum_item EnumNativeToETS_BundleManager_DisplayOrientation(ani_env* env, const int32_t value)
316     {
317         return EnumNativeToETSByOffset(env, CommonFunAniNS::CLASSNAME_BUNDLEMANAGER_DISPLAYORIENTATION, value, 0);
318     }
319 
320     /* bundleManager.LaunchType
321     enum LaunchType {
322         SINGLETON = 0,
323         MULTITON = 1,
324         SPECIFIED = 2
325     } */
EnumNativeToETS_BundleManager_LaunchType(ani_env * env,const int32_t value)326     static inline ani_enum_item EnumNativeToETS_BundleManager_LaunchType(ani_env* env, const int32_t value)
327     {
328         return EnumNativeToETSByOffset(env, CommonFunAniNS::CLASSNAME_BUNDLEMANAGER_LAUNCH_TYPE, value, 0);
329     }
330 
331     /* bundleManager.SupportWindowMode
332     SupportWindowMode {
333         FULL_SCREEN = 0,
334         SPLIT = 1,
335         FLOATING = 2
336     } */
EnumNativeToETS_BundleManager_SupportWindowMode(ani_env * env,const int32_t value)337     static inline ani_enum_item EnumNativeToETS_BundleManager_SupportWindowMode(ani_env* env, const int32_t value)
338     {
339         return EnumNativeToETSByOffset(env, CommonFunAniNS::CLASSNAME_BUNDLEMANAGER_SUPPORTWINDOWMODE, value, 0);
340     }
341 
342     // bundleManager.ExtensionAbilityType
EnumNativeToETS_BundleManager_ExtensionAbilityType(ani_env * env,const int32_t value)343     static inline ani_enum_item EnumNativeToETS_BundleManager_ExtensionAbilityType(ani_env* env, const int32_t value)
344     {
345         bool isValid = std::find(std::begin(Array_BundleManager_ExtensionAbilityType),
346                                  std::end(Array_BundleManager_ExtensionAbilityType),
347                                  value) != std::end(Array_BundleManager_ExtensionAbilityType);
348         return EnumNativeToETSByTable(env, CommonFunAniNS::CLASSNAME_BUNDLEMANAGER_EXTENSIONABILITY_TYPE,
349             isValid ? value : CommonFunAniNS::UNSPECIFIED, Array_BundleManager_ExtensionAbilityType);
350     }
351 
352     /* bundleManager.ModuleType
353     enum ModuleType {
354         ENTRY = 1,
355         FEATURE = 2,
356         SHARED = 3
357     } */
EnumNativeToETS_BundleManager_ModuleType(ani_env * env,const int32_t value)358     static inline ani_enum_item EnumNativeToETS_BundleManager_ModuleType(ani_env* env, const int32_t value)
359     {
360         return EnumNativeToETSByOffset(env, CommonFunAniNS::CLASSNAME_BUNDLEMANAGER_MODULE_TYPE, value, 1);
361     }
362 
363     /* bundleManager.PermissionGrantState
364     enum PermissionGrantState {
365         PERMISSION_DENIED = -1,
366         PERMISSION_GRANTED = 0
367     } */
EnumNativeToETS_BundleManager_PermissionGrantState(ani_env * env,const int32_t value)368     static inline ani_enum_item EnumNativeToETS_BundleManager_PermissionGrantState(ani_env* env, const int32_t value)
369     {
370         return EnumNativeToETSByOffset(env, CommonFunAniNS::CLASSNAME_BUNDLEMANAGER_PERMISSIONGRANTSTATE, value, -1);
371     }
372 
373     // bundleManager.ApplicationFlag
EnumNativeToETS_BundleManager_ApplicationFlag(ani_env * env,const int32_t value)374     static inline ani_enum_item EnumNativeToETS_BundleManager_ApplicationFlag(ani_env* env, const int32_t value)
375     {
376         return EnumNativeToETSByTable(
377             env, CommonFunAniNS::CLASSNAME_BUNDLEMANAGER_APPLICATION_FLAG, value, Array_BundleManager_ApplicationFlag);
378     }
379 
380     /* bundle.DisplayOrientation
381     enum DisplayOrientation {
382         UNSPECIFIED,
383         LANDSCAPE,
384         PORTRAIT,
385         FOLLOW_RECENT
386     } */
EnumNativeToETS_Bundle_DisplayOrientation(ani_env * env,const int32_t value)387     static inline ani_enum_item EnumNativeToETS_Bundle_DisplayOrientation(ani_env* env, const int32_t value)
388     {
389         return EnumNativeToETSByOffset(env, CommonFunAniNS::CLASSNAME_BUNDLE_DISPLAYORIENTATION, value, 0);
390     }
391 
392     /* bundle.AbilityType
393     enum AbilityType {
394         UNKNOWN,
395         PAGE,
396         SERVICE,
397         DATA
398     } */
EnumNativeToETS_Bundle_AbilityType(ani_env * env,const int32_t value)399     static inline ani_enum_item EnumNativeToETS_Bundle_AbilityType(ani_env* env, const int32_t value)
400     {
401         return EnumNativeToETSByOffset(env, CommonFunAniNS::CLASSNAME_BUNDLE_ABILITY_TYPE, value, 0);
402     }
403 
404     /* bundle.AbilitySubType
405     enum AbilitySubType {
406         UNSPECIFIED = 0,
407         CA = 1
408     } */
EnumNativeToETS_Bundle_AbilitySubType(ani_env * env,const int32_t value)409     static inline ani_enum_item EnumNativeToETS_Bundle_AbilitySubType(ani_env* env, const int32_t value)
410     {
411         return EnumNativeToETSByOffset(env, CommonFunAniNS::CLASSNAME_BUNDLE_ABILITYSUB_TYPE, value, 0);
412     }
413 
414     /* bundle.LaunchMode
415     enum LaunchMode {
416         SINGLETON = 0,
417         STANDARD = 1
418     } */
EnumNativeToETS_Bundle_LaunchMode(ani_env * env,const int32_t value)419     static inline ani_enum_item EnumNativeToETS_Bundle_LaunchMode(ani_env* env, const int32_t value)
420     {
421         return EnumNativeToETSByOffset(env, CommonFunAniNS::CLASSNAME_BUNDLE_LAUNCHMODE, value, 0);
422     }
423 
424     // zlib.CompressLevel
EnumNativeToETS_Zlib_CompressLevel(ani_env * env,const int32_t value)425     static inline ani_enum_item EnumNativeToETS_Zlib_CompressLevel(ani_env* env, const int32_t value)
426     {
427         return EnumNativeToETSByTable(
428             env, CommonFunAniNS::CLASSNAME_ZLIB_COMPRESSLEVEL, value, Array_Zlib_CompressLevel);
429     }
430 
431     // zlib.MemLevel
EnumNativeToETS_Zlib_MemLevel(ani_env * env,const int32_t value)432     static inline ani_enum_item EnumNativeToETS_Zlib_MemLevel(ani_env* env, const int32_t value)
433     {
434         return EnumNativeToETSByTable(env, CommonFunAniNS::CLASSNAME_ZLIB_MEMLEVEL, value, Array_Zlib_MemLevel);
435     }
436 
437     /* zlib.CompressStrategy
438     enum CompressStrategy {
439         COMPRESS_STRATEGY_DEFAULT_STRATEGY = 0,
440         COMPRESS_STRATEGY_FILTERED = 1,
441         COMPRESS_STRATEGY_HUFFMAN_ONLY = 2,
442         COMPRESS_STRATEGY_RLE = 3,
443         COMPRESS_STRATEGY_FIXED = 4
444     } */
EnumNativeToETS_Zlib_CompressStrategy(ani_env * env,const int32_t value)445     static inline ani_enum_item EnumNativeToETS_Zlib_CompressStrategy(ani_env* env, const int32_t value)
446     {
447         return EnumNativeToETSByOffset(env, CommonFunAniNS::CLASSNAME_ZLIB_COMPRESSSTRATEGY, value, 0);
448     }
449 };
450 } // namespace AppExecFwk
451 } // namespace OHOS
452 #endif
453