1 /*
2 * Copyright (c) 2022 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 "quick_fix_data_mgr.h"
17
18 #include "app_log_wrapper.h"
19 #include "appexecfwk_errors.h"
20 #ifdef BMS_RDB_ENABLE
21 #include "quick_fix_manager_rdb.h"
22 #endif
23 #include "inner_app_quick_fix.h"
24
25 namespace OHOS {
26 namespace AppExecFwk {
QuickFixDataMgr()27 QuickFixDataMgr::QuickFixDataMgr()
28 {
29 APP_LOGD("create QuickFixDataMgr start.");
30 #ifdef BMS_RDB_ENABLE
31 quickFixManagerDb_ = std::make_shared<QuickFixManagerRdb>();
32 #endif
33 if (quickFixManagerDb_ == nullptr) {
34 APP_LOGE("create QuickFixDataMgr failed.");
35 return;
36 }
37
38 InitStatesMap();
39 }
40
~QuickFixDataMgr()41 QuickFixDataMgr::~QuickFixDataMgr()
42 {
43 APP_LOGD("destroy QuickFixDataMgr.");
44 }
45
InitStatesMap()46 void QuickFixDataMgr::InitStatesMap()
47 {
48 statesMap_ = {
49 {QuickFixStatus::DEPLOY_START, QuickFixStatus::DEPLOY_END},
50 {QuickFixStatus::DEPLOY_START, QuickFixStatus::DELETE_START},
51 {QuickFixStatus::DEPLOY_END, QuickFixStatus::SWITCH_ENABLE_START},
52 {QuickFixStatus::DEPLOY_END, QuickFixStatus::SWITCH_DISABLE_START},
53 {QuickFixStatus::DEPLOY_END, QuickFixStatus::DELETE_START},
54 {QuickFixStatus::SWITCH_ENABLE_START, QuickFixStatus::SWITCH_END},
55 {QuickFixStatus::SWITCH_ENABLE_START, QuickFixStatus::SWITCH_ENABLE_START},
56 {QuickFixStatus::SWITCH_DISABLE_START, QuickFixStatus::SWITCH_END},
57 {QuickFixStatus::SWITCH_DISABLE_START, QuickFixStatus::SWITCH_DISABLE_START},
58 {QuickFixStatus::SWITCH_ENABLE_START, QuickFixStatus::DEPLOY_END},
59 {QuickFixStatus::SWITCH_DISABLE_START, QuickFixStatus::DEPLOY_END},
60 {QuickFixStatus::SWITCH_END, QuickFixStatus::DELETE_START},
61 {QuickFixStatus::DELETE_START, QuickFixStatus::SWITCH_END},
62 {QuickFixStatus::DELETE_START, QuickFixStatus::DELETE_START},
63 {QuickFixStatus::DELETE_START, QuickFixStatus::DELETE_END}
64 };
65 }
66
QueryAllInnerAppQuickFix(std::map<std::string,InnerAppQuickFix> & innerAppQuickFixes)67 bool QuickFixDataMgr::QueryAllInnerAppQuickFix(std::map<std::string, InnerAppQuickFix> &innerAppQuickFixes)
68 {
69 std::lock_guard<std::mutex> lock(mutex_);
70 if (quickFixManagerDb_ == nullptr) {
71 APP_LOGE("error quickFixManagerDb_ is nullptr.");
72 return false;
73 }
74 return quickFixManagerDb_->QueryAllInnerAppQuickFix(innerAppQuickFixes);
75 }
76
QueryInnerAppQuickFix(const std::string & bundleName,InnerAppQuickFix & innerAppQuickFix)77 bool QuickFixDataMgr::QueryInnerAppQuickFix(const std::string &bundleName, InnerAppQuickFix &innerAppQuickFix)
78 {
79 std::lock_guard<std::mutex> lock(mutex_);
80 if (quickFixManagerDb_ == nullptr) {
81 APP_LOGE("error quickFixManagerDb_ is nullptr.");
82 return false;
83 }
84 return quickFixManagerDb_->QueryInnerAppQuickFix(bundleName, innerAppQuickFix);
85 }
86
SaveInnerAppQuickFix(const InnerAppQuickFix & innerAppQuickFix)87 bool QuickFixDataMgr::SaveInnerAppQuickFix(const InnerAppQuickFix &innerAppQuickFix)
88 {
89 std::lock_guard<std::mutex> lock(mutex_);
90 if (quickFixManagerDb_ == nullptr) {
91 APP_LOGE("error quickFixManagerDb_ is nullptr.");
92 return false;
93 }
94 return quickFixManagerDb_->SaveInnerAppQuickFix(innerAppQuickFix);
95 }
96
DeleteInnerAppQuickFix(const std::string & bundleName)97 bool QuickFixDataMgr::DeleteInnerAppQuickFix(const std::string &bundleName)
98 {
99 std::lock_guard<std::mutex> lock(mutex_);
100 if (quickFixManagerDb_ == nullptr) {
101 APP_LOGE("error quickFixManagerDb_ is nullptr.");
102 return false;
103 }
104 return quickFixManagerDb_->DeleteInnerAppQuickFix(bundleName);
105 }
106
IsNextStatusExisted(const QuickFixStatus & curStatus,const QuickFixStatus & nextStatus)107 bool QuickFixDataMgr::IsNextStatusExisted(const QuickFixStatus &curStatus, const QuickFixStatus &nextStatus)
108 {
109 auto statusRange = statesMap_.equal_range(curStatus);
110 for (auto curIterator = statusRange.first; curIterator != statusRange.second; ++curIterator) {
111 if (curIterator->second == nextStatus) {
112 return true;
113 }
114 }
115 APP_LOGE("IsNextStatusExisted failed due to invalid curStatus %{public}d", curStatus);
116 return false;
117 }
118
UpdateQuickFixStatus(const QuickFixStatus & nextStatus,InnerAppQuickFix & innerAppQuickFix)119 bool QuickFixDataMgr::UpdateQuickFixStatus(const QuickFixStatus &nextStatus, InnerAppQuickFix &innerAppQuickFix)
120 {
121 QuickFixMark fixMark = innerAppQuickFix.GetQuickFixMark();
122 // invalid status can be transferred as DELETE_START status
123 if (nextStatus == QuickFixStatus::DELETE_START && (fixMark.status == QuickFixStatus::DEFAULT_STATUS ||
124 fixMark.status == QuickFixStatus::DELETE_END)) {
125 fixMark.status = nextStatus;
126 innerAppQuickFix.SetQuickFixMark(fixMark);
127 return SaveInnerAppQuickFix(innerAppQuickFix);
128 }
129
130 if (fixMark.status == QuickFixStatus::DEFAULT_STATUS || nextStatus == QuickFixStatus::DEFAULT_STATUS) {
131 APP_LOGE("status is invalid");
132 return false;
133 }
134
135 // check next status to be updated
136 if (!IsNextStatusExisted(static_cast<QuickFixStatus>(fixMark.status), nextStatus)) {
137 APP_LOGE("next status %{public}d cannot be transferred by current status %{public}d", nextStatus,
138 fixMark.status);
139 return false;
140 }
141
142 fixMark.status = nextStatus;
143 innerAppQuickFix.SetQuickFixMark(fixMark);
144
145 return SaveInnerAppQuickFix(innerAppQuickFix);
146 }
147 } // OHOS
148 } // AppExecFwk
149