1 /*
2 * Copyright (c) 2021 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 "lock_mission_container.h"
17
18 #include "hilog_wrapper.h"
19
20 namespace OHOS {
21 namespace AAFwk {
IsLockedMissionState() const22 bool LockMissionContainer::IsLockedMissionState() const
23 {
24 return lockState_ != LockMissionState::LOCK_MISSION_STATE_NONE;
25 }
26
GetLockedMissionState() const27 int LockMissionContainer::GetLockedMissionState() const
28 {
29 return lockState_;
30 }
31
SetLockedMission(const std::shared_ptr<MissionRecord> & mission,int lockerUid,bool isSystemApp)32 bool LockMissionContainer::SetLockedMission(
33 const std::shared_ptr<MissionRecord> &mission, int lockerUid, bool isSystemApp)
34 {
35 auto lockMission = lockMission_.lock();
36 if (lockMission) {
37 HILOG_WARN("It already exists lock mission , deny lock request. locked mission id :%{public}d, name : "
38 "%{public}s ,request mission id :%{public}d, name : %{public}s",
39 lockMission->GetMissionRecordId(),
40 lockMission->GetName().c_str(),
41 mission->GetMissionRecordId(),
42 mission->GetName().c_str());
43 return false;
44 }
45
46 HILOG_INFO("lock mission ID: %{public}d , name : %{public}s lockerUid : %{public}d",
47 mission->GetMissionRecordId(),
48 mission->GetName().c_str(),
49 lockerUid);
50 lockMission_ = mission;
51 lockerUid_ = lockerUid;
52 lockState_ =
53 isSystemApp ? LockMissionState::LOCK_MISSION_STATE_PINNED : LockMissionState::LOCK_MISSION_STATE_LOCKED;
54 return true;
55 }
56
ReleaseLockedMission(const std::shared_ptr<MissionRecord> & mission,int callerUid,bool isForce)57 bool LockMissionContainer::ReleaseLockedMission(
58 const std::shared_ptr<MissionRecord> &mission, int callerUid, bool isForce)
59 {
60 auto lockMission = lockMission_.lock();
61 if (lockMission == nullptr) {
62 HILOG_WARN("There is no locked mission. release locked mission fail.");
63 return false;
64 }
65
66 if (isForce && lockMission == mission) {
67 HILOG_INFO("release lock mission ID: %{public}d , name : %{public}s lockerUid : %{public}d",
68 lockMission->GetMissionRecordId(),
69 lockMission->GetName().c_str(),
70 lockerUid_);
71 Clear();
72 return true;
73 }
74
75 if (callerUid != lockerUid_) {
76 HILOG_WARN("caller uid not equal to locker uid. release locked mission fail.");
77 return false;
78 }
79
80 if (mission != lockMission) {
81 HILOG_WARN("unlock mission not equal to locked mission. release locked mission fail.");
82 return false;
83 }
84
85 HILOG_INFO("Normal release lock mission ID: %{public}d , name : %{public}s lockerUid : %{public}d",
86 lockMission->GetMissionRecordId(),
87 lockMission->GetName().c_str(),
88 lockerUid_);
89
90 Clear();
91 return true;
92 }
93
IsSameLockedMission(std::string bundleName) const94 bool LockMissionContainer::IsSameLockedMission(std::string bundleName) const
95 {
96 auto lockMission = lockMission_.lock();
97 if (lockMission == nullptr) {
98 HILOG_WARN("There is no locked mission. release locked mission fail.");
99 return false;
100 }
101 return lockMission->GetName() == bundleName;
102 }
103
Clear()104 void LockMissionContainer::Clear()
105 {
106 lockMission_.reset();
107 lockerUid_ = -1;
108 lockState_ = LockMissionState::LOCK_MISSION_STATE_NONE;
109 }
110
GetLockMission()111 std::shared_ptr<MissionRecord> LockMissionContainer::GetLockMission()
112 {
113 return lockMission_.lock();
114 }
115 } // namespace AAFwk
116 } // namespace OHOS