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