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 ¤tVersionInfo) 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