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_manual_check_mode.h"
17 
18 #include "check_result.h"
19 #include "dupdate_errno.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_manager.h"
26 #include "firmware_preferences_utils.h"
27 #include "firmware_status_cache.h"
28 #include "firmware_task.h"
29 #include "firmware_task_operator.h"
30 #include "search_status.h"
31 
32 namespace OHOS {
33 namespace UpdateEngine {
GetNextStep(FirmwareStep step)34 FirmwareStep FirmwareManualCheckMode::GetNextStep(FirmwareStep step)
35 {
36     FIRMWARE_LOGI("GetNextStep %{public}d", static_cast<uint32_t>(step));
37     FirmwareStep nextStep = FirmwareStep::COMPLETE;
38     switch (step) {
39         case FirmwareStep::INIT:
40             nextStep = GetStepAfterInit();
41             break;
42         case FirmwareStep::CHECK_STEP:
43             nextStep = GetStepAfterCheck();
44             break;
45         default:
46             break;
47     }
48     return nextStep;
49 }
50 
GetStepAfterInit()51 FirmwareStep FirmwareManualCheckMode::GetStepAfterInit()
52 {
53     if (DelayedSingleton<FirmwareStatusCache>::GetInstance()->IsChecking()) {
54         FIRMWARE_LOGI("IsNeedBlockCheck system busy");
55         businessError_.Build(CallResult::FAIL, "system busy!");
56         businessError_.AddErrorMessage(CAST_INT(DUPDATE_ERR_SYSTEM_BUSY_ON_CHECK), "checkNewVersion is checking!");
57         return FirmwareStep::COMPLETE;
58     }
59     if (checkDataProcessor_.IsUpdateOnStatus()) {
60         FIRMWARE_LOGI("IsNeedBlockCheck system busy on update");
61         businessError_.Build(CallResult::FAIL, "system busy!");
62         businessError_.AddErrorMessage(CAST_INT(DUPDATE_ERR_SYSTEM_BUSY_ON_INSTALL), "system is updating!");
63         return FirmwareStep::COMPLETE;
64     }
65 
66     if (!DelayedSingleton<NetManager>::GetInstance()->IsNetAvailable()) {
67         FIRMWARE_LOGI("IsNeedBlockCheck no network");
68         businessError_.Build(CallResult::FAIL, "CheckNewVersionService no network!");
69         businessError_.AddErrorMessage(CAST_INT(SearchStatus::NET_ERROR), "CheckNewVersionService no network !");
70         return FirmwareStep::COMPLETE;
71     }
72     return FirmwareStep::CHECK_STEP;
73 }
74 
GetStepAfterCheck()75 FirmwareStep FirmwareManualCheckMode::GetStepAfterCheck()
76 {
77     if (checkDataProcessor_.IsCheckFailed() || checkDataProcessor_.IsSameWithDb() ||
78         !checkDataProcessor_.HasNewVersion()) {
79         return FirmwareStep::COMPLETE;
80     }
81 
82     // 手动搜包,搜到新版本并且与之前结果不一致,并且当前状态为搜包成功,推送task_receive事件
83     FirmwareTask task;
84     FirmwareTaskOperator().QueryTask(task);
85     FIRMWARE_LOGI("FirmwareManualCheckMode::status %{public}d", static_cast<uint32_t>(task.status));
86     if (task.status == UpgradeStatus::CHECK_VERSION_SUCCESS) {
87         DelayedSingleton<FirmwareCallbackUtils>::GetInstance()->NotifyEvent(
88             task.taskId, EventId::EVENT_TASK_RECEIVE, UpgradeStatus::CHECK_VERSION_SUCCESS);
89         std::shared_ptr<FirmwarePreferencesUtil> utils = DelayedSingleton<FirmwarePreferencesUtil>::GetInstance();
90         if (!utils->ObtainBool(Firmware::AUTO_DOWNLOAD_SWITCH, false)) {
91             DelayedSingleton<FirmwareCallbackUtils>::GetInstance()->NotifyEvent(
92                 task.taskId, EventId::EVENT_DOWNLOAD_WAIT, UpgradeStatus::CHECK_VERSION_SUCCESS);
93         }
94     }
95     return FirmwareStep::COMPLETE;
96 }
97 
SetCheckResult(CheckStatus status,const Duration & duration,const std::vector<FirmwareComponent> & componentList,const CheckAndAuthInfo & checkAndAuthInfo)98 void FirmwareManualCheckMode::SetCheckResult(
99     CheckStatus status, const Duration &duration, const std::vector<FirmwareComponent> &componentList,
100     const CheckAndAuthInfo &checkAndAuthInfo)
101 {
102     FIRMWARE_LOGI("FirmwareManualCheckMode::SetCheckResult %{public}d", static_cast<uint32_t>(status));
103     checkDataProcessor_.SetCheckResult(status, duration, componentList);
104 }
105 
HandleComplete()106 void FirmwareManualCheckMode::HandleComplete()
107 {
108     FIRMWARE_LOGI("FirmwareManualCheckMode::HandleComplete");
109 
110     // 回调搜包结果
111     CheckResult checkResult;
112     checkDataProcessor_.BuildCheckResult(checkResult);
113     onCheckComplete_(businessError_, checkResult);
114 }
115 } // namespace UpdateEngine
116 } // namespace OHOS