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_download_mode.h"
17
18 #include "dupdate_errno.h"
19 #include "dupdate_inet_observer.h"
20 #include "dupdate_net_manager.h"
21 #include "firmware_callback_utils.h"
22 #include "firmware_common.h"
23 #include "firmware_constant.h"
24 #include "firmware_log.h"
25 #include "firmware_preferences_utils.h"
26 #include "firmware_status_cache.h"
27 #include "firmware_task_operator.h"
28 #include "firmware_update_helper.h"
29
30 namespace OHOS {
31 namespace UpdateEngine {
GetNextStep(FirmwareStep step)32 FirmwareStep FirmwareDownloadMode::GetNextStep(FirmwareStep step)
33 {
34 FIRMWARE_LOGI("GetNextStep %{public}d", static_cast<uint32_t>(step));
35 FirmwareStep nextStep = FirmwareStep::COMPLETE;
36 switch (step) {
37 case FirmwareStep::INIT:
38 nextStep = GetStepAfterInit();
39 break;
40 case FirmwareStep::DOWNLOAD_STEP:
41 nextStep = GetStepAfterDownload();
42 break;
43 default:
44 break;
45 }
46 return nextStep;
47 }
48
GetStepAfterInit()49 FirmwareStep FirmwareDownloadMode::GetStepAfterInit()
50 {
51 GetTask();
52 if (!tasks_.isExistTask) {
53 FIRMWARE_LOGI("GetStepAfterInit no task");
54 businessError_.Build(CallResult::FAIL, "no task!");
55 return FirmwareStep::COMPLETE;
56 }
57
58 FIRMWARE_LOGI("GetStepAfterInit status %{public}d", static_cast<int32_t>(tasks_.status));
59 UpgradeStatus taskStatus = tasks_.status;
60 if (taskStatus != UpgradeStatus::CHECK_VERSION_SUCCESS &&
61 taskStatus != UpgradeStatus::DOWNLOAD_FAIL &&
62 taskStatus != UpgradeStatus::DOWNLOAD_PAUSE) {
63 businessError_.Build(CallResult::FAIL, "status error!");
64 return FirmwareStep::COMPLETE;
65 }
66
67 if (taskStatus == UpgradeStatus::DOWNLOADING) {
68 FIRMWARE_LOGI("GetStepAfterInit system busy");
69 businessError_.Build(CallResult::FAIL, "system busy!");
70 businessError_.AddErrorMessage(CAST_INT(DUPDATE_ERR_SYSTEM_BUSY_ON_DOWNLOAD), "busy on Downloading!");
71 return FirmwareStep::COMPLETE;
72 }
73
74 if (!DelayedSingleton<NetManager>::GetInstance()->IsNetAvailable()) {
75 FIRMWARE_LOGI("GetStepAfterInit IsNeedBlockCheck no network, nettype is %{public}d",
76 DelayedSingleton<NetManager>::GetInstance()->GetNetType());
77 businessError_.Build(CallResult::FAIL, "download no network!");
78 businessError_.AddErrorMessage(CAST_INT(DUPDATE_ERR_DLOAD_REQUEST_FAIL), "download no network!");
79 return FirmwareStep::COMPLETE;
80 }
81
82 int64_t requireTotalSize = 0;
83 bool isSpaceEnough = downloadDataProcessor_.IsSpaceEnough(requireTotalSize);
84 if (!isSpaceEnough) {
85 FIRMWARE_LOGE("GetStepAfterInit isSpaceEnough false");
86 businessError_.Build(CallResult::FAIL, "download condition fail!");
87 businessError_.AddErrorMessage(CAST_INT(DUPDATE_ERR_NO_ENOUGH_MEMORY), std::to_string(requireTotalSize));
88 return FirmwareStep::COMPLETE;
89 }
90 return FirmwareStep::DOWNLOAD_STEP;
91 }
92
GetStepAfterDownload()93 FirmwareStep FirmwareDownloadMode::GetStepAfterDownload()
94 {
95 FIRMWARE_LOGI("GetStepAfterDownload downloadOptions %{public}d", CAST_INT(downloadOptions_.order));
96 FirmwareTask task;
97 FirmwareTaskOperator().QueryTask(task);
98 FIRMWARE_LOGI("GetStepAfterDownload task status %{public}d", task.status);
99 if (!task.isExistTask) {
100 FIRMWARE_LOGE("GetStepAfterDownload task not exist");
101 return FirmwareStep::COMPLETE;
102 }
103 ErrorMessage errorMessage;
104 if (!downloadDataProcessor_.GetDownloadProgress().endReason.empty()) {
105 errorMessage.errorCode = stoi(downloadDataProcessor_.GetDownloadProgress().endReason);
106 }
107 FirmwareStep nextStep = FirmwareStep::COMPLETE;
108 switch (task.status) {
109 case UpgradeStatus::DOWNLOAD_PAUSE:
110 DownloadPauseProcess(task, errorMessage);
111 nextStep = FirmwareStep::COMPLETE;
112 break;
113 case UpgradeStatus::DOWNLOAD_FAIL:
114 DownloadFailProcess(task, errorMessage);
115 nextStep = FirmwareStep::COMPLETE;
116 break;
117 case UpgradeStatus::DOWNLOAD_CANCEL:
118 DownloadCancelProcess(task, errorMessage);
119 nextStep = FirmwareStep::COMPLETE;
120 break;
121 case UpgradeStatus::DOWNLOAD_SUCCESS:
122 DownloadSucessProcess(task, errorMessage);
123 nextStep = FirmwareStep::COMPLETE;
124 break;
125 default:
126 break;
127 }
128 return nextStep;
129 }
130
DownloadPauseProcess(const FirmwareTask & task,const ErrorMessage & errorMessage)131 void FirmwareDownloadMode::DownloadPauseProcess(const FirmwareTask &task, const ErrorMessage &errorMessage)
132 {
133 FIRMWARE_LOGI("GetStepAfterDownload download pause");
134 DelayedSingleton<FirmwareCallbackUtils>::GetInstance()->NotifyEvent(
135 task.taskId, EventId::EVENT_DOWNLOAD_PAUSE, UpgradeStatus::DOWNLOAD_PAUSE, errorMessage);
136 }
137
DownloadFailProcess(const FirmwareTask & task,const ErrorMessage & errorMessage)138 void FirmwareDownloadMode::DownloadFailProcess(const FirmwareTask &task, const ErrorMessage &errorMessage)
139 {
140 FIRMWARE_LOGI("GetStepAfterDownload download fail");
141 DelayedSingleton<FirmwareCallbackUtils>::GetInstance()->NotifyEvent(
142 task.taskId, EventId::EVENT_DOWNLOAD_FAIL, UpgradeStatus::DOWNLOAD_FAIL, errorMessage);
143 FirmwareUpdateHelper::ClearFirmwareInfo();
144 }
145
DownloadCancelProcess(const FirmwareTask & task,const ErrorMessage & errorMessage)146 void FirmwareDownloadMode::DownloadCancelProcess(const FirmwareTask &task, const ErrorMessage &errorMessage)
147 {
148 FIRMWARE_LOGI("GetStepAfterDownload download cancel");
149 DelayedSingleton<FirmwareCallbackUtils>::GetInstance()->NotifyEvent(
150 task.taskId, EventId::EVENT_DOWNLOAD_CANCEL, UpgradeStatus::DOWNLOAD_CANCEL, errorMessage);
151 FirmwareTaskOperator().UpdateProgressByTaskId(task.taskId, UpgradeStatus::CHECK_VERSION_SUCCESS, 0);
152 std::vector<FirmwareComponent> firmwareComponentList;
153 FirmwareComponentOperator firmwareComponentOperator;
154 firmwareComponentOperator.QueryAll(firmwareComponentList);
155 for (const FirmwareComponent &component : firmwareComponentList) {
156 firmwareComponentOperator.UpdateProgressByUrl(
157 component.url, UpgradeStatus::CHECK_VERSION_SUCCESS, 0);
158 }
159 FirmwareTaskOperator().UpdateDownloadTaskIdByTaskId(task.taskId, "");
160 FirmwareFileUtils::DeleteDownloadFiles();
161 }
162
DownloadSucessProcess(const FirmwareTask & task,const ErrorMessage & errorMessage)163 void FirmwareDownloadMode::DownloadSucessProcess(const FirmwareTask &task, const ErrorMessage &errorMessage)
164 {
165 FIRMWARE_LOGI("GetStepAfterDownload download success");
166 DelayedSingleton<FirmwareCallbackUtils>::GetInstance()->NotifyEvent(
167 task.taskId, EventId::EVENT_UPGRADE_WAIT, UpgradeStatus::DOWNLOAD_SUCCESS);
168 }
169
GetTask()170 void FirmwareDownloadMode::GetTask()
171 {
172 if (!tasks_.isExistTask) {
173 FirmwareTaskOperator().QueryTask(tasks_);
174 }
175 }
176
HandleComplete()177 void FirmwareDownloadMode::HandleComplete()
178 {
179 FIRMWARE_LOGI("FirmwareDownloadMode::HandleComplete");
180 onExecuteFinishCallback_();
181 }
182
GetDownloadOptions()183 DownloadOptions FirmwareDownloadMode::GetDownloadOptions()
184 {
185 return downloadOptions_;
186 }
187
SetDownloadProgress(const Progress & progress)188 void FirmwareDownloadMode::SetDownloadProgress(const Progress &progress)
189 {
190 downloadDataProcessor_.SetDownloadProgress(progress);
191 }
192 } // namespace UpdateEngine
193 } // namespace OHOS