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 "ability_mission_stack.h"
17
18 #include "util/abilityms_log.h"
19
20 namespace OHOS {
AbilityMissionStack(StackType type)21 AbilityMissionStack::AbilityMissionStack(StackType type)
22 : stackType_(type)
23 {
24 }
25
~AbilityMissionStack()26 AbilityMissionStack::~AbilityMissionStack()
27 {
28 for (auto iterator = missionRecords_.begin(); iterator != missionRecords_.end();) {
29 AbilityMissionRecord *missionRecord = *iterator;
30 iterator = missionRecords_.erase(iterator);
31 delete missionRecord;
32 }
33 }
34
GetStackType() const35 StackType AbilityMissionStack::GetStackType() const
36 {
37 return stackType_;
38 }
39
PushTopMissionRecord(AbilityMissionRecord & missionRecord)40 void AbilityMissionStack::PushTopMissionRecord(AbilityMissionRecord &missionRecord)
41 {
42 missionRecord.SetMissionStack(this);
43 missionRecords_.emplace_back(&missionRecord);
44 }
45
MoveMissionRecordToTop(AbilityMissionRecord & missionRecord)46 void AbilityMissionStack::MoveMissionRecordToTop(AbilityMissionRecord &missionRecord)
47 {
48 if (missionRecords_.back() != &missionRecord) {
49 missionRecords_.remove(&missionRecord);
50 missionRecords_.emplace_back(&missionRecord);
51 }
52 }
53
RemoveMissionRecord(AbilityMissionRecord & missionRecord)54 void AbilityMissionStack::RemoveMissionRecord(AbilityMissionRecord &missionRecord)
55 {
56 missionRecords_.remove(&missionRecord);
57 // clear prev mission record
58 for (const auto currentMission : missionRecords_) {
59 if (currentMission != nullptr && currentMission->GetPrevMissionRecord() == &missionRecord) {
60 currentMission->SetPrevMissionRecord(nullptr);
61 }
62 }
63 }
64
RemoveMissionRecord(AbilityConnectMission * connectMission,const char * bundleName)65 void AbilityMissionStack::RemoveMissionRecord(AbilityConnectMission *connectMission, const char *bundleName)
66 {
67 AbilityMissionRecord *missionRecord = GetTargetMissionRecord(bundleName);
68 CHECK_NULLPTR_RETURN(missionRecord, "AbilityMissionStack", "missionRecord is null");
69 missionRecord->ClearPageAbility(connectMission);
70 RemoveMissionRecord(*missionRecord);
71 delete missionRecord;
72 }
73
IsTopMissionRecord(const char * bundleName) const74 bool AbilityMissionStack::IsTopMissionRecord(const char *bundleName) const
75 {
76 if (bundleName == nullptr) {
77 return false;
78 }
79 AbilityMissionRecord *topMissionRecord = missionRecords_.back();
80 if (topMissionRecord != nullptr) {
81 return topMissionRecord->IsSameMissionRecord(bundleName);
82 }
83 return false;
84 }
85
GetTargetMissionRecord(const char * bundleName) const86 AbilityMissionRecord *AbilityMissionStack::GetTargetMissionRecord(const char *bundleName) const
87 {
88 CHECK_NULLPTR_RETURN_PTR(bundleName, "AbilityMissionStack", "invalid argument");
89 for (const auto missionRecord : missionRecords_) {
90 if (missionRecord != nullptr && missionRecord->IsSameMissionRecord(bundleName)) {
91 return missionRecord;
92 }
93 }
94 return nullptr;
95 }
96
GetTopMissionRecord() const97 const AbilityMissionRecord *AbilityMissionStack::GetTopMissionRecord() const
98 {
99 return missionRecords_.back();
100 }
101
FindPageAbility(uint64_t token) const102 PageAbilityRecord *AbilityMissionStack::FindPageAbility(uint64_t token) const
103 {
104 for (const auto missionRecord : missionRecords_) {
105 if (missionRecord == nullptr) {
106 continue;
107 }
108 PageAbilityRecord *record = missionRecord->FindPageAbility(token);
109 if (record != nullptr) {
110 return record;
111 }
112 }
113 return nullptr;
114 }
115
FindPageAbility(const Want & want) const116 PageAbilityRecord *AbilityMissionStack::FindPageAbility(const Want &want) const
117 {
118 CHECK_NULLPTR_RETURN_PTR(want.element, "AbilityMissionStack", "invalid argument");
119 AbilityMissionRecord *missionRecord = GetTargetMissionRecord(want.element->bundleName);
120 if (missionRecord != nullptr) {
121 return missionRecord->FindPageAbility(want);
122 }
123 return nullptr;
124 }
125
GetTopPageAbility() const126 const PageAbilityRecord *AbilityMissionStack::GetTopPageAbility() const
127 {
128 if (!missionRecords_.empty()) {
129 return missionRecords_.back()->GetTopPageAbility();
130 }
131 return nullptr;
132 }
133
134 #ifdef OHOS_DEBUG
DumpMissionStack() const135 AbilityMsStatus AbilityMissionStack::DumpMissionStack() const
136 {
137 if (missionRecords_.size() <= 0) {
138 return AbilityMsStatus::DumpStatus("");
139 }
140 std::string stackType = (stackType_ == LAUNCHER) ? "launcher\n" : "default\n";
141 std::string stackInfo = "MissionStack Type: " + stackType;
142 AbilityMsStatus result = AbilityMsStatus::DumpStatus(stackInfo.c_str());
143 for (const auto missionRecord : missionRecords_) {
144 if (missionRecord != nullptr) {
145 result.DumpAppend(missionRecord->DumpMissionRecord());
146 }
147 }
148 return result;
149 }
150 #endif
151 } // namespace OHOS
152