1/* 2 * Copyright (c) 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#include "startup_util.h" 17 18#include "ability_info.h" 19#include "extension_ability_info.h" 20#include "global_constant.h" 21#include "server_constant.h" 22#include "want.h" 23 24namespace OHOS::AbilityRuntime { 25namespace { 26constexpr int32_t REQUEST_CODE_LENGTH = 32; 27constexpr int32_t PID_LENGTH = 16; 28constexpr int32_t REQUEST_CODE_PID_LENGTH = 48; 29constexpr int32_t VALID_REQUEST_CODE_LENGTH = 49; 30} 31bool StartupUtil::GetAppIndex(const AAFwk::Want &want, int32_t &appIndex) 32{ 33 appIndex = want.GetIntParam(ServerConstant::DLP_INDEX, 0); 34 if (appIndex > GlobalConstant::MAX_APP_CLONE_INDEX) { 35 return true; 36 } 37 if (appIndex == 0) { 38 appIndex = want.GetIntParam(AAFwk::Want::PARAM_APP_CLONE_INDEX_KEY, 0); 39 if (appIndex < 0 || appIndex > GlobalConstant::MAX_APP_CLONE_INDEX) { 40 return false; 41 } 42 return true; 43 } 44 return false; 45} 46 47int32_t StartupUtil::BuildAbilityInfoFlag() 48{ 49 return AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION | 50 AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION | 51 AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA; 52} 53 54bool StartupUtil::IsSupportAppClone(AppExecFwk::ExtensionAbilityType type) 55{ 56 return type == AppExecFwk::ExtensionAbilityType::WORK_SCHEDULER || 57 type == AppExecFwk::ExtensionAbilityType::BACKUP || 58 type == AppExecFwk::ExtensionAbilityType::SHARE || 59 type == AppExecFwk::ExtensionAbilityType::PUSH || 60 type == AppExecFwk::ExtensionAbilityType::REMOTE_LOCATION || 61 type == AppExecFwk::ExtensionAbilityType::REMOTE_NOTIFICATION || 62 type == AppExecFwk::ExtensionAbilityType::VOIP; 63} 64 65void StartupUtil::InitAbilityInfoFromExtension(AppExecFwk::ExtensionAbilityInfo &extensionInfo, 66 AppExecFwk::AbilityInfo &abilityInfo) 67{ 68 abilityInfo.applicationName = extensionInfo.applicationInfo.name; 69 abilityInfo.applicationInfo = extensionInfo.applicationInfo; 70 abilityInfo.bundleName = extensionInfo.bundleName; 71 abilityInfo.package = extensionInfo.moduleName; 72 abilityInfo.moduleName = extensionInfo.moduleName; 73 abilityInfo.name = extensionInfo.name; 74 abilityInfo.srcEntrance = extensionInfo.srcEntrance; 75 abilityInfo.srcPath = extensionInfo.srcEntrance; 76 abilityInfo.iconPath = extensionInfo.icon; 77 abilityInfo.iconId = extensionInfo.iconId; 78 abilityInfo.label = extensionInfo.label; 79 abilityInfo.labelId = extensionInfo.labelId; 80 abilityInfo.description = extensionInfo.description; 81 abilityInfo.descriptionId = extensionInfo.descriptionId; 82 abilityInfo.priority = extensionInfo.priority; 83 abilityInfo.permissions = extensionInfo.permissions; 84 abilityInfo.readPermission = extensionInfo.readPermission; 85 abilityInfo.writePermission = extensionInfo.writePermission; 86 abilityInfo.uri = extensionInfo.uri; 87 abilityInfo.extensionAbilityType = extensionInfo.type; 88 abilityInfo.visible = extensionInfo.visible; 89 abilityInfo.resourcePath = extensionInfo.resourcePath; 90 abilityInfo.enabled = extensionInfo.enabled; 91 abilityInfo.isModuleJson = true; 92 abilityInfo.isStageBasedModel = true; 93 abilityInfo.process = extensionInfo.process; 94 abilityInfo.metadata = extensionInfo.metadata; 95 abilityInfo.compileMode = extensionInfo.compileMode; 96 abilityInfo.type = AppExecFwk::AbilityType::EXTENSION; 97 abilityInfo.extensionTypeName = extensionInfo.extensionTypeName; 98 if (!extensionInfo.hapPath.empty()) { 99 abilityInfo.hapPath = extensionInfo.hapPath; 100 } 101} 102 103int64_t StartupUtil::GenerateFullRequestCode(int32_t pid, bool backFlag, int32_t requestCode) 104{ 105 if (requestCode <= 0 || pid <= 0) { 106 return 0; 107 } 108 uint64_t fullRequestCode = static_cast<uint64_t>(requestCode); 109 uint64_t tempNum = static_cast<uint64_t>(pid); 110 fullRequestCode |= (tempNum << REQUEST_CODE_LENGTH); 111 if (backFlag) { 112 tempNum = 1; 113 fullRequestCode |= (tempNum << REQUEST_CODE_PID_LENGTH); 114 } 115 return fullRequestCode; 116} 117 118CallerRequestInfo StartupUtil::ParseFullRequestCode(int64_t fullRequestCode) 119{ 120 CallerRequestInfo requestInfo; 121 if (fullRequestCode <= 0) { 122 return requestInfo; 123 } 124 uint64_t tempFullRequestCode = static_cast<uint64_t>(fullRequestCode); 125 if ((tempFullRequestCode >> VALID_REQUEST_CODE_LENGTH) > 0) { 126 return requestInfo; 127 } 128 uint64_t tempNum = 1; 129 requestInfo.requestCode = (tempFullRequestCode & ((tempNum << REQUEST_CODE_LENGTH) - 1)); 130 tempFullRequestCode >>= REQUEST_CODE_LENGTH; 131 requestInfo.pid = (tempFullRequestCode & ((tempNum << PID_LENGTH) - 1)); 132 tempFullRequestCode >>= PID_LENGTH; 133 requestInfo.backFlag = (tempFullRequestCode == 1); 134 return requestInfo; 135} 136} // namespace OHOS::AbilityRuntime 137