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