1fb299fa2Sopenharmony_ci/*
2fb299fa2Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3fb299fa2Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fb299fa2Sopenharmony_ci * you may not use this file except in compliance with the License.
5fb299fa2Sopenharmony_ci * You may obtain a copy of the License at
6fb299fa2Sopenharmony_ci *
7fb299fa2Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8fb299fa2Sopenharmony_ci *
9fb299fa2Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fb299fa2Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fb299fa2Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fb299fa2Sopenharmony_ci * See the License for the specific language governing permissions and
13fb299fa2Sopenharmony_ci * limitations under the License.
14fb299fa2Sopenharmony_ci */
15fb299fa2Sopenharmony_ci
16fb299fa2Sopenharmony_ci#include "ui_strategy.h"
17fb299fa2Sopenharmony_ci#include <array>
18fb299fa2Sopenharmony_ci
19fb299fa2Sopenharmony_cinamespace Updater {
20fb299fa2Sopenharmony_cistd::ostream &operator<<(std::ostream &os, const UiStrategyCfg &info)
21fb299fa2Sopenharmony_ci{
22fb299fa2Sopenharmony_ci    os << "confirmPageId: " << info.confirmPageId << std::endl;
23fb299fa2Sopenharmony_ci    os << "labelLogId: { " << info.labelLogId << " }" << std::endl;
24fb299fa2Sopenharmony_ci    os << "labelLogResId: { " << info.labelLogResId << " }" << std::endl;
25fb299fa2Sopenharmony_ci    os << "labelUpdId: { " << info.labelUpdId << " }" << std::endl;
26fb299fa2Sopenharmony_ci    os << info.progressPage << std::endl;
27fb299fa2Sopenharmony_ci    os << info.resPage;
28fb299fa2Sopenharmony_ci    return os;
29fb299fa2Sopenharmony_ci}
30fb299fa2Sopenharmony_ci
31fb299fa2Sopenharmony_cistd::ostream &operator<<(std::ostream &os, const ResPage &info)
32fb299fa2Sopenharmony_ci{
33fb299fa2Sopenharmony_ci    os << "resPage: {" << std::endl;
34fb299fa2Sopenharmony_ci    os << "\tsucessPageId: " << info.successPageId << std::endl;
35fb299fa2Sopenharmony_ci    os << "\tfailPageId: " << info.failPageId << std::endl;
36fb299fa2Sopenharmony_ci    os << "}" << std::endl;
37fb299fa2Sopenharmony_ci    return os;
38fb299fa2Sopenharmony_ci}
39fb299fa2Sopenharmony_ci
40fb299fa2Sopenharmony_cistd::ostream &operator<<(std::ostream &os, const ProgressPage &info)
41fb299fa2Sopenharmony_ci{
42fb299fa2Sopenharmony_ci    os << "progressPage: {" << std::endl;
43fb299fa2Sopenharmony_ci    os << "\tprocessPageId: " << info.progressPageId << std::endl;
44fb299fa2Sopenharmony_ci    os << "\tprgrsComId: " << info.progressComId << std::endl;
45fb299fa2Sopenharmony_ci    os << "\tprgrsType: " << info.progressType << std::endl;
46fb299fa2Sopenharmony_ci    os << "\tlogoComId: " << info.logoComId << std::endl;
47fb299fa2Sopenharmony_ci    os << "\tlogoType: " << info.logoType << std::endl;
48fb299fa2Sopenharmony_ci    os << "}";
49fb299fa2Sopenharmony_ci    return os;
50fb299fa2Sopenharmony_ci}
51fb299fa2Sopenharmony_ci
52fb299fa2Sopenharmony_cistd::unordered_map<std::string, UiStrategyCfg> UiStrategy::strategies_;
53fb299fa2Sopenharmony_cistd::vector<std::string> UiStrategy::modeStr_ = {
54fb299fa2Sopenharmony_ci    {UPDATERMODE_SDCARD},
55fb299fa2Sopenharmony_ci    {UPDATERMODE_FACTORYRST},
56fb299fa2Sopenharmony_ci    {UPDATERMODE_REBOOTFACTORYRST},
57fb299fa2Sopenharmony_ci    {UPDATERMODE_OTA},
58fb299fa2Sopenharmony_ci    {UPDATERMODE_RECOVER},
59fb299fa2Sopenharmony_ci    {UPDATERMODE_NIGHTUPDATE},
60fb299fa2Sopenharmony_ci};
61fb299fa2Sopenharmony_ci
62fb299fa2Sopenharmony_civoid UiStrategy::RegisterUiMode(const std::string &mode)
63fb299fa2Sopenharmony_ci{
64fb299fa2Sopenharmony_ci    LOG(DEBUG) << "RegisterUiMode " << mode;
65fb299fa2Sopenharmony_ci    modeStr_.emplace_back(mode);
66fb299fa2Sopenharmony_ci}
67fb299fa2Sopenharmony_ci
68fb299fa2Sopenharmony_ciconst std::unordered_map<std::string, UiStrategyCfg> &UiStrategy::GetStrategy()
69fb299fa2Sopenharmony_ci{
70fb299fa2Sopenharmony_ci    return strategies_;
71fb299fa2Sopenharmony_ci}
72fb299fa2Sopenharmony_ci
73fb299fa2Sopenharmony_cibool UiStrategy::LoadStrategy(const JsonNode &node, const std::string &mode)
74fb299fa2Sopenharmony_ci{
75fb299fa2Sopenharmony_ci    auto it = std::find(modeStr_.begin(), modeStr_.end(), mode);
76fb299fa2Sopenharmony_ci    if (it == modeStr_.end()) {
77fb299fa2Sopenharmony_ci        return false;
78fb299fa2Sopenharmony_ci    }
79fb299fa2Sopenharmony_ci    const JsonNode &defaultNode = node[Traits<UiStrategyCfg>::STRUCT_KEY][DEFAULT_KEY];
80fb299fa2Sopenharmony_ci    const JsonNode &specificNode = node[Traits<UiStrategyCfg>::STRUCT_KEY][*it];
81fb299fa2Sopenharmony_ci    if (!Visit<SETVAL>(specificNode, defaultNode, strategies_[mode])) {
82fb299fa2Sopenharmony_ci        LOG(ERROR) << "parse strategy config error";
83fb299fa2Sopenharmony_ci        return false;
84fb299fa2Sopenharmony_ci    }
85fb299fa2Sopenharmony_ci    LOG(DEBUG) << "mode " << mode << "\n" << strategies_[mode];
86fb299fa2Sopenharmony_ci    return true;
87fb299fa2Sopenharmony_ci}
88fb299fa2Sopenharmony_ci
89fb299fa2Sopenharmony_cibool UiStrategy::LoadStrategy(const JsonNode &node)
90fb299fa2Sopenharmony_ci{
91fb299fa2Sopenharmony_ci    std::unordered_map<std::string, UiStrategyCfg>().swap(strategies_);
92fb299fa2Sopenharmony_ci    for (auto mode : modeStr_) {
93fb299fa2Sopenharmony_ci        if (!LoadStrategy(node, mode)) {
94fb299fa2Sopenharmony_ci            LOG(ERROR) << "load strategy " << mode << " failed";
95fb299fa2Sopenharmony_ci            std::unordered_map<std::string, UiStrategyCfg>().swap(strategies_);
96fb299fa2Sopenharmony_ci            return false;
97fb299fa2Sopenharmony_ci        }
98fb299fa2Sopenharmony_ci    }
99fb299fa2Sopenharmony_ci    return true;
100fb299fa2Sopenharmony_ci}
101fb299fa2Sopenharmony_ci} // namespace Updater