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
24 namespace OHOS::AbilityRuntime {
25 namespace {
26 constexpr int32_t REQUEST_CODE_LENGTH = 32;
27 constexpr int32_t PID_LENGTH = 16;
28 constexpr int32_t REQUEST_CODE_PID_LENGTH = 48;
29 constexpr int32_t VALID_REQUEST_CODE_LENGTH = 49;
30 }
GetAppIndex(const AAFwk::Want & want,int32_t & appIndex)31 bool 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
BuildAbilityInfoFlag()47 int32_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
IsSupportAppClone(AppExecFwk::ExtensionAbilityType type)54 bool 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
InitAbilityInfoFromExtension(AppExecFwk::ExtensionAbilityInfo & extensionInfo,AppExecFwk::AbilityInfo & abilityInfo)65 void 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
GenerateFullRequestCode(int32_t pid,bool backFlag,int32_t requestCode)103 int64_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
ParseFullRequestCode(int64_t fullRequestCode)118 CallerRequestInfo 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