1 /*
2  * Copyright (c) 2023 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 "firmware_install_apply_mode.h"
17 
18 #include <utility>
19 
20 #include "dupdate_errno.h"
21 #include "dupdate_net_manager.h"
22 #include "dupdate_upgrade_helper.h"
23 #include "firmware_callback_utils.h"
24 #include "firmware_changelog_utils.h"
25 #include "firmware_common.h"
26 #include "firmware_component_operator.h"
27 #include "firmware_constant.h"
28 #include "firmware_log.h"
29 #include "firmware_preferences_utils.h"
30 #include "firmware_status_cache.h"
31 #include "firmware_task_operator.h"
32 #include "firmware_update_helper.h"
33 
34 namespace OHOS {
35 namespace UpdateEngine {
GetNextStep(FirmwareStep step)36 FirmwareStep FirmwareInstallApplyMode::GetNextStep(FirmwareStep step)
37 {
38     FIRMWARE_LOGI("GetNextStep %{public}d", static_cast<uint32_t>(step));
39     FirmwareStep nextStep = FirmwareStep::COMPLETE;
40     switch (step) {
41         case FirmwareStep::INIT:
42             nextStep = GetStepAfterInit();
43             break;
44         case FirmwareStep::INSTALL_STEP:
45             nextStep = GetStepAfterInstall();
46             break;
47         case FirmwareStep::APPLY_STEP:
48             nextStep = GetStepAfterApply();
49             break;
50         default:
51             break;
52     }
53     return nextStep;
54 }
55 
GetStepAfterInit()56 FirmwareStep FirmwareInstallApplyMode::GetStepAfterInit()
57 {
58     GetTask();
59     if (!tasks_.isExistTask) {
60         FIRMWARE_LOGI("GetStepAfterInit no task");
61         businessError_.Build(CallResult::FAIL, "no task!");
62         return FirmwareStep::COMPLETE;
63     }
64 
65     FIRMWARE_LOGI("GetStepAfterInit status %{public}d taskId = %{public}s, order = %{public}d",
66         static_cast<int32_t>(tasks_.status), tasks_.taskId.c_str(), CAST_INT(upgradeOptions_.order));
67 
68     if (upgradeOptions_.order == Order::INSTALL || upgradeOptions_.order == Order::INSTALL_AND_APPLY) {
69         return GetStepForInstallAndApplyOrder();
70     }
71 
72     if (upgradeOptions_.order == Order::APPLY) {
73         return FirmwareStep::APPLY_STEP;
74     }
75 
76     businessError_.Build(CallResult::FAIL, "upgradeOptions error");
77     return FirmwareStep::COMPLETE;
78 }
79 
GetStepForInstallAndApplyOrder()80 FirmwareStep FirmwareInstallApplyMode::GetStepForInstallAndApplyOrder()
81 {
82     if (tasks_.status != UpgradeStatus::DOWNLOAD_SUCCESS) {
83         businessError_.Build(CallResult::FAIL, "status error!");
84         return FirmwareStep::COMPLETE;
85     }
86 
87     if (!IsAllowInstall()) {
88         return FirmwareStep::COMPLETE;
89     }
90 
91     if (!IsUpgradeFilesReady()) {
92         return FirmwareStep::COMPLETE;
93     }
94 
95     return FirmwareStep::INSTALL_STEP;
96 }
97 
IsAllowInstall()98 bool FirmwareInstallApplyMode::IsAllowInstall()
99 {
100     int64_t requireTotalSize = 0;
101     if (!installStepDataProcessor_.IsSpaceEnough(requireTotalSize)) {
102         FIRMWARE_LOGE("GetStepAfterInit isSpaceEnough false");
103         businessError_.Build(CallResult::FAIL, "install condition fail!");
104         businessError_.AddErrorMessage(CAST_INT(DUPDATE_ERR_NO_ENOUGH_MEMORY), std::to_string(requireTotalSize));
105         return false;
106     }
107 
108     if (!FirmwareUpdateHelper::IsBatteryEnough(MANUAL_UPGRADE_BATTERY_LEVEL)) {
109         FIRMWARE_LOGE("IsAllowInstall isBatteryEnough is false");
110         businessError_.Build(CallResult::FAIL, "install condition fail!");
111         businessError_.AddErrorMessage(CAST_INT(DUPDATE_ERR_LOW_BATTERY_LEVEL), "battery is low");
112         return false;
113     }
114     return true;
115 }
116 
IsUpgradeFilesReady()117 bool FirmwareInstallApplyMode::IsUpgradeFilesReady()
118 {
119     if (installStepDataProcessor_.IsUpgradeFileCheckSuccess()) {
120         return true;
121     }
122 
123     FIRMWARE_LOGE("check component failed");
124     // 手动触发安装场景,DUE通过接口回调返回错误信息给OUC
125     businessError_.Build(CallResult::FAIL, "check component failed");
126     businessError_.AddErrorMessage(CAST_INT(DUPDATE_ERR_UPDATE_PRECHECK_FAIL), "check component failed");
127 
128     FirmwareUpdateHelper::ClearFirmwareInfo();
129     return false;
130 }
131 
GetStepAfterInstall()132 FirmwareStep FirmwareInstallApplyMode::GetStepAfterInstall()
133 {
134     FIRMWARE_LOGI("FirmwareInstallApplyMode installOptions %{public}d", CAST_INT(upgradeOptions_.order));
135     if (!installStepDataProcessor_.HasInstallSuccess()) {
136         FirmwareUpdateHelper::ClearFirmwareInfo();
137     }
138 
139     return FirmwareStep::COMPLETE;
140 }
141 
GetStepAfterApply()142 FirmwareStep FirmwareInstallApplyMode::GetStepAfterApply()
143 {
144     return FirmwareStep::COMPLETE;
145 }
146 
GetTask()147 void FirmwareInstallApplyMode::GetTask()
148 {
149     if (!tasks_.isExistTask) {
150         FirmwareTaskOperator().QueryTask(tasks_);
151         FIRMWARE_LOGI("FirmwareInstallApplyMode::GetTask status: %{public}d ", CAST_INT(tasks_.status));
152     }
153 }
154 
HandleComplete()155 void FirmwareInstallApplyMode::HandleComplete()
156 {
157     onExecuteFinishCallback_();
158 }
159 
GetUpgradeOptions()160 UpgradeOptions FirmwareInstallApplyMode::GetUpgradeOptions()
161 {
162     return upgradeOptions_;
163 }
164 
GetInstallType()165 InstallType FirmwareInstallApplyMode::GetInstallType()
166 {
167     return installType_;
168 }
169 
SetInstallResult(const InstallCallbackInfo & installCallbackInfo)170 void FirmwareInstallApplyMode::SetInstallResult(const InstallCallbackInfo &installCallbackInfo)
171 {
172     installStepDataProcessor_.SetInstallResult(installCallbackInfo);
173 }
174 
SetApplyResult(bool isSuccess)175 void FirmwareInstallApplyMode::SetApplyResult(bool isSuccess)
176 {
177     FIRMWARE_LOGI("SetApplyResult isSuccess: %{public}s", isSuccess ? "success" : "fail");
178 }
179 } // namespace UpdateEngine
180 } // namespace OHOS