• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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