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