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