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