16ea96550Sopenharmony_ci/*
26ea96550Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
36ea96550Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
46ea96550Sopenharmony_ci * you may not use this file except in compliance with the License.
56ea96550Sopenharmony_ci * You may obtain a copy of the License at
66ea96550Sopenharmony_ci *
76ea96550Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
86ea96550Sopenharmony_ci *
96ea96550Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
106ea96550Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
116ea96550Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
126ea96550Sopenharmony_ci * See the License for the specific language governing permissions and
136ea96550Sopenharmony_ci * limitations under the License.
146ea96550Sopenharmony_ci */
156ea96550Sopenharmony_ci
166ea96550Sopenharmony_ci#include "model_config.h"
176ea96550Sopenharmony_ci
186ea96550Sopenharmony_ci#include "file_ex.h"
196ea96550Sopenharmony_ci
206ea96550Sopenharmony_ci#include "config_data_manager.h"
216ea96550Sopenharmony_ci#include "json_cfg.h"
226ea96550Sopenharmony_ci#include "model_analysis_define.h"
236ea96550Sopenharmony_ci#include "model_cfg_marshalling.h"
246ea96550Sopenharmony_ci#include "security_guard_log.h"
256ea96550Sopenharmony_ci#include "security_guard_utils.h"
266ea96550Sopenharmony_ci
276ea96550Sopenharmony_cinamespace OHOS::Security::SecurityGuard {
286ea96550Sopenharmony_cibool ModelConfig::Load(int mode)
296ea96550Sopenharmony_ci{
306ea96550Sopenharmony_ci    std::string path;
316ea96550Sopenharmony_ci    if (mode == INIT_MODE) {
326ea96550Sopenharmony_ci        if (FileExists(CONFIG_UPTATE_FILES[MODEL_CFG_INDEX])) {
336ea96550Sopenharmony_ci            path = CONFIG_UPTATE_FILES[MODEL_CFG_INDEX];
346ea96550Sopenharmony_ci        } else if (FileExists(CONFIG_PRESET_FILES[MODEL_CFG_INDEX])) {
356ea96550Sopenharmony_ci            path = CONFIG_PRESET_FILES[MODEL_CFG_INDEX];
366ea96550Sopenharmony_ci        }
376ea96550Sopenharmony_ci    } else if (mode == UPDATE_MODE) {
386ea96550Sopenharmony_ci        if (FileExists(CONFIG_CACHE_FILES[MODEL_CFG_INDEX])) {
396ea96550Sopenharmony_ci            path = CONFIG_CACHE_FILES[MODEL_CFG_INDEX];
406ea96550Sopenharmony_ci        }
416ea96550Sopenharmony_ci    }
426ea96550Sopenharmony_ci    SGLOGD("path=%{public}s", path.c_str());
436ea96550Sopenharmony_ci    if (path.empty()) {
446ea96550Sopenharmony_ci        SGLOGE("path is empty");
456ea96550Sopenharmony_ci        return false;
466ea96550Sopenharmony_ci    }
476ea96550Sopenharmony_ci    stream_ = std::ifstream(path, std::ios::in);
486ea96550Sopenharmony_ci    if (!stream_.is_open()) {
496ea96550Sopenharmony_ci        SGLOGE("stream error, %{public}s", strerror(errno));
506ea96550Sopenharmony_ci        return false;
516ea96550Sopenharmony_ci    }
526ea96550Sopenharmony_ci    return true;
536ea96550Sopenharmony_ci}
546ea96550Sopenharmony_ci
556ea96550Sopenharmony_cibool ModelConfig::Parse()
566ea96550Sopenharmony_ci{
576ea96550Sopenharmony_ci    if (!stream_.is_open()) {
586ea96550Sopenharmony_ci        SGLOGE("stream error");
596ea96550Sopenharmony_ci        return false;
606ea96550Sopenharmony_ci    }
616ea96550Sopenharmony_ci    nlohmann::json jsonObj = nlohmann::json::parse(stream_, nullptr, false);
626ea96550Sopenharmony_ci    stream_.close();
636ea96550Sopenharmony_ci
646ea96550Sopenharmony_ci    if (jsonObj.is_discarded()) {
656ea96550Sopenharmony_ci        SGLOGI("json is discarded");
666ea96550Sopenharmony_ci        return false;
676ea96550Sopenharmony_ci    }
686ea96550Sopenharmony_ci
696ea96550Sopenharmony_ci    std::vector<ModelCfg> configs;
706ea96550Sopenharmony_ci    bool success = ParseModelConfig(configs, jsonObj);
716ea96550Sopenharmony_ci    if (!success) {
726ea96550Sopenharmony_ci        SGLOGE("parse ModelConfig error");
736ea96550Sopenharmony_ci        return false;
746ea96550Sopenharmony_ci    }
756ea96550Sopenharmony_ci    CacheModelConfig(configs);
766ea96550Sopenharmony_ci    CacheModelToEvent(configs);
776ea96550Sopenharmony_ci    SGLOGI("cache ModelConfig success");
786ea96550Sopenharmony_ci    return true;
796ea96550Sopenharmony_ci}
806ea96550Sopenharmony_ci
816ea96550Sopenharmony_cibool ModelConfig::Update()
826ea96550Sopenharmony_ci{
836ea96550Sopenharmony_ci    if (!stream_.is_open()) {
846ea96550Sopenharmony_ci        SGLOGE("stream error");
856ea96550Sopenharmony_ci        return false;
866ea96550Sopenharmony_ci    }
876ea96550Sopenharmony_ci    nlohmann::json jsonObj = nlohmann::json::parse(stream_, nullptr, false);
886ea96550Sopenharmony_ci    stream_.close();
896ea96550Sopenharmony_ci
906ea96550Sopenharmony_ci    if (jsonObj.is_discarded()) {
916ea96550Sopenharmony_ci        SGLOGI("json is discarded");
926ea96550Sopenharmony_ci        return false;
936ea96550Sopenharmony_ci    }
946ea96550Sopenharmony_ci
956ea96550Sopenharmony_ci    std::vector<ModelCfg> configs;
966ea96550Sopenharmony_ci    bool success = ParseModelConfig(configs, jsonObj);
976ea96550Sopenharmony_ci    if (!success) {
986ea96550Sopenharmony_ci        SGLOGE("parse EventConfig error");
996ea96550Sopenharmony_ci        return false;
1006ea96550Sopenharmony_ci    }
1016ea96550Sopenharmony_ci
1026ea96550Sopenharmony_ci    if (!SecurityGuardUtils::CopyFile(CONFIG_CACHE_FILES[MODEL_CFG_INDEX], CONFIG_UPTATE_FILES[MODEL_CFG_INDEX])) {
1036ea96550Sopenharmony_ci        SGLOGE("copyFile error");
1046ea96550Sopenharmony_ci        return false;
1056ea96550Sopenharmony_ci    }
1066ea96550Sopenharmony_ci    ConfigDataManager::GetInstance().ResetModelMap();
1076ea96550Sopenharmony_ci    CacheModelConfig(configs);
1086ea96550Sopenharmony_ci    CacheModelToEvent(configs);
1096ea96550Sopenharmony_ci    SGLOGI("cache ModelConfig success");
1106ea96550Sopenharmony_ci    return true;
1116ea96550Sopenharmony_ci}
1126ea96550Sopenharmony_ci
1136ea96550Sopenharmony_cibool ModelConfig::ParseModelConfig(std::vector<ModelCfg> &configs, nlohmann::json &jsonObj)
1146ea96550Sopenharmony_ci{
1156ea96550Sopenharmony_ci    return JsonCfg::Unmarshal<ModelCfg>(configs, jsonObj, MODEL_CFG_KEY);
1166ea96550Sopenharmony_ci};
1176ea96550Sopenharmony_ci
1186ea96550Sopenharmony_civoid ModelConfig::CacheModelConfig(const std::vector<ModelCfg> &configs)
1196ea96550Sopenharmony_ci{
1206ea96550Sopenharmony_ci    for (const ModelCfg &config : configs) {
1216ea96550Sopenharmony_ci        SGLOGD("modelId=%{public}u", config.modelId);
1226ea96550Sopenharmony_ci        ConfigDataManager::GetInstance().InsertModelMap(config.modelId, config);
1236ea96550Sopenharmony_ci    }
1246ea96550Sopenharmony_ci}
1256ea96550Sopenharmony_ci
1266ea96550Sopenharmony_civoid ModelConfig::CacheModelToEvent(const std::vector<ModelCfg> &configs)
1276ea96550Sopenharmony_ci{
1286ea96550Sopenharmony_ci    for (const ModelCfg &config : configs) {
1296ea96550Sopenharmony_ci        SGLOGD("modelId=%{public}u", config.modelId);
1306ea96550Sopenharmony_ci        std::set<int64_t> set;
1316ea96550Sopenharmony_ci        for (int64_t event : config.eventList) {
1326ea96550Sopenharmony_ci            set.emplace(event);
1336ea96550Sopenharmony_ci        }
1346ea96550Sopenharmony_ci        ConfigDataManager::GetInstance().InsertModelToEventMap(config.modelId, set);
1356ea96550Sopenharmony_ci    }
1366ea96550Sopenharmony_ci}
1376ea96550Sopenharmony_ci} // OHOS::Security::SecurityGuard