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