1eace7efcSopenharmony_ci/*
2eace7efcSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
3eace7efcSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4eace7efcSopenharmony_ci * you may not use this file except in compliance with the License.
5eace7efcSopenharmony_ci * You may obtain a copy of the License at
6eace7efcSopenharmony_ci *
7eace7efcSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8eace7efcSopenharmony_ci *
9eace7efcSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10eace7efcSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11eace7efcSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12eace7efcSopenharmony_ci * See the License for the specific language governing permissions and
13eace7efcSopenharmony_ci * limitations under the License.
14eace7efcSopenharmony_ci */
15eace7efcSopenharmony_ci
16eace7efcSopenharmony_ci#include "startup_util.h"
17eace7efcSopenharmony_ci
18eace7efcSopenharmony_ci#include "ability_info.h"
19eace7efcSopenharmony_ci#include "extension_ability_info.h"
20eace7efcSopenharmony_ci#include "global_constant.h"
21eace7efcSopenharmony_ci#include "server_constant.h"
22eace7efcSopenharmony_ci#include "want.h"
23eace7efcSopenharmony_ci
24eace7efcSopenharmony_cinamespace OHOS::AbilityRuntime {
25eace7efcSopenharmony_cinamespace {
26eace7efcSopenharmony_ciconstexpr int32_t REQUEST_CODE_LENGTH = 32;
27eace7efcSopenharmony_ciconstexpr int32_t PID_LENGTH = 16;
28eace7efcSopenharmony_ciconstexpr int32_t REQUEST_CODE_PID_LENGTH = 48;
29eace7efcSopenharmony_ciconstexpr int32_t VALID_REQUEST_CODE_LENGTH = 49;
30eace7efcSopenharmony_ci}
31eace7efcSopenharmony_cibool StartupUtil::GetAppIndex(const AAFwk::Want &want, int32_t &appIndex)
32eace7efcSopenharmony_ci{
33eace7efcSopenharmony_ci    appIndex = want.GetIntParam(ServerConstant::DLP_INDEX, 0);
34eace7efcSopenharmony_ci    if (appIndex > GlobalConstant::MAX_APP_CLONE_INDEX) {
35eace7efcSopenharmony_ci        return true;
36eace7efcSopenharmony_ci    }
37eace7efcSopenharmony_ci    if (appIndex == 0) {
38eace7efcSopenharmony_ci        appIndex = want.GetIntParam(AAFwk::Want::PARAM_APP_CLONE_INDEX_KEY, 0);
39eace7efcSopenharmony_ci        if (appIndex < 0 || appIndex > GlobalConstant::MAX_APP_CLONE_INDEX) {
40eace7efcSopenharmony_ci            return false;
41eace7efcSopenharmony_ci        }
42eace7efcSopenharmony_ci        return true;
43eace7efcSopenharmony_ci    }
44eace7efcSopenharmony_ci    return false;
45eace7efcSopenharmony_ci}
46eace7efcSopenharmony_ci
47eace7efcSopenharmony_ciint32_t StartupUtil::BuildAbilityInfoFlag()
48eace7efcSopenharmony_ci{
49eace7efcSopenharmony_ci    return AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_APPLICATION |
50eace7efcSopenharmony_ci        AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_PERMISSION |
51eace7efcSopenharmony_ci        AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA;
52eace7efcSopenharmony_ci}
53eace7efcSopenharmony_ci
54eace7efcSopenharmony_cibool StartupUtil::IsSupportAppClone(AppExecFwk::ExtensionAbilityType type)
55eace7efcSopenharmony_ci{
56eace7efcSopenharmony_ci    return type == AppExecFwk::ExtensionAbilityType::WORK_SCHEDULER ||
57eace7efcSopenharmony_ci        type == AppExecFwk::ExtensionAbilityType::BACKUP ||
58eace7efcSopenharmony_ci        type == AppExecFwk::ExtensionAbilityType::SHARE ||
59eace7efcSopenharmony_ci        type == AppExecFwk::ExtensionAbilityType::PUSH ||
60eace7efcSopenharmony_ci        type == AppExecFwk::ExtensionAbilityType::REMOTE_LOCATION ||
61eace7efcSopenharmony_ci        type == AppExecFwk::ExtensionAbilityType::REMOTE_NOTIFICATION ||
62eace7efcSopenharmony_ci        type == AppExecFwk::ExtensionAbilityType::VOIP;
63eace7efcSopenharmony_ci}
64eace7efcSopenharmony_ci
65eace7efcSopenharmony_civoid StartupUtil::InitAbilityInfoFromExtension(AppExecFwk::ExtensionAbilityInfo &extensionInfo,
66eace7efcSopenharmony_ci    AppExecFwk::AbilityInfo &abilityInfo)
67eace7efcSopenharmony_ci{
68eace7efcSopenharmony_ci    abilityInfo.applicationName = extensionInfo.applicationInfo.name;
69eace7efcSopenharmony_ci    abilityInfo.applicationInfo = extensionInfo.applicationInfo;
70eace7efcSopenharmony_ci    abilityInfo.bundleName = extensionInfo.bundleName;
71eace7efcSopenharmony_ci    abilityInfo.package = extensionInfo.moduleName;
72eace7efcSopenharmony_ci    abilityInfo.moduleName = extensionInfo.moduleName;
73eace7efcSopenharmony_ci    abilityInfo.name = extensionInfo.name;
74eace7efcSopenharmony_ci    abilityInfo.srcEntrance = extensionInfo.srcEntrance;
75eace7efcSopenharmony_ci    abilityInfo.srcPath = extensionInfo.srcEntrance;
76eace7efcSopenharmony_ci    abilityInfo.iconPath = extensionInfo.icon;
77eace7efcSopenharmony_ci    abilityInfo.iconId = extensionInfo.iconId;
78eace7efcSopenharmony_ci    abilityInfo.label = extensionInfo.label;
79eace7efcSopenharmony_ci    abilityInfo.labelId = extensionInfo.labelId;
80eace7efcSopenharmony_ci    abilityInfo.description = extensionInfo.description;
81eace7efcSopenharmony_ci    abilityInfo.descriptionId = extensionInfo.descriptionId;
82eace7efcSopenharmony_ci    abilityInfo.priority = extensionInfo.priority;
83eace7efcSopenharmony_ci    abilityInfo.permissions = extensionInfo.permissions;
84eace7efcSopenharmony_ci    abilityInfo.readPermission = extensionInfo.readPermission;
85eace7efcSopenharmony_ci    abilityInfo.writePermission = extensionInfo.writePermission;
86eace7efcSopenharmony_ci    abilityInfo.uri = extensionInfo.uri;
87eace7efcSopenharmony_ci    abilityInfo.extensionAbilityType = extensionInfo.type;
88eace7efcSopenharmony_ci    abilityInfo.visible = extensionInfo.visible;
89eace7efcSopenharmony_ci    abilityInfo.resourcePath = extensionInfo.resourcePath;
90eace7efcSopenharmony_ci    abilityInfo.enabled = extensionInfo.enabled;
91eace7efcSopenharmony_ci    abilityInfo.isModuleJson = true;
92eace7efcSopenharmony_ci    abilityInfo.isStageBasedModel = true;
93eace7efcSopenharmony_ci    abilityInfo.process = extensionInfo.process;
94eace7efcSopenharmony_ci    abilityInfo.metadata = extensionInfo.metadata;
95eace7efcSopenharmony_ci    abilityInfo.compileMode = extensionInfo.compileMode;
96eace7efcSopenharmony_ci    abilityInfo.type = AppExecFwk::AbilityType::EXTENSION;
97eace7efcSopenharmony_ci    abilityInfo.extensionTypeName = extensionInfo.extensionTypeName;
98eace7efcSopenharmony_ci    if (!extensionInfo.hapPath.empty()) {
99eace7efcSopenharmony_ci        abilityInfo.hapPath = extensionInfo.hapPath;
100eace7efcSopenharmony_ci    }
101eace7efcSopenharmony_ci}
102eace7efcSopenharmony_ci
103eace7efcSopenharmony_ciint64_t StartupUtil::GenerateFullRequestCode(int32_t pid, bool backFlag, int32_t requestCode)
104eace7efcSopenharmony_ci{
105eace7efcSopenharmony_ci    if (requestCode <= 0 || pid <= 0) {
106eace7efcSopenharmony_ci        return 0;
107eace7efcSopenharmony_ci    }
108eace7efcSopenharmony_ci    uint64_t fullRequestCode = static_cast<uint64_t>(requestCode);
109eace7efcSopenharmony_ci    uint64_t tempNum = static_cast<uint64_t>(pid);
110eace7efcSopenharmony_ci    fullRequestCode |= (tempNum << REQUEST_CODE_LENGTH);
111eace7efcSopenharmony_ci    if (backFlag) {
112eace7efcSopenharmony_ci        tempNum = 1;
113eace7efcSopenharmony_ci        fullRequestCode |= (tempNum << REQUEST_CODE_PID_LENGTH);
114eace7efcSopenharmony_ci    }
115eace7efcSopenharmony_ci    return fullRequestCode;
116eace7efcSopenharmony_ci}
117eace7efcSopenharmony_ci
118eace7efcSopenharmony_ciCallerRequestInfo StartupUtil::ParseFullRequestCode(int64_t fullRequestCode)
119eace7efcSopenharmony_ci{
120eace7efcSopenharmony_ci    CallerRequestInfo requestInfo;
121eace7efcSopenharmony_ci    if (fullRequestCode <= 0) {
122eace7efcSopenharmony_ci        return requestInfo;
123eace7efcSopenharmony_ci    }
124eace7efcSopenharmony_ci    uint64_t tempFullRequestCode = static_cast<uint64_t>(fullRequestCode);
125eace7efcSopenharmony_ci    if ((tempFullRequestCode >> VALID_REQUEST_CODE_LENGTH) > 0) {
126eace7efcSopenharmony_ci        return requestInfo;
127eace7efcSopenharmony_ci    }
128eace7efcSopenharmony_ci    uint64_t tempNum = 1;
129eace7efcSopenharmony_ci    requestInfo.requestCode = (tempFullRequestCode & ((tempNum << REQUEST_CODE_LENGTH) - 1));
130eace7efcSopenharmony_ci    tempFullRequestCode >>= REQUEST_CODE_LENGTH;
131eace7efcSopenharmony_ci    requestInfo.pid = (tempFullRequestCode & ((tempNum << PID_LENGTH) - 1));
132eace7efcSopenharmony_ci    tempFullRequestCode >>= PID_LENGTH;
133eace7efcSopenharmony_ci    requestInfo.backFlag = (tempFullRequestCode == 1);
134eace7efcSopenharmony_ci    return requestInfo;
135eace7efcSopenharmony_ci}
136eace7efcSopenharmony_ci}  // namespace OHOS::AbilityRuntime
137