1 /* 2 * Copyright (c) 2021-2022 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_MGR_H 17 #define BUNDLE_MGR_H 18 #include <vector> 19 20 #include "napi/native_api.h" 21 #include "napi/native_common.h" 22 #include "napi/native_node_api.h" 23 24 #include "application_info.h" 25 #include "bundle_death_recipient.h" 26 #include "bundle_mgr_interface.h" 27 #include "cleancache_callback.h" 28 #include "js_runtime_utils.h" 29 #ifdef BUNDLE_FRAMEWORK_GRAPHICS 30 #include "pixel_map.h" 31 #endif 32 #include "want.h" 33 34 namespace OHOS { 35 namespace AppExecFwk { 36 struct AsyncWorkData { 37 explicit AsyncWorkData(napi_env napiEnv); 38 virtual ~AsyncWorkData(); 39 napi_env env; 40 napi_async_work asyncWork = nullptr; 41 napi_deferred deferred = nullptr; 42 napi_ref callback = nullptr; 43 }; 44 45 struct QueryParameter { 46 int flags; 47 std::string userId; 48 }; 49 50 struct BundleOptions { 51 int32_t userId = Constants::UNSPECIFIED_USERID; 52 }; 53 54 struct AsyncAbilityInfoCallbackInfo : public AsyncWorkData { AsyncAbilityInfoCallbackInfoAsyncAbilityInfoCallbackInfo55 explicit AsyncAbilityInfoCallbackInfo(napi_env env) : AsyncWorkData(env) {} 56 OHOS::AAFwk::Want want; 57 int32_t flags = 0; 58 int32_t userId = Constants::UNSPECIFIED_USERID; 59 std::vector<OHOS::AppExecFwk::AbilityInfo> abilityInfos; 60 bool ret = false; 61 int32_t err = 0; 62 }; 63 64 struct AsyncAbilityInfosCallbackInfo : public AsyncWorkData { AsyncAbilityInfosCallbackInfoAsyncAbilityInfosCallbackInfo65 explicit AsyncAbilityInfosCallbackInfo(napi_env env) : AsyncWorkData(env) {} 66 int32_t flags = 0; 67 std::string bundleName; 68 std::string abilityName; 69 std::string moduleName = ""; 70 bool hasModuleName = false; 71 OHOS::AppExecFwk::AbilityInfo abilityInfo; 72 bool ret = false; 73 int32_t err = 0; 74 std::string message; 75 }; 76 77 struct AsyncBundleInfoCallbackInfo : public AsyncWorkData { AsyncBundleInfoCallbackInfoAsyncBundleInfoCallbackInfo78 explicit AsyncBundleInfoCallbackInfo(napi_env env) : AsyncWorkData(env) {} 79 std::string param; 80 int32_t flags = 0; 81 OHOS::AppExecFwk::BundleInfo bundleInfo; 82 bool ret = false; 83 int32_t err = 0; 84 std::string message; 85 BundleOptions bundleOptions; 86 }; 87 88 struct AsyncApplicationInfoCallbackInfo : public AsyncWorkData { AsyncApplicationInfoCallbackInfoAsyncApplicationInfoCallbackInfo89 explicit AsyncApplicationInfoCallbackInfo(napi_env env) : AsyncWorkData(env) {} 90 std::string bundleName; 91 int32_t flags = 0; 92 int32_t userId = Constants::UNSPECIFIED_USERID; 93 OHOS::AppExecFwk::ApplicationInfo appInfo; 94 bool ret = false; 95 int32_t err = 0; 96 std::string message; 97 }; 98 99 struct AsyncPermissionDefCallbackInfo : public AsyncWorkData { AsyncPermissionDefCallbackInfoAsyncPermissionDefCallbackInfo100 explicit AsyncPermissionDefCallbackInfo(napi_env env) : AsyncWorkData(env) {} 101 std::string permissionName; 102 OHOS::AppExecFwk::PermissionDef permissionDef; 103 bool ret = false; 104 int32_t err = 0; 105 std::string message; 106 }; 107 108 struct AsyncBundleInfosCallbackInfo : public AsyncWorkData { AsyncBundleInfosCallbackInfoAsyncBundleInfosCallbackInfo109 explicit AsyncBundleInfosCallbackInfo(napi_env env) : AsyncWorkData(env) {} 110 int32_t flags = 0; 111 std::vector<OHOS::AppExecFwk::BundleInfo> bundleInfos; 112 bool ret = false; 113 int32_t err = 0; 114 std::string message; 115 int32_t userId = Constants::UNSPECIFIED_USERID; 116 }; 117 118 struct AsyncApplicationInfosCallbackInfo : public AsyncWorkData { AsyncApplicationInfosCallbackInfoAsyncApplicationInfosCallbackInfo119 explicit AsyncApplicationInfosCallbackInfo(napi_env env) : AsyncWorkData(env) {} 120 int32_t flags = 0; 121 int32_t userId = Constants::UNSPECIFIED_USERID; 122 std::vector<OHOS::AppExecFwk::ApplicationInfo> appInfos; 123 bool ret = false; 124 int32_t err = 0; 125 std::string message; 126 }; 127 128 struct AsyncAbilityLabelCallbackInfo : public AsyncWorkData { AsyncAbilityLabelCallbackInfoAsyncAbilityLabelCallbackInfo129 explicit AsyncAbilityLabelCallbackInfo(napi_env env) : AsyncWorkData(env) {} 130 std::string bundleName; 131 std::string className; 132 std::string moduleName = ""; 133 bool hasModuleName = false; 134 std::string abilityLabel; 135 int32_t err = 0; 136 std::string message; 137 }; 138 139 struct InstallResult { 140 std::string resultMsg; 141 int32_t resultCode = 0; 142 }; 143 144 struct AsyncInstallCallbackInfo : public AsyncWorkData { AsyncInstallCallbackInfoAsyncInstallCallbackInfo145 explicit AsyncInstallCallbackInfo(napi_env env) : AsyncWorkData(env) {} 146 std::vector<std::string> hapFiles; 147 std::string bundleName; 148 std::string param; 149 OHOS::AppExecFwk::InstallParam installParam; 150 InstallResult installResult; 151 int32_t errCode = 0; 152 }; 153 154 struct AsyncGetBundleInstallerCallbackInfo : public AsyncWorkData { AsyncGetBundleInstallerCallbackInfoAsyncGetBundleInstallerCallbackInfo155 explicit AsyncGetBundleInstallerCallbackInfo(napi_env env) : AsyncWorkData(env) {} 156 }; 157 158 struct AsyncFormInfosCallbackInfo : public AsyncWorkData { AsyncFormInfosCallbackInfoAsyncFormInfosCallbackInfo159 explicit AsyncFormInfosCallbackInfo(napi_env env) : AsyncWorkData(env) {} 160 std::vector<OHOS::AppExecFwk::FormInfo> formInfos; 161 bool ret = false; 162 }; 163 164 struct AsyncFormInfosByModuleCallbackInfo : public AsyncWorkData { AsyncFormInfosByModuleCallbackInfoAsyncFormInfosByModuleCallbackInfo165 explicit AsyncFormInfosByModuleCallbackInfo(napi_env env) : AsyncWorkData(env) {} 166 std::string bundleName; 167 std::string moduleName; 168 std::vector<OHOS::AppExecFwk::FormInfo> formInfos; 169 bool ret = false; 170 }; 171 172 struct AsyncFormInfosByAppCallbackInfo : public AsyncWorkData { AsyncFormInfosByAppCallbackInfoAsyncFormInfosByAppCallbackInfo173 explicit AsyncFormInfosByAppCallbackInfo(napi_env env) : AsyncWorkData(env) {} 174 std::string bundleName; 175 std::vector<OHOS::AppExecFwk::FormInfo> formInfos; 176 bool ret = false; 177 }; 178 179 struct AsyncLaunchWantForBundleCallbackInfo : public AsyncWorkData { AsyncLaunchWantForBundleCallbackInfoAsyncLaunchWantForBundleCallbackInfo180 explicit AsyncLaunchWantForBundleCallbackInfo(napi_env env) : AsyncWorkData(env) {} 181 std::string bundleName; 182 OHOS::AAFwk::Want want; 183 bool ret = false; 184 int32_t err = 0; 185 }; 186 187 struct AsyncGetBundleGidsCallbackInfo : public AsyncWorkData { AsyncGetBundleGidsCallbackInfoAsyncGetBundleGidsCallbackInfo188 explicit AsyncGetBundleGidsCallbackInfo(napi_env env) : AsyncWorkData(env) {} 189 std::string bundleName; 190 std::vector<int32_t> gids; 191 int32_t err = 0; 192 bool ret = false; 193 std::string message; 194 }; 195 196 struct AsyncGetNameByUidInfo : public AsyncWorkData { AsyncGetNameByUidInfoAsyncGetNameByUidInfo197 explicit AsyncGetNameByUidInfo(napi_env env) : AsyncWorkData(env) {} 198 int32_t uid = 0; 199 std::string bundleName; 200 int32_t err = 0; 201 bool ret = false; 202 }; 203 204 struct AsyncHandleBundleContext : public AsyncWorkData { AsyncHandleBundleContextAsyncHandleBundleContext205 explicit AsyncHandleBundleContext(napi_env env) : AsyncWorkData(env) {} 206 OHOS::sptr<CleanCacheCallback> cleanCacheCallback; 207 std::string bundleName; 208 std::string className; 209 int32_t labelId = 0; 210 int32_t iconId = 0; 211 bool ret = false; 212 int32_t err = 0; 213 }; 214 215 struct EnabledInfo : public AsyncWorkData { EnabledInfoEnabledInfo216 explicit EnabledInfo(napi_env env) : AsyncWorkData(env) {} 217 std::string bundleName; 218 OHOS::AppExecFwk::AbilityInfo abilityInfo; 219 bool isEnable = false; 220 bool result = false; 221 int32_t errCode = 0; 222 std::string errMssage; 223 }; 224 225 struct AsyncAbilityInfo : public AsyncWorkData { AsyncAbilityInfoAsyncAbilityInfo226 explicit AsyncAbilityInfo(napi_env env) : AsyncWorkData(env) {} 227 std::string bundleName; 228 std::string abilityName; 229 std::string moduleName = ""; 230 bool hasModuleName = false; 231 #ifdef BUNDLE_FRAMEWORK_GRAPHICS 232 std::shared_ptr<Media::PixelMap> pixelMap; 233 #endif 234 int32_t errCode = 0; 235 bool result = false; 236 std::string errMssage; 237 }; 238 239 struct Query { 240 std::string bundleName_; 241 std::string interfaceType_; 242 int32_t flags_ = 0; 243 int32_t userId_ = Constants::UNSPECIFIED_USERID; 244 napi_env env_; QueryQuery245 Query(const std::string &bundleName, const std::string &interfaceType, int32_t flags, int32_t userId, napi_env env) 246 : bundleName_(bundleName), interfaceType_(interfaceType), flags_(flags), userId_(userId), env_(env) {} 247 248 bool operator==(const Query &query) const 249 { 250 return bundleName_ == query.bundleName_ && interfaceType_ == query.interfaceType_ && 251 flags_ == query.flags_ && userId_ == query.userId_ && env_ == query.env_; 252 } 253 }; 254 255 struct QueryHash { operatorQueryHash256 size_t operator()(const Query &query) const 257 { 258 return std::hash<std::string>()(query.bundleName_) ^ std::hash<std::string>()(query.interfaceType_) ^ 259 std::hash<int32_t>()(query.flags_) ^ std::hash<int32_t>()(query.userId_); 260 } 261 }; 262 263 class BundleMgrDeathRecipient : public IRemoteObject::DeathRecipient { 264 virtual void OnRemoteDied([[maybe_unused]] const wptr<IRemoteObject>& remote) override; 265 }; 266 267 extern thread_local napi_ref g_classBundleInstaller; 268 269 napi_value WrapVoidToJS(napi_env env); 270 napi_value GetApplicationInfos(napi_env env, napi_callback_info info); 271 napi_value GetApplicationInfo(napi_env env, napi_callback_info info); 272 napi_value GetAbilityInfo(napi_env env, napi_callback_info info); 273 napi_value QueryAbilityInfos(napi_env env, napi_callback_info info); 274 napi_value GetBundleInfos(napi_env env, napi_callback_info info); 275 napi_value GetBundleInfo(napi_env env, napi_callback_info info); 276 napi_value GetBundleArchiveInfo(napi_env env, napi_callback_info info); 277 napi_value GetLaunchWantForBundle(napi_env env, napi_callback_info info); 278 napi_value GetPermissionDef(napi_env env, napi_callback_info info); 279 napi_value GetBundleInstaller(napi_env env, napi_callback_info info); 280 napi_value Install(napi_env env, napi_callback_info info); 281 napi_value Recover(napi_env env, napi_callback_info info); 282 napi_value Uninstall(napi_env env, napi_callback_info info); 283 napi_value BundleInstallerConstructor(napi_env env, napi_callback_info info); 284 napi_value GetAllFormsInfo(napi_env env, napi_callback_info info); 285 napi_value GetFormsInfoByApp(napi_env env, napi_callback_info info); 286 napi_value GetFormsInfoByModule(napi_env env, napi_callback_info info); 287 napi_value GetShortcutInfos(napi_env env, napi_callback_info info); 288 napi_value UnregisterPermissionsChanged(napi_env env, napi_callback_info info); 289 napi_value ClearBundleCache(napi_env env, napi_callback_info info); 290 napi_value SetApplicationEnabled(napi_env env, napi_callback_info info); 291 napi_value SetAbilityEnabled(napi_env env, napi_callback_info info); 292 napi_value GetNameForUid(napi_env env, napi_callback_info info); 293 napi_value GetAbilityLabel(napi_env env, napi_callback_info info); 294 napi_value GetAbilityIcon(napi_env env, napi_callback_info info); 295 napi_value GetBundleGids(napi_env env, napi_callback_info info); 296 napi_value IsAbilityEnabled(napi_env env, napi_callback_info info); 297 napi_value IsApplicationEnabled(napi_env env, napi_callback_info info); 298 bool UnwrapAbilityInfo(napi_env env, napi_value param, OHOS::AppExecFwk::AbilityInfo& abilityInfo); 299 void CreateAbilityTypeObject(napi_env env, napi_value value); 300 void CreateAbilitySubTypeObject(napi_env env, napi_value value); 301 void CreateDisplayOrientationObject(napi_env env, napi_value value); 302 void CreateLaunchModeObject(napi_env env, napi_value value); 303 void CreateFormTypeObject(napi_env env, napi_value value); 304 void CreateColorModeObject(napi_env env, napi_value value); 305 void CreateGrantStatusObject(napi_env env, napi_value value); 306 void CreateModuleRemoveFlagObject(napi_env env, napi_value value); 307 void CreateSignatureCompareResultObject(napi_env env, napi_value value); 308 void CreateShortcutExistenceObject(napi_env env, napi_value value); 309 void CreateQueryShortCutFlagObject(napi_env env, napi_value value); 310 void CreateBundleFlagObject(napi_env env, napi_value value); 311 void CreateInstallErrorCodeObject(napi_env env, napi_value value); 312 class JsBundleMgr { 313 public: 314 JsBundleMgr() = default; 315 ~JsBundleMgr() = default; 316 317 struct JsAbilityInfo { 318 std::string bundleName; 319 std::string abilityName; 320 std::string moduleName = ""; 321 bool hasModuleName = false; 322 OHOS::AppExecFwk::AbilityInfo abilityInfo; 323 bool ret = false; 324 }; 325 326 struct JsNameForUid { 327 std::string bundleName; 328 int32_t uid; 329 bool ret = false; 330 }; 331 332 struct JsAbilityLabel { 333 std::string bundleName; 334 std::string className; 335 std::string moduleName = ""; 336 bool hasModuleName = false; 337 std::string abilityLabel; 338 }; 339 340 struct JsAbilityIcon { 341 std::string bundleName; 342 std::string abilityName; 343 std::string moduleName = ""; 344 bool hasModuleName = false; 345 }; 346 static void Finalizer(NativeEngine *engine, void *data, void *hint); 347 static NativeValue* GetAllApplicationInfo(NativeEngine *engine, NativeCallbackInfo *info); 348 static NativeValue* GetApplicationInfo(NativeEngine *engine, NativeCallbackInfo *info); 349 static NativeValue* GetBundleArchiveInfo(NativeEngine *engine, NativeCallbackInfo *info); 350 static NativeValue* GetLaunchWantForBundle(NativeEngine *engine, NativeCallbackInfo *info); 351 static NativeValue* IsAbilityEnabled(NativeEngine *engine, NativeCallbackInfo *info); 352 static NativeValue* IsApplicationEnabled(NativeEngine *engine, NativeCallbackInfo *info); 353 std::string errMessage_; 354 355 private: 356 NativeValue* OnGetAllApplicationInfo(NativeEngine &engine, NativeCallbackInfo &info); 357 NativeValue* OnGetApplicationInfo(NativeEngine &engine, NativeCallbackInfo &info); 358 NativeValue* OnGetBundleArchiveInfo(NativeEngine &engine, NativeCallbackInfo &info); 359 NativeValue* OnGetLaunchWantForBundle(NativeEngine &engine, NativeCallbackInfo &info); 360 NativeValue* OnIsAbilityEnabled(NativeEngine &engine, NativeCallbackInfo &info); 361 NativeValue* OnIsApplicationEnabled(NativeEngine &engine, NativeCallbackInfo &info); 362 NativeValue* CreateCustomizeMetaDatas( 363 NativeEngine &engine, const std::map<std::string, std::vector<CustomizeData>> &metaData); 364 365 NativeValue* CreateInnerMetaDatas( 366 NativeEngine &engine, const std::map<std::string, std::vector<Metadata>> &metaData); 367 NativeValue* CreateInnerMetaDatas(NativeEngine &engine, const std::vector<Metadata> &metaData); 368 NativeValue* CreateCustomizeMetaData(NativeEngine &engine, const CustomizeData &customizeData); 369 NativeValue* CreateInnerMetaData(NativeEngine &engine, const Metadata &metadata); 370 NativeValue* CreateResource(NativeEngine &engine, const Resource &resource); 371 NativeValue* CreateModuleInfos(NativeEngine &engine, const std::vector<ModuleInfo> &moduleInfos); 372 NativeValue* CreateModuleInfo(NativeEngine &engine, const ModuleInfo &modInfo); 373 NativeValue* CreateAppInfo(NativeEngine &engine, const ApplicationInfo &appInfo); 374 int32_t InitGetAbilityInfo(NativeEngine &engine, NativeCallbackInfo &info, 375 NativeValue *&lastParam, std::string &errMessage, std::shared_ptr<JsAbilityInfo> abilityInfo); 376 NativeValue* CreateAbilityInfo(NativeEngine &engine, const AbilityInfo &abilityInfo); 377 NativeValue* CreateMetaData(NativeEngine &engine, const MetaData &metaData); 378 NativeValue* CreateUsedScene(NativeEngine &engine, const RequestPermissionUsedScene &usedScene); 379 NativeValue* CreateAppInfos(NativeEngine &engine, const std::vector<ApplicationInfo> &appInfos); 380 NativeValue* CreateBundleInfos(NativeEngine &engine, const std::vector<BundleInfo> &bundleInfos); 381 NativeValue* CreateBundleInfo(NativeEngine &engine, const BundleInfo &bundleInfo); 382 NativeValue* CreateAbilityInfos(NativeEngine &engine, const std::vector<AbilityInfo> &abilityInfos); 383 NativeValue* CreateHapModuleInfos(NativeEngine &engine, const std::vector<HapModuleInfo> &hapModuleInfos); 384 NativeValue* CreateHapModuleInfo(NativeEngine &engine, const HapModuleInfo &hapModuleInfo); 385 NativeValue* CreateRequestPermissions(NativeEngine &engine, 386 const std::vector<RequestPermission> &requestPermissions); 387 NativeValue* CreateRequestPermission(NativeEngine &engine, const RequestPermission &requestPermission); 388 NativeValue* CreateWant(NativeEngine &engine, const OHOS::AAFwk::Want &want); 389 NativeValue* UnwarpQueryAbilityInfolastParams(NativeCallbackInfo &info); 390 static bool UnwarpUserIdThreeParams(NativeEngine &engine, NativeCallbackInfo &info, int32_t &userId); 391 static bool UnwarpUserIdFourParams(NativeEngine &engine, NativeCallbackInfo &info, int32_t &userId); 392 static bool UnwarpUserIdFiveParams(NativeEngine &engine, NativeCallbackInfo &info, int32_t &userId); 393 static bool UnwarpBundleOptionsParams( 394 NativeEngine &engine, NativeCallbackInfo &info, BundleOptions &options, bool &result); 395 }; 396 397 } // namespace AppExecFwk 398 } // namespace OHOS 399 #endif /* BUNDLE_MGR_H */ 400