188edb362Sopenharmony_ci/* 288edb362Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 388edb362Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 488edb362Sopenharmony_ci * you may not use this file except in compliance with the License. 588edb362Sopenharmony_ci * You may obtain a copy of the License at 688edb362Sopenharmony_ci * 788edb362Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 888edb362Sopenharmony_ci * 988edb362Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1088edb362Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1188edb362Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1288edb362Sopenharmony_ci * See the License for the specific language governing permissions and 1388edb362Sopenharmony_ci * limitations under the License. 1488edb362Sopenharmony_ci */ 1588edb362Sopenharmony_ci 1688edb362Sopenharmony_ci#include "ab_update.h" 1788edb362Sopenharmony_ci 1888edb362Sopenharmony_ci#include "log/log.h" 1988edb362Sopenharmony_ci#include "package/package.h" 2088edb362Sopenharmony_ci#include "package/pkg_manager.h" 2188edb362Sopenharmony_ci#include "scope_guard.h" 2288edb362Sopenharmony_ci#include "utils.h" 2388edb362Sopenharmony_ci#include "updater/updater_const.h" 2488edb362Sopenharmony_ci 2588edb362Sopenharmony_cinamespace OHOS { 2688edb362Sopenharmony_cinamespace SysInstaller { 2788edb362Sopenharmony_ciusing namespace Updater; 2888edb362Sopenharmony_cistatic constexpr const char *PATCH_PACKAGE_NAME = "/updater.zip"; 2988edb362Sopenharmony_ciUpdaterStatus ABUpdate::StartABUpdate(const std::string &pkgPath) 3088edb362Sopenharmony_ci{ 3188edb362Sopenharmony_ci LOG(INFO) << "StartABUpdate start"; 3288edb362Sopenharmony_ci if (statusManager_ == nullptr) { 3388edb362Sopenharmony_ci LOG(ERROR) << "statusManager_ nullptr"; 3488edb362Sopenharmony_ci return UPDATE_ERROR; 3588edb362Sopenharmony_ci } 3688edb362Sopenharmony_ci 3788edb362Sopenharmony_ci Hpackage::PkgManager::PkgManagerPtr pkgManager = Hpackage::PkgManager::CreatePackageInstance(); 3888edb362Sopenharmony_ci if (pkgManager == nullptr) { 3988edb362Sopenharmony_ci LOG(ERROR) << "pkgManager is nullptr"; 4088edb362Sopenharmony_ci return UPDATE_ERROR; 4188edb362Sopenharmony_ci } 4288edb362Sopenharmony_ci 4388edb362Sopenharmony_ci STAGE(UPDATE_STAGE_BEGIN) << "StartABUpdate start"; 4488edb362Sopenharmony_ci LOG(INFO) << "ABUpdate start, pkg updaterPath : " << pkgPath.c_str(); 4588edb362Sopenharmony_ci 4688edb362Sopenharmony_ci UpdaterParams upParams; 4788edb362Sopenharmony_ci upParams.updatePackage = {pkgPath}; 4888edb362Sopenharmony_ci upParams.initialProgress = statusManager_->GetUpdateProgress(); 4988edb362Sopenharmony_ci upParams.currentPercentage = 1 - upParams.initialProgress; 5088edb362Sopenharmony_ci upParams.callbackProgress = [this](float value) { 5188edb362Sopenharmony_ci this->SetProgress(value); 5288edb362Sopenharmony_ci }; 5388edb362Sopenharmony_ci UpdaterStatus updateRet = DoInstallUpdaterPackage(pkgManager, upParams, HOTA_UPDATE); 5488edb362Sopenharmony_ci if (updateRet != UPDATE_SUCCESS) { 5588edb362Sopenharmony_ci LOG(INFO) << "Install package failed!"; 5688edb362Sopenharmony_ci STAGE(UPDATE_STAGE_FAIL) << "Install package failed"; 5788edb362Sopenharmony_ci Hpackage::PkgManager::ReleasePackageInstance(pkgManager); 5888edb362Sopenharmony_ci if (!DeleteUpdaterPath(GetWorkPath()) || !DeleteUpdaterPath(std::string(UPDATER_PATH))) { 5988edb362Sopenharmony_ci LOG(WARNING) << "Delete Work Path fail."; 6088edb362Sopenharmony_ci } 6188edb362Sopenharmony_ci return updateRet; 6288edb362Sopenharmony_ci } 6388edb362Sopenharmony_ci LOG(INFO) << "Install package successfully!"; 6488edb362Sopenharmony_ci STAGE(UPDATE_STAGE_SUCCESS) << "Install package success"; 6588edb362Sopenharmony_ci 6688edb362Sopenharmony_ci // app hot patch need remount patch partition 6788edb362Sopenharmony_ci if (pkgPath.find(PATCH_PACKAGE_NAME) != std::string::npos) { 6888edb362Sopenharmony_ci SysInstallerManagerInit::GetInstance().InvokeEvent(SYS_APP_QUICKFIX_EVENT); 6988edb362Sopenharmony_ci } 7088edb362Sopenharmony_ci Hpackage::PkgManager::ReleasePackageInstance(pkgManager); 7188edb362Sopenharmony_ci if (!DeleteUpdaterPath(GetWorkPath()) || !DeleteUpdaterPath(std::string(UPDATER_PATH))) { 7288edb362Sopenharmony_ci LOG(WARNING) << "Delete Work Path fail."; 7388edb362Sopenharmony_ci } 7488edb362Sopenharmony_ci return updateRet; 7588edb362Sopenharmony_ci} 7688edb362Sopenharmony_ci 7788edb362Sopenharmony_civoid ABUpdate::PerformAction() 7888edb362Sopenharmony_ci{ 7988edb362Sopenharmony_ci InstallerErrCode errCode = SYS_UPDATE_SUCCESS; 8088edb362Sopenharmony_ci std::string errStr = ""; 8188edb362Sopenharmony_ci UpdaterStatus updateRet = UpdaterStatus::UPDATE_SUCCESS; 8288edb362Sopenharmony_ci Detail::ScopeGuard guard([&] { 8388edb362Sopenharmony_ci LOG(INFO) << "PerformAction ret:" << updateRet; 8488edb362Sopenharmony_ci if (updateRet != UpdaterStatus::UPDATE_SUCCESS) { 8588edb362Sopenharmony_ci errCode = SYS_INSTALL_PARA_FAIL; 8688edb362Sopenharmony_ci errStr = std::to_string(updateRet); 8788edb362Sopenharmony_ci } 8888edb362Sopenharmony_ci if (actionCallBack_ != nullptr) { 8988edb362Sopenharmony_ci actionCallBack_(errCode, errStr); 9088edb362Sopenharmony_ci } 9188edb362Sopenharmony_ci }); 9288edb362Sopenharmony_ci 9388edb362Sopenharmony_ci updateRet = StartABUpdate(pkgPath_); 9488edb362Sopenharmony_ci} 9588edb362Sopenharmony_ci 9688edb362Sopenharmony_civoid ABUpdate::SetProgress(float value) 9788edb362Sopenharmony_ci{ 9888edb362Sopenharmony_ci if (statusManager_ == nullptr) { 9988edb362Sopenharmony_ci LOG(ERROR) << "statusManager_ nullptr"; 10088edb362Sopenharmony_ci return; 10188edb362Sopenharmony_ci } 10288edb362Sopenharmony_ci statusManager_->SetUpdatePercent(static_cast<int>(value)); 10388edb362Sopenharmony_ci} 10488edb362Sopenharmony_ci} // namespace SysInstaller 10588edb362Sopenharmony_ci} // namespace OHOS 106