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