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