• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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