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