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