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