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_update_helper.h"
17
18 namespace OHOS {
19 namespace UpdateEngine {
BuildTaskId(const std::vector<FirmwareComponent> & componentList)20 std::string FirmwareUpdateHelper::BuildTaskId(const std::vector<FirmwareComponent> &componentList)
21 {
22 if (componentList.empty()) {
23 return "";
24 }
25 std::string taskId;
26 for (const FirmwareComponent &component : componentList) {
27 if (!taskId.empty()) {
28 taskId.append("_");
29 }
30 taskId.append(component.versionId);
31 }
32 return Sha256Utils::CalculateHashCode(taskId);
33 }
34
ClearFirmwareInfo()35 void FirmwareUpdateHelper::ClearFirmwareInfo()
36 {
37 FIRMWARE_LOGI("ClearFirmwareInfo");
38
39 FirmwareTask task;
40 FirmwareTaskOperator firmwareTaskOperator;
41 firmwareTaskOperator.QueryTask(task);
42 firmwareTaskOperator.DeleteAll();
43 FirmwareComponentOperator().DeleteAll();
44 FirmwareFileUtils::DeleteDownloadFiles();
45 }
46
47 // 此处为桩函数,默认电量足够。
IsBatteryEnough(int32_t batteryLimit)48 bool FirmwareUpdateHelper::IsBatteryEnough(int32_t batteryLimit)
49 {
50 return true;
51 }
52
GetInstallType()53 InstallType FirmwareUpdateHelper::GetInstallType()
54 {
55 InstallType installType = (DeviceAdapter::GetBootSlot()) == Firmware::BOOTSLOTS_AB_UPDATE_VALUE ?
56 InstallType::SYS_INSTALLER : InstallType::UPDATER;
57 FIRMWARE_LOGI("get installType(bootsloot) %{public}d", CAST_INT(installType));
58 return installType;
59 }
60
IsUpgradeFailed(UpgradeStatus status)61 bool FirmwareUpdateHelper::IsUpgradeFailed(UpgradeStatus status)
62 {
63 return status == UpgradeStatus::DOWNLOAD_FAIL ||
64 status == UpgradeStatus::PACKAGE_TRANS_FAIL ||
65 status == UpgradeStatus::INSTALL_FAIL ||
66 status == UpgradeStatus::UPDATE_FAIL ||
67 status == UpgradeStatus::VERIFY_FAIL;
68 }
69
BuildHotaVersionComponent(std::vector<FirmwareComponent> & hotaComponents)70 VersionComponent FirmwareUpdateHelper::BuildHotaVersionComponent(std::vector<FirmwareComponent> &hotaComponents)
71 {
72 VersionComponent hotaVersionComponent;
73 hotaVersionComponent.componentId = hotaComponents[0].componentId;
74 hotaVersionComponent.upgradeAction = UpgradeAction::UPGRADE;
75 hotaVersionComponent.componentType = CAST_INT(ComponentType::OTA);
76 hotaVersionComponent.effectiveMode = FirmwareUpdateHelper::GetInstallType() == InstallType::SYS_INSTALLER ?
77 static_cast<size_t>(EffectiveMode::LIVE_AND_COLD): static_cast<size_t>(EffectiveMode::COLD);
78 hotaVersionComponent.innerVersion = hotaComponents[0].targetBlVersionNumber;
79 hotaVersionComponent.displayVersion = hotaComponents[0].targetBlDisplayVersionNumber;
80 for (const auto &component : hotaComponents) {
81 hotaVersionComponent.size += static_cast<size_t>(component.size);
82 }
83 return hotaVersionComponent;
84 }
85
BuildNewVersionInfo(const std::vector<FirmwareComponent> & components,std::vector<VersionComponent> & versionComponents)86 void FirmwareUpdateHelper::BuildNewVersionInfo(const std::vector<FirmwareComponent> &components,
87 std::vector<VersionComponent> &versionComponents)
88 {
89 if (components.empty()) {
90 FIRMWARE_LOGI("BuildNewVersionInfo component is null");
91 return;
92 }
93 std::vector<FirmwareComponent> hotaComponents;
94 for (auto &component : components) {
95 if (component.blVersionType == CAST_INT(BlType::HOTA_TYPE)) {
96 hotaComponents.push_back(component);
97 }
98 if (component.blVersionType == CAST_INT(BlType::DYNAMIC_TYPE)) {
99 hotaComponents.push_back(component);
100 }
101 }
102
103 if (!hotaComponents.empty()) {
104 VersionComponent hotaVersionComponent = BuildHotaVersionComponent(hotaComponents);
105 versionComponents.push_back(hotaVersionComponent);
106 }
107 }
108
BuildCurrentVersionInfo(CurrentVersionInfo & currentVersionInfo)109 void FirmwareUpdateHelper::BuildCurrentVersionInfo(CurrentVersionInfo ¤tVersionInfo)
110 {
111 currentVersionInfo.osVersion = DeviceAdapter::GetOsVersion();
112 currentVersionInfo.deviceName = DeviceAdapter::GetDeviceName();
113
114 std::shared_ptr<FirmwarePreferencesUtil> utils = DelayedSingleton<FirmwarePreferencesUtil>::GetInstance();
115 VersionComponent hotaVersionComponent;
116 hotaVersionComponent.displayVersion = DeviceAdapter::GetDisplayVersion();
117 hotaVersionComponent.innerVersion = DeviceAdapter::GetRealVersion();
118 hotaVersionComponent.descriptionInfo.descriptionType = DescriptionType::ID;
119 hotaVersionComponent.componentId = utils->ObtainString(Firmware::HOTA_CURRENT_COMPONENT_ID, "");
120 hotaVersionComponent.componentType = CAST_INT(ComponentType::OTA);
121 currentVersionInfo.versionComponents.push_back(hotaVersionComponent);
122 }
123
IsUpgradePackagesReady(const std::vector<FirmwareComponent> & componentList)124 bool FirmwareUpdateHelper::IsUpgradePackagesReady(const std::vector<FirmwareComponent> &componentList)
125 {
126 if (componentList.empty()) {
127 FIRMWARE_LOGE("IsUpgradePackagesReady: componentList is null!");
128 return false;
129 }
130
131 return std::all_of(componentList.begin(), componentList.end(), [](const FirmwareComponent &component) {
132 if (!FileUtils::IsFileExist(component.spath)) {
133 FIRMWARE_LOGE("IsUpgradePackagesReady: package [%{public}s] is not exist!", component.spath.c_str());
134 return false;
135 }
136 int64_t realSize = FileUtils::GetFileSize(component.spath);
137 if (realSize != component.size) {
138 FIRMWARE_LOGE("IsUpgradePackagesReady: calculate component size %{public}s != DB component size %{public}s",
139 std::to_string(realSize).c_str(), std::to_string(component.size).c_str());
140 return false;
141 }
142 return true;
143 });
144 }
145 } // namespace UpdateEngine
146 } // namespace OHOS