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 18namespace OHOS { 19namespace UpdateEngine { 20std::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 35void 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// 此处为桩函数,默认电量足够。 48bool FirmwareUpdateHelper::IsBatteryEnough(int32_t batteryLimit) 49{ 50 return true; 51} 52 53InstallType 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 61bool 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 70VersionComponent 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 86void 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 109void 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 124bool 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