1 /*
2 * Copyright (c) 2020 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 "app_record.h"
17
18 #include "adapter.h"
19 #include "bundle_info_utils.h"
20 #include "page_ability_record.h"
21 #include "pms.h"
22 #include "securec.h"
23 #include "utils.h"
24
25 namespace OHOS {
AppRecord(const BundleInfo & bundleInfo,uint64_t identityId)26 AppRecord::AppRecord(const BundleInfo &bundleInfo, uint64_t identityId)
27 : identityId_(identityId)
28 {
29 BundleInfoUtils::CopyBundleInfo(0, &bundleInfo_, bundleInfo);
30 }
31
~AppRecord()32 AppRecord::~AppRecord()
33 {
34 ClearBundleInfo(&bundleInfo_);
35 delete abilityThreadClient_;
36 }
37
SetPid(const pid_t pid)38 void AppRecord::SetPid(const pid_t pid)
39 {
40 pid_ = pid;
41 }
42
GetPid() const43 pid_t AppRecord::GetPid() const
44 {
45 return pid_;
46 }
47
GetIdentityId() const48 uint64_t AppRecord::GetIdentityId() const
49 {
50 return identityId_;
51 }
52
GetBundleInfo() const53 const BundleInfo &AppRecord::GetBundleInfo() const
54 {
55 return bundleInfo_;
56 }
57
LoadPermission() const58 AbilityMsStatus AppRecord::LoadPermission() const
59 {
60 int ret = LoadPermissions(bundleInfo_.bundleName, bundleInfo_.uid);
61 if (ret != PERM_ERRORCODE_SUCCESS) {
62 AppExitTransaction();
63 std::string errorMsg = "load application permission ret = " + std::to_string(ret);
64 return AbilityMsStatus::PermissionStatus(errorMsg.c_str());
65 }
66 return AbilityMsStatus::Ok();
67 }
68
UnloadPermission() const69 void AppRecord::UnloadPermission() const
70 {
71 UnLoadPermissions(bundleInfo_.uid);
72 }
73
QueryAppCapability(const char * bundleName,uint32_t ** caps,uint32_t * capNums)74 AbilityMsStatus AppRecord::QueryAppCapability(const char *bundleName, uint32_t **caps, uint32_t *capNums)
75 {
76 int ret = QueryAppCapabilities(bundleName, caps, capNums);
77 if (ret == PERM_ERRORCODE_SUCCESS || ret == PERM_ERRORCODE_FILE_NOT_EXIST) {
78 return AbilityMsStatus::Ok();
79 }
80 std::string errorMsg = "query application permission ret = " + std::to_string(ret);
81 return AbilityMsStatus::AppCapabilitiesStatus(errorMsg.c_str());
82 }
83
SetAbilityThreadClient(const AbilityThreadClient & client)84 AbilityMsStatus AppRecord::SetAbilityThreadClient(const AbilityThreadClient &client)
85 {
86 abilityThreadClient_ = new AbilityThreadClient(client);
87 return abilityThreadClient_->Initialize(bundleInfo_.bundleName);
88 }
89
AbilityTransaction(const TransactionState & state,const Want & want,AbilityType abilityType) const90 AbilityMsStatus AppRecord::AbilityTransaction(const TransactionState &state,
91 const Want &want, AbilityType abilityType) const
92 {
93 if (abilityThreadClient_ != nullptr) {
94 return abilityThreadClient_->AbilityTransaction(state, want, abilityType);
95 }
96 return AbilityMsStatus::AppTransanctStatus("life cycle ability thread client not exist");
97 }
98
AppInitTransaction() const99 AbilityMsStatus AppRecord::AppInitTransaction() const
100 {
101 if (abilityThreadClient_ != nullptr) {
102 return abilityThreadClient_->AppInitTransaction(bundleInfo_);
103 }
104 return AbilityMsStatus::AppTransanctStatus("app init ability thread client not exist");
105 }
106
AppExitTransaction() const107 AbilityMsStatus AppRecord::AppExitTransaction() const
108 {
109 if (abilityThreadClient_ != nullptr) {
110 return abilityThreadClient_->AppExitTransaction();
111 }
112 return AbilityMsStatus::AppTransanctStatus("app exit ability thread client not exist");
113 }
114
DumpAbilityTransaction(const Want & want,uint64_t token) const115 AbilityMsStatus AppRecord::DumpAbilityTransaction(const Want &want, uint64_t token) const
116 {
117 if (abilityThreadClient_ != nullptr) {
118 return abilityThreadClient_->DumpAbilityTransaction(want, token);
119 }
120 return AbilityMsStatus::AppTransanctStatus("dump ability ability thread client not exist");
121 }
122
SetPendingAbility(PageAbilityRecord * abilityRecord)123 void AppRecord::SetPendingAbility(PageAbilityRecord *abilityRecord)
124 {
125 pendingAbilityRecord_ = abilityRecord;
126 }
127
LaunchPendingAbility()128 AbilityMsStatus AppRecord::LaunchPendingAbility()
129 {
130 if (pendingAbilityRecord_ != nullptr) {
131 AbilityMsStatus status;
132 if (pendingAbilityRecord_->GetAbilityInfo().abilityType == AbilityType::SERVICE) {
133 status = pendingAbilityRecord_->InactiveAbility();
134 } else {
135 status = pendingAbilityRecord_->ActiveAbility();
136 }
137 // MissionRecord release AbilityRecord
138 pendingAbilityRecord_ = nullptr;
139 return status;
140 }
141 return AbilityMsStatus::LifeCycleStatus("pending ability not exist");
142 }
143
ConnectTransaction(const Want & want,uint64_t token) const144 AbilityMsStatus AppRecord::ConnectTransaction(const Want &want, uint64_t token) const
145 {
146 if (abilityThreadClient_ != nullptr) {
147 return abilityThreadClient_->ConnectAbility(want, token);
148 }
149 return AbilityMsStatus::TaskStatus("connectAbility", "app exit ability thread client not exist");
150 }
151
DisconnectTransaction(const Want & want,uint64_t token) const152 AbilityMsStatus AppRecord::DisconnectTransaction(const Want &want, uint64_t token) const
153 {
154 if (abilityThreadClient_ != nullptr) {
155 return abilityThreadClient_->DisconnectAbility(want, token);
156 }
157 return AbilityMsStatus::TaskStatus("disconnectAbility", "app exit ability thread client not exist");
158 }
159
ConnectDoneTransaction(const Want & want,const SvcIdentity & serviceSid,const SvcIdentity & connectSid) const160 AbilityMsStatus AppRecord::ConnectDoneTransaction(const Want &want, const SvcIdentity &serviceSid,
161 const SvcIdentity &connectSid) const
162 {
163 if (abilityThreadClient_ != nullptr) {
164 return abilityThreadClient_->ConnectAbilityDone(want, serviceSid, connectSid);
165 }
166 return AbilityMsStatus::TaskStatus("connectAbilityDone", "app exit ability thread client not exist");
167 }
168
DisconnectDoneTransaction(const Want & want,const SvcIdentity & connectSid) const169 AbilityMsStatus AppRecord::DisconnectDoneTransaction(const Want &want, const SvcIdentity &connectSid) const
170 {
171 if (abilityThreadClient_ != nullptr) {
172 return abilityThreadClient_->DisconnectAbilityDone(want, connectSid);
173 }
174 return AbilityMsStatus::TaskStatus("disconnectAbilityDone", "app exit ability thread client not exist");
175 }
176
ClearPendingAbility(PageAbilityRecord * abilityRecord)177 void AppRecord::ClearPendingAbility(PageAbilityRecord *abilityRecord)
178 {
179 if (pendingAbilityRecord_ != nullptr && pendingAbilityRecord_ == abilityRecord) {
180 pendingAbilityRecord_ = nullptr;
181 }
182 }
183 } // namespace OHOS
184