1190978c3Sopenharmony_ci/*
2190978c3Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3190978c3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4190978c3Sopenharmony_ci * you may not use this file except in compliance with the License.
5190978c3Sopenharmony_ci * You may obtain a copy of the License at
6190978c3Sopenharmony_ci *
7190978c3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8190978c3Sopenharmony_ci *
9190978c3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10190978c3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11190978c3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12190978c3Sopenharmony_ci * See the License for the specific language governing permissions and
13190978c3Sopenharmony_ci * limitations under the License.
14190978c3Sopenharmony_ci */
15190978c3Sopenharmony_ci
16190978c3Sopenharmony_ci#include "firmware_update_helper.h"
17190978c3Sopenharmony_ci
18190978c3Sopenharmony_cinamespace OHOS {
19190978c3Sopenharmony_cinamespace UpdateEngine {
20190978c3Sopenharmony_cistd::string FirmwareUpdateHelper::BuildTaskId(const std::vector<FirmwareComponent> &componentList)
21190978c3Sopenharmony_ci{
22190978c3Sopenharmony_ci    if (componentList.empty()) {
23190978c3Sopenharmony_ci        return "";
24190978c3Sopenharmony_ci    }
25190978c3Sopenharmony_ci    std::string taskId;
26190978c3Sopenharmony_ci    for (const FirmwareComponent &component : componentList) {
27190978c3Sopenharmony_ci        if (!taskId.empty()) {
28190978c3Sopenharmony_ci            taskId.append("_");
29190978c3Sopenharmony_ci        }
30190978c3Sopenharmony_ci        taskId.append(component.versionId);
31190978c3Sopenharmony_ci    }
32190978c3Sopenharmony_ci    return Sha256Utils::CalculateHashCode(taskId);
33190978c3Sopenharmony_ci}
34190978c3Sopenharmony_ci
35190978c3Sopenharmony_civoid FirmwareUpdateHelper::ClearFirmwareInfo()
36190978c3Sopenharmony_ci{
37190978c3Sopenharmony_ci    FIRMWARE_LOGI("ClearFirmwareInfo");
38190978c3Sopenharmony_ci
39190978c3Sopenharmony_ci    FirmwareTask task;
40190978c3Sopenharmony_ci    FirmwareTaskOperator firmwareTaskOperator;
41190978c3Sopenharmony_ci    firmwareTaskOperator.QueryTask(task);
42190978c3Sopenharmony_ci    firmwareTaskOperator.DeleteAll();
43190978c3Sopenharmony_ci    FirmwareComponentOperator().DeleteAll();
44190978c3Sopenharmony_ci    FirmwareFileUtils::DeleteDownloadFiles();
45190978c3Sopenharmony_ci}
46190978c3Sopenharmony_ci
47190978c3Sopenharmony_ci// 此处为桩函数,默认电量足够。
48190978c3Sopenharmony_cibool FirmwareUpdateHelper::IsBatteryEnough(int32_t batteryLimit)
49190978c3Sopenharmony_ci{
50190978c3Sopenharmony_ci    return true;
51190978c3Sopenharmony_ci}
52190978c3Sopenharmony_ci
53190978c3Sopenharmony_ciInstallType FirmwareUpdateHelper::GetInstallType()
54190978c3Sopenharmony_ci{
55190978c3Sopenharmony_ci    InstallType installType = (DeviceAdapter::GetBootSlot()) == Firmware::BOOTSLOTS_AB_UPDATE_VALUE ?
56190978c3Sopenharmony_ci        InstallType::SYS_INSTALLER : InstallType::UPDATER;
57190978c3Sopenharmony_ci    FIRMWARE_LOGI("get installType(bootsloot) %{public}d", CAST_INT(installType));
58190978c3Sopenharmony_ci    return installType;
59190978c3Sopenharmony_ci}
60190978c3Sopenharmony_ci
61190978c3Sopenharmony_cibool FirmwareUpdateHelper::IsUpgradeFailed(UpgradeStatus status)
62190978c3Sopenharmony_ci{
63190978c3Sopenharmony_ci    return status == UpgradeStatus::DOWNLOAD_FAIL ||
64190978c3Sopenharmony_ci           status == UpgradeStatus::PACKAGE_TRANS_FAIL ||
65190978c3Sopenharmony_ci           status == UpgradeStatus::INSTALL_FAIL ||
66190978c3Sopenharmony_ci           status == UpgradeStatus::UPDATE_FAIL ||
67190978c3Sopenharmony_ci           status == UpgradeStatus::VERIFY_FAIL;
68190978c3Sopenharmony_ci}
69190978c3Sopenharmony_ci
70190978c3Sopenharmony_ciVersionComponent FirmwareUpdateHelper::BuildHotaVersionComponent(std::vector<FirmwareComponent> &hotaComponents)
71190978c3Sopenharmony_ci{
72190978c3Sopenharmony_ci    VersionComponent hotaVersionComponent;
73190978c3Sopenharmony_ci    hotaVersionComponent.componentId = hotaComponents[0].componentId;
74190978c3Sopenharmony_ci    hotaVersionComponent.upgradeAction = UpgradeAction::UPGRADE;
75190978c3Sopenharmony_ci    hotaVersionComponent.componentType = CAST_INT(ComponentType::OTA);
76190978c3Sopenharmony_ci    hotaVersionComponent.effectiveMode = FirmwareUpdateHelper::GetInstallType() == InstallType::SYS_INSTALLER ?
77190978c3Sopenharmony_ci        static_cast<size_t>(EffectiveMode::LIVE_AND_COLD): static_cast<size_t>(EffectiveMode::COLD);
78190978c3Sopenharmony_ci    hotaVersionComponent.innerVersion = hotaComponents[0].targetBlVersionNumber;
79190978c3Sopenharmony_ci    hotaVersionComponent.displayVersion = hotaComponents[0].targetBlDisplayVersionNumber;
80190978c3Sopenharmony_ci    for (const auto &component : hotaComponents) {
81190978c3Sopenharmony_ci        hotaVersionComponent.size += static_cast<size_t>(component.size);
82190978c3Sopenharmony_ci    }
83190978c3Sopenharmony_ci    return hotaVersionComponent;
84190978c3Sopenharmony_ci}
85190978c3Sopenharmony_ci
86190978c3Sopenharmony_civoid FirmwareUpdateHelper::BuildNewVersionInfo(const std::vector<FirmwareComponent> &components,
87190978c3Sopenharmony_ci    std::vector<VersionComponent> &versionComponents)
88190978c3Sopenharmony_ci{
89190978c3Sopenharmony_ci    if (components.empty()) {
90190978c3Sopenharmony_ci        FIRMWARE_LOGI("BuildNewVersionInfo component is null");
91190978c3Sopenharmony_ci        return;
92190978c3Sopenharmony_ci    }
93190978c3Sopenharmony_ci    std::vector<FirmwareComponent> hotaComponents;
94190978c3Sopenharmony_ci    for (auto &component : components) {
95190978c3Sopenharmony_ci        if (component.blVersionType == CAST_INT(BlType::HOTA_TYPE)) {
96190978c3Sopenharmony_ci            hotaComponents.push_back(component);
97190978c3Sopenharmony_ci        }
98190978c3Sopenharmony_ci        if (component.blVersionType == CAST_INT(BlType::DYNAMIC_TYPE)) {
99190978c3Sopenharmony_ci            hotaComponents.push_back(component);
100190978c3Sopenharmony_ci        }
101190978c3Sopenharmony_ci    }
102190978c3Sopenharmony_ci
103190978c3Sopenharmony_ci    if (!hotaComponents.empty()) {
104190978c3Sopenharmony_ci        VersionComponent hotaVersionComponent = BuildHotaVersionComponent(hotaComponents);
105190978c3Sopenharmony_ci        versionComponents.push_back(hotaVersionComponent);
106190978c3Sopenharmony_ci    }
107190978c3Sopenharmony_ci}
108190978c3Sopenharmony_ci
109190978c3Sopenharmony_civoid FirmwareUpdateHelper::BuildCurrentVersionInfo(CurrentVersionInfo &currentVersionInfo)
110190978c3Sopenharmony_ci{
111190978c3Sopenharmony_ci    currentVersionInfo.osVersion = DeviceAdapter::GetOsVersion();
112190978c3Sopenharmony_ci    currentVersionInfo.deviceName = DeviceAdapter::GetDeviceName();
113190978c3Sopenharmony_ci
114190978c3Sopenharmony_ci    std::shared_ptr<FirmwarePreferencesUtil> utils = DelayedSingleton<FirmwarePreferencesUtil>::GetInstance();
115190978c3Sopenharmony_ci    VersionComponent hotaVersionComponent;
116190978c3Sopenharmony_ci    hotaVersionComponent.displayVersion = DeviceAdapter::GetDisplayVersion();
117190978c3Sopenharmony_ci    hotaVersionComponent.innerVersion = DeviceAdapter::GetRealVersion();
118190978c3Sopenharmony_ci    hotaVersionComponent.descriptionInfo.descriptionType = DescriptionType::ID;
119190978c3Sopenharmony_ci    hotaVersionComponent.componentId = utils->ObtainString(Firmware::HOTA_CURRENT_COMPONENT_ID, "");
120190978c3Sopenharmony_ci    hotaVersionComponent.componentType = CAST_INT(ComponentType::OTA);
121190978c3Sopenharmony_ci    currentVersionInfo.versionComponents.push_back(hotaVersionComponent);
122190978c3Sopenharmony_ci}
123190978c3Sopenharmony_ci
124190978c3Sopenharmony_cibool FirmwareUpdateHelper::IsUpgradePackagesReady(const std::vector<FirmwareComponent> &componentList)
125190978c3Sopenharmony_ci{
126190978c3Sopenharmony_ci    if (componentList.empty()) {
127190978c3Sopenharmony_ci        FIRMWARE_LOGE("IsUpgradePackagesReady: componentList is null!");
128190978c3Sopenharmony_ci        return false;
129190978c3Sopenharmony_ci    }
130190978c3Sopenharmony_ci
131190978c3Sopenharmony_ci    return std::all_of(componentList.begin(), componentList.end(), [](const FirmwareComponent &component) {
132190978c3Sopenharmony_ci        if (!FileUtils::IsFileExist(component.spath)) {
133190978c3Sopenharmony_ci            FIRMWARE_LOGE("IsUpgradePackagesReady: package [%{public}s] is not exist!", component.spath.c_str());
134190978c3Sopenharmony_ci            return false;
135190978c3Sopenharmony_ci        }
136190978c3Sopenharmony_ci        int64_t realSize = FileUtils::GetFileSize(component.spath);
137190978c3Sopenharmony_ci        if (realSize != component.size) {
138190978c3Sopenharmony_ci            FIRMWARE_LOGE("IsUpgradePackagesReady: calculate component size %{public}s != DB component size %{public}s",
139190978c3Sopenharmony_ci                std::to_string(realSize).c_str(), std::to_string(component.size).c_str());
140190978c3Sopenharmony_ci            return false;
141190978c3Sopenharmony_ci        }
142190978c3Sopenharmony_ci        return true;
143190978c3Sopenharmony_ci    });
144190978c3Sopenharmony_ci}
145190978c3Sopenharmony_ci} // namespace UpdateEngine
146190978c3Sopenharmony_ci} // namespace OHOS