122736c2fSopenharmony_ci/* 222736c2fSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 322736c2fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 422736c2fSopenharmony_ci * you may not use this file except in compliance with the License. 522736c2fSopenharmony_ci * You may obtain a copy of the License at 622736c2fSopenharmony_ci * 722736c2fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 822736c2fSopenharmony_ci * 922736c2fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1022736c2fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1122736c2fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1222736c2fSopenharmony_ci * See the License for the specific language governing permissions and 1322736c2fSopenharmony_ci * limitations under the License. 1422736c2fSopenharmony_ci */ 1522736c2fSopenharmony_ci 1622736c2fSopenharmony_ci#include "full_ime_info_manager.h" 1722736c2fSopenharmony_ci 1822736c2fSopenharmony_ci#include <algorithm> 1922736c2fSopenharmony_ci 2022736c2fSopenharmony_ci#include "common_timer_errors.h" 2122736c2fSopenharmony_ci#include "ime_info_inquirer.h" 2222736c2fSopenharmony_cinamespace OHOS { 2322736c2fSopenharmony_cinamespace MiscServices { 2422736c2fSopenharmony_ciconstexpr uint32_t TIMER_TASK_INTERNAL = 3600000; // updated hourly 2522736c2fSopenharmony_ciFullImeInfoManager::~FullImeInfoManager() 2622736c2fSopenharmony_ci{ 2722736c2fSopenharmony_ci timer_.Unregister(timerId_); 2822736c2fSopenharmony_ci timer_.Shutdown(false); 2922736c2fSopenharmony_ci fullImeInfos_.clear(); 3022736c2fSopenharmony_ci} 3122736c2fSopenharmony_ci 3222736c2fSopenharmony_ciFullImeInfoManager::FullImeInfoManager() 3322736c2fSopenharmony_ci{ 3422736c2fSopenharmony_ci uint32_t ret = timer_.Setup(); 3522736c2fSopenharmony_ci if (ret != Utils::TIMER_ERR_OK) { 3622736c2fSopenharmony_ci IMSA_HILOGE("failed to create timer!"); 3722736c2fSopenharmony_ci return; 3822736c2fSopenharmony_ci } 3922736c2fSopenharmony_ci timerId_ = timer_.Register([this]() { Init(); }, TIMER_TASK_INTERNAL, false); 4022736c2fSopenharmony_ci} 4122736c2fSopenharmony_ci 4222736c2fSopenharmony_ciFullImeInfoManager &FullImeInfoManager::GetInstance() 4322736c2fSopenharmony_ci{ 4422736c2fSopenharmony_ci static FullImeInfoManager instance; 4522736c2fSopenharmony_ci return instance; 4622736c2fSopenharmony_ci} 4722736c2fSopenharmony_ci 4822736c2fSopenharmony_ciint32_t FullImeInfoManager::Init() 4922736c2fSopenharmony_ci{ 5022736c2fSopenharmony_ci std::vector<std::pair<int32_t, std::vector<FullImeInfo>>> fullImeInfos; 5122736c2fSopenharmony_ci auto ret = ImeInfoInquirer::GetInstance().QueryFullImeInfo(fullImeInfos); 5222736c2fSopenharmony_ci if (ret != ErrorCode::NO_ERROR) { 5322736c2fSopenharmony_ci IMSA_HILOGW("failed to QueryFullImeInfo, ret:%{public}d", ret); 5422736c2fSopenharmony_ci return ret; 5522736c2fSopenharmony_ci } 5622736c2fSopenharmony_ci std::lock_guard<std::mutex> lock(lock_); 5722736c2fSopenharmony_ci fullImeInfos_.clear(); 5822736c2fSopenharmony_ci for (const auto &infos : fullImeInfos) { 5922736c2fSopenharmony_ci fullImeInfos_.insert_or_assign(infos.first, infos.second); 6022736c2fSopenharmony_ci } 6122736c2fSopenharmony_ci return ErrorCode::NO_ERROR; 6222736c2fSopenharmony_ci} 6322736c2fSopenharmony_ci 6422736c2fSopenharmony_ciint32_t FullImeInfoManager::Add(int32_t userId) 6522736c2fSopenharmony_ci{ 6622736c2fSopenharmony_ci { 6722736c2fSopenharmony_ci std::lock_guard<std::mutex> lock(lock_); 6822736c2fSopenharmony_ci auto it = fullImeInfos_.find(userId); 6922736c2fSopenharmony_ci if (it != fullImeInfos_.end()) { 7022736c2fSopenharmony_ci return ErrorCode::NO_ERROR; 7122736c2fSopenharmony_ci } 7222736c2fSopenharmony_ci } 7322736c2fSopenharmony_ci std::vector<FullImeInfo> infos; 7422736c2fSopenharmony_ci auto ret = ImeInfoInquirer::GetInstance().QueryFullImeInfo(userId, infos); 7522736c2fSopenharmony_ci if (ret != ErrorCode::NO_ERROR) { 7622736c2fSopenharmony_ci IMSA_HILOGE("failed to QueryFullImeInfo, userId:%{public}d, ret:%{public}d", userId, ret); 7722736c2fSopenharmony_ci return ret; 7822736c2fSopenharmony_ci } 7922736c2fSopenharmony_ci std::lock_guard<std::mutex> lock(lock_); 8022736c2fSopenharmony_ci fullImeInfos_.insert_or_assign(userId, infos); 8122736c2fSopenharmony_ci return ErrorCode::NO_ERROR; 8222736c2fSopenharmony_ci} 8322736c2fSopenharmony_ci 8422736c2fSopenharmony_ciint32_t FullImeInfoManager::Update() 8522736c2fSopenharmony_ci{ 8622736c2fSopenharmony_ci auto ret = Init(); 8722736c2fSopenharmony_ci if (ret != ErrorCode::NO_ERROR) { 8822736c2fSopenharmony_ci std::lock_guard<std::mutex> lock(lock_); 8922736c2fSopenharmony_ci fullImeInfos_.clear(); 9022736c2fSopenharmony_ci } 9122736c2fSopenharmony_ci return ErrorCode::NO_ERROR; 9222736c2fSopenharmony_ci} 9322736c2fSopenharmony_ci 9422736c2fSopenharmony_ciint32_t FullImeInfoManager::Delete(int32_t userId) 9522736c2fSopenharmony_ci{ 9622736c2fSopenharmony_ci std::lock_guard<std::mutex> lock(lock_); 9722736c2fSopenharmony_ci fullImeInfos_.erase(userId); 9822736c2fSopenharmony_ci return ErrorCode::NO_ERROR; 9922736c2fSopenharmony_ci} 10022736c2fSopenharmony_ci 10122736c2fSopenharmony_ciint32_t FullImeInfoManager::Add(int32_t userId, const std::string &bundleName) 10222736c2fSopenharmony_ci{ 10322736c2fSopenharmony_ci FullImeInfo info; 10422736c2fSopenharmony_ci auto ret = ImeInfoInquirer::GetInstance().GetFullImeInfo(userId, bundleName, info); 10522736c2fSopenharmony_ci if (ret != ErrorCode::NO_ERROR) { 10622736c2fSopenharmony_ci IMSA_HILOGE("failed to GetFullImeInfo, userId:%{public}d, bundleName:%{public}s, ret:%{public}d", userId, 10722736c2fSopenharmony_ci bundleName.c_str(), ret); 10822736c2fSopenharmony_ci return ret; 10922736c2fSopenharmony_ci } 11022736c2fSopenharmony_ci std::lock_guard<std::mutex> lock(lock_); 11122736c2fSopenharmony_ci auto it = fullImeInfos_.find(userId); 11222736c2fSopenharmony_ci if (it == fullImeInfos_.end()) { 11322736c2fSopenharmony_ci fullImeInfos_.insert({ userId, { info } }); 11422736c2fSopenharmony_ci return ErrorCode::NO_ERROR; 11522736c2fSopenharmony_ci } 11622736c2fSopenharmony_ci auto iter = std::find_if(it->second.begin(), it->second.end(), 11722736c2fSopenharmony_ci [&bundleName](const FullImeInfo &info) { return bundleName == info.prop.name; }); 11822736c2fSopenharmony_ci if (iter != it->second.end()) { 11922736c2fSopenharmony_ci return ErrorCode::NO_ERROR; 12022736c2fSopenharmony_ci } 12122736c2fSopenharmony_ci it->second.push_back(info); 12222736c2fSopenharmony_ci return ErrorCode::NO_ERROR; 12322736c2fSopenharmony_ci} 12422736c2fSopenharmony_ci 12522736c2fSopenharmony_ciint32_t FullImeInfoManager::Delete(int32_t userId, const std::string &bundleName) 12622736c2fSopenharmony_ci{ 12722736c2fSopenharmony_ci std::lock_guard<std::mutex> lock(lock_); 12822736c2fSopenharmony_ci auto it = fullImeInfos_.find(userId); 12922736c2fSopenharmony_ci if (it == fullImeInfos_.end()) { 13022736c2fSopenharmony_ci return ErrorCode::NO_ERROR; 13122736c2fSopenharmony_ci } 13222736c2fSopenharmony_ci auto iter = std::find_if(it->second.begin(), it->second.end(), 13322736c2fSopenharmony_ci [&bundleName](const FullImeInfo &info) { return bundleName == info.prop.name; }); 13422736c2fSopenharmony_ci if (iter == it->second.end()) { 13522736c2fSopenharmony_ci return ErrorCode::NO_ERROR; 13622736c2fSopenharmony_ci } 13722736c2fSopenharmony_ci it->second.erase(iter); 13822736c2fSopenharmony_ci if (it->second.empty()) { 13922736c2fSopenharmony_ci fullImeInfos_.erase(it->first); 14022736c2fSopenharmony_ci } 14122736c2fSopenharmony_ci return ErrorCode::NO_ERROR; 14222736c2fSopenharmony_ci} 14322736c2fSopenharmony_ci 14422736c2fSopenharmony_ciint32_t FullImeInfoManager::Update(int32_t userId, const std::string &bundleName) 14522736c2fSopenharmony_ci{ 14622736c2fSopenharmony_ci FullImeInfo info; 14722736c2fSopenharmony_ci auto ret = ImeInfoInquirer::GetInstance().GetFullImeInfo(userId, bundleName, info); 14822736c2fSopenharmony_ci if (ret != ErrorCode::NO_ERROR) { 14922736c2fSopenharmony_ci IMSA_HILOGE("failed to GetFullImeInfo failed, userId:%{public}d, bundleName:%{public}s, ret:%{public}d", 15022736c2fSopenharmony_ci userId, bundleName.c_str(), ret); 15122736c2fSopenharmony_ci return ErrorCode::ERROR_PACKAGE_MANAGER; 15222736c2fSopenharmony_ci } 15322736c2fSopenharmony_ci std::lock_guard<std::mutex> lock(lock_); 15422736c2fSopenharmony_ci auto it = fullImeInfos_.find(userId); 15522736c2fSopenharmony_ci if (it == fullImeInfos_.end()) { 15622736c2fSopenharmony_ci fullImeInfos_.insert({ userId, { info } }); 15722736c2fSopenharmony_ci return ErrorCode::NO_ERROR; 15822736c2fSopenharmony_ci } 15922736c2fSopenharmony_ci auto iter = std::find_if(it->second.begin(), it->second.end(), 16022736c2fSopenharmony_ci [&bundleName](const FullImeInfo &info) { return bundleName == info.prop.name; }); 16122736c2fSopenharmony_ci if (iter != it->second.end()) { 16222736c2fSopenharmony_ci it->second.erase(iter); 16322736c2fSopenharmony_ci } 16422736c2fSopenharmony_ci it->second.push_back(info); 16522736c2fSopenharmony_ci return ErrorCode::NO_ERROR; 16622736c2fSopenharmony_ci} 16722736c2fSopenharmony_ci 16822736c2fSopenharmony_cistd::vector<FullImeInfo> FullImeInfoManager::Get(int32_t userId) 16922736c2fSopenharmony_ci{ 17022736c2fSopenharmony_ci std::lock_guard<std::mutex> lock(lock_); 17122736c2fSopenharmony_ci auto it = fullImeInfos_.find(userId); 17222736c2fSopenharmony_ci if (it == fullImeInfos_.end()) { 17322736c2fSopenharmony_ci return {}; 17422736c2fSopenharmony_ci } 17522736c2fSopenharmony_ci return it->second; 17622736c2fSopenharmony_ci} 17722736c2fSopenharmony_ci 17822736c2fSopenharmony_cibool FullImeInfoManager::Get(const std::string &bundleName, int32_t userId, FullImeInfo &fullImeInfo) 17922736c2fSopenharmony_ci{ 18022736c2fSopenharmony_ci std::lock_guard<std::mutex> lock(lock_); 18122736c2fSopenharmony_ci auto it = fullImeInfos_.find(userId); 18222736c2fSopenharmony_ci if (it == fullImeInfos_.end()) { 18322736c2fSopenharmony_ci IMSA_HILOGD("user %{public}d info", userId); 18422736c2fSopenharmony_ci return false; 18522736c2fSopenharmony_ci } 18622736c2fSopenharmony_ci auto iter = std::find_if(it->second.begin(), it->second.end(), 18722736c2fSopenharmony_ci [&bundleName](const FullImeInfo &info) { return bundleName == info.prop.name; }); 18822736c2fSopenharmony_ci if (iter == it->second.end()) { 18922736c2fSopenharmony_ci IMSA_HILOGD("ime: %{public}s not in cache", bundleName.c_str()); 19022736c2fSopenharmony_ci return false; 19122736c2fSopenharmony_ci } 19222736c2fSopenharmony_ci fullImeInfo = *iter; 19322736c2fSopenharmony_ci return true; 19422736c2fSopenharmony_ci} 19522736c2fSopenharmony_ci 19622736c2fSopenharmony_cibool FullImeInfoManager::Has(int32_t userId, const std::string &bundleName) 19722736c2fSopenharmony_ci{ 19822736c2fSopenharmony_ci std::lock_guard<std::mutex> lock(lock_); 19922736c2fSopenharmony_ci auto it = fullImeInfos_.find(userId); 20022736c2fSopenharmony_ci if (it == fullImeInfos_.end()) { 20122736c2fSopenharmony_ci return false; 20222736c2fSopenharmony_ci } 20322736c2fSopenharmony_ci auto iter = std::find_if(it->second.begin(), it->second.end(), 20422736c2fSopenharmony_ci [&bundleName](const FullImeInfo &info) { return bundleName == info.prop.name; }); 20522736c2fSopenharmony_ci return iter != it->second.end(); 20622736c2fSopenharmony_ci} 20722736c2fSopenharmony_ci 20822736c2fSopenharmony_cistd::string FullImeInfoManager::Get(int32_t userId, uint32_t tokenId) 20922736c2fSopenharmony_ci{ 21022736c2fSopenharmony_ci std::lock_guard<std::mutex> lock(lock_); 21122736c2fSopenharmony_ci auto it = fullImeInfos_.find(userId); 21222736c2fSopenharmony_ci if (it == fullImeInfos_.end()) { 21322736c2fSopenharmony_ci return ""; 21422736c2fSopenharmony_ci } 21522736c2fSopenharmony_ci auto iter = std::find_if( 21622736c2fSopenharmony_ci it->second.begin(), it->second.end(), [&tokenId](const FullImeInfo &info) { return tokenId == info.tokenId; }); 21722736c2fSopenharmony_ci if (iter == it->second.end()) { 21822736c2fSopenharmony_ci return ""; 21922736c2fSopenharmony_ci } 22022736c2fSopenharmony_ci return (*iter).prop.name; 22122736c2fSopenharmony_ci} 22222736c2fSopenharmony_ci} // namespace MiscServices 22322736c2fSopenharmony_ci} // namespace OHOS