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