1020a203aSopenharmony_ci/* 2020a203aSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 3020a203aSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4020a203aSopenharmony_ci * you may not use this file except in compliance with the License. 5020a203aSopenharmony_ci * You may obtain a copy of the License at 6020a203aSopenharmony_ci * 7020a203aSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8020a203aSopenharmony_ci * 9020a203aSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10020a203aSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11020a203aSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12020a203aSopenharmony_ci * See the License for the specific language governing permissions and 13020a203aSopenharmony_ci * limitations under the License. 14020a203aSopenharmony_ci */ 15020a203aSopenharmony_ci 16020a203aSopenharmony_ci#include "AppTimerAdapter.h" 17020a203aSopenharmony_ci 18020a203aSopenharmony_cinamespace OHOS { 19020a203aSopenharmony_cinamespace HiviewDFX { 20020a203aSopenharmony_ciAppTimerAdapter::AppTimerAdapter(int userId, ISceneTimerInfrastructure* infra) : userId(userId) 21020a203aSopenharmony_ci{ 22020a203aSopenharmony_ci this->impl = infra; 23020a203aSopenharmony_ci impl->RegUser(userId, this); 24020a203aSopenharmony_ci} 25020a203aSopenharmony_ci 26020a203aSopenharmony_ciAppTimerAdapter::~AppTimerAdapter() 27020a203aSopenharmony_ci{ 28020a203aSopenharmony_ci impl->UnRegUser(userId); 29020a203aSopenharmony_ci} 30020a203aSopenharmony_ci 31020a203aSopenharmony_civoid AppTimerAdapter::Start(std::string key) 32020a203aSopenharmony_ci{ 33020a203aSopenharmony_ci std::lock_guard<std::mutex> uniqueLock(mut); 34020a203aSopenharmony_ci int id = AssignId(key); 35020a203aSopenharmony_ci ValidateDuplication(id); 36020a203aSopenharmony_ci impl->Start(userId, id, timeoutPeriod); 37020a203aSopenharmony_ci sessions.push_back(id); 38020a203aSopenharmony_ci} 39020a203aSopenharmony_ci 40020a203aSopenharmony_civoid AppTimerAdapter::Stop(std::string key) 41020a203aSopenharmony_ci{ 42020a203aSopenharmony_ci std::lock_guard<std::mutex> uniqueLock(mut); 43020a203aSopenharmony_ci int id = KeyToId(key); 44020a203aSopenharmony_ci ValidateExistence(id); 45020a203aSopenharmony_ci impl->Stop(userId, id); 46020a203aSopenharmony_ci sessions.erase(std::find(sessions.begin(), sessions.end(), id)); 47020a203aSopenharmony_ci RecycleId(id); 48020a203aSopenharmony_ci} 49020a203aSopenharmony_ci 50020a203aSopenharmony_civoid AppTimerAdapter::Expired(int id) 51020a203aSopenharmony_ci{ 52020a203aSopenharmony_ci std::lock_guard<std::mutex> uniqueLock(mut); 53020a203aSopenharmony_ci std::string key = IdToKey(id); 54020a203aSopenharmony_ci if (!key.empty()) { 55020a203aSopenharmony_ci cb->Expired(key); 56020a203aSopenharmony_ci } 57020a203aSopenharmony_ci sessions.erase(std::find(sessions.begin(), sessions.end(), id)); 58020a203aSopenharmony_ci RecycleId(id); 59020a203aSopenharmony_ci} 60020a203aSopenharmony_ci 61020a203aSopenharmony_civoid AppTimerAdapter::SetCb(IAppTimer::ICb* cb) 62020a203aSopenharmony_ci{ 63020a203aSopenharmony_ci this->cb = cb; 64020a203aSopenharmony_ci} 65020a203aSopenharmony_ci 66020a203aSopenharmony_civoid AppTimerAdapter::ValidateDuplication(const int id) 67020a203aSopenharmony_ci{ 68020a203aSopenharmony_ci if (std::find(sessions.begin(), sessions.end(), id) != sessions.end()) { 69020a203aSopenharmony_ci throw std::invalid_argument("duplicated id"); 70020a203aSopenharmony_ci } 71020a203aSopenharmony_ci} 72020a203aSopenharmony_ci 73020a203aSopenharmony_civoid AppTimerAdapter::ValidateExistence(const int id) 74020a203aSopenharmony_ci{ 75020a203aSopenharmony_ci if (std::find(sessions.begin(), sessions.end(), id) == sessions.end()) { 76020a203aSopenharmony_ci throw std::invalid_argument("non-existing id"); 77020a203aSopenharmony_ci } 78020a203aSopenharmony_ci} 79020a203aSopenharmony_ci 80020a203aSopenharmony_ci 81020a203aSopenharmony_ciint AppTimerAdapter::AssignId(const std::string& key) 82020a203aSopenharmony_ci{ 83020a203aSopenharmony_ci if (ids.empty()) { 84020a203aSopenharmony_ci throw std::invalid_argument("container ids is empty"); 85020a203aSopenharmony_ci } 86020a203aSopenharmony_ci ValidateExistKey(key); 87020a203aSopenharmony_ci int id = ids.back(); 88020a203aSopenharmony_ci ids.pop_back(); 89020a203aSopenharmony_ci idToBundle[id] = key; 90020a203aSopenharmony_ci bundleToId[key] = id; 91020a203aSopenharmony_ci return id; 92020a203aSopenharmony_ci} 93020a203aSopenharmony_ci 94020a203aSopenharmony_civoid AppTimerAdapter::RecycleId(const int id) 95020a203aSopenharmony_ci{ 96020a203aSopenharmony_ci std::string bundle = idToBundle[id]; 97020a203aSopenharmony_ci bundleToId.erase(bundle); 98020a203aSopenharmony_ci idToBundle.erase(id); 99020a203aSopenharmony_ci ids.push_back(id); 100020a203aSopenharmony_ci} 101020a203aSopenharmony_ci 102020a203aSopenharmony_cistd::string AppTimerAdapter::IdToKey(const int id) 103020a203aSopenharmony_ci{ 104020a203aSopenharmony_ci if (idToBundle.find(id) != idToBundle.end()) { 105020a203aSopenharmony_ci return idToBundle[id]; 106020a203aSopenharmony_ci } 107020a203aSopenharmony_ci return ""; 108020a203aSopenharmony_ci} 109020a203aSopenharmony_ci 110020a203aSopenharmony_ciint AppTimerAdapter::KeyToId(const std::string& key) 111020a203aSopenharmony_ci{ 112020a203aSopenharmony_ci if (bundleToId.find(key) != bundleToId.end()) { 113020a203aSopenharmony_ci return bundleToId[key]; 114020a203aSopenharmony_ci } 115020a203aSopenharmony_ci return -1; 116020a203aSopenharmony_ci} 117020a203aSopenharmony_ci 118020a203aSopenharmony_civoid AppTimerAdapter::ValidateExistKey(const std::string& key) 119020a203aSopenharmony_ci{ 120020a203aSopenharmony_ci if (bundleToId.find(key) != bundleToId.end()) { 121020a203aSopenharmony_ci throw std::invalid_argument("bundleToId key exist duplicated this record"); 122020a203aSopenharmony_ci } 123020a203aSopenharmony_ci} 124020a203aSopenharmony_ci} // HiviewDFX 125020a203aSopenharmony_ci} // OHOS