1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "timer_call_back.h"
17 
18 #include "timer_notify_callback.h"
19 
20 namespace OHOS {
21 namespace MiscServices {
22 std::mutex TimerCallback::instanceLock_;
23 sptr<TimerCallback> TimerCallback::instance_;
24 
TimerCallback()25 TimerCallback::TimerCallback()
26 {
27 }
28 
~TimerCallback()29 TimerCallback::~TimerCallback()
30 {
31 }
32 
GetInstance()33 sptr<TimerCallback> TimerCallback::GetInstance()
34 {
35     if (instance_ == nullptr) {
36         std::lock_guard<std::mutex> autoLock(instanceLock_);
37         if (instance_ == nullptr) {
38             instance_ = new TimerCallback;
39         }
40     }
41     return instance_;
42 }
43 
InsertTimerCallbackInfo(uint64_t timerId,const std::shared_ptr<ITimerInfo> & timerInfo)44 bool TimerCallback::InsertTimerCallbackInfo(uint64_t timerId, const std::shared_ptr<ITimerInfo> &timerInfo)
45 {
46     TIME_HILOGD(TIME_MODULE_SERVICE, "start.");
47     if (timerInfo == nullptr) {
48         return false;
49     }
50 
51     std::lock_guard<std::mutex> lock(timerInfoMutex_);
52     auto info = timerInfoMap_.find(timerId);
53     if (info != timerInfoMap_.end()) {
54         TIME_HILOGE(TIME_MODULE_CLIENT, "timer info already insert.");
55         return false;
56     } else {
57         timerInfoMap_[timerId] = timerInfo;
58     }
59     TIME_HILOGD(TIME_MODULE_SERVICE, "end.");
60     return true;
61 }
62 
RemoveTimerCallbackInfo(uint64_t timerId)63 bool TimerCallback::RemoveTimerCallbackInfo(uint64_t timerId)
64 {
65     TIME_HILOGD(TIME_MODULE_SERVICE, "start.");
66     std::lock_guard<std::mutex> lock(timerInfoMutex_);
67     auto info = timerInfoMap_.find(timerId);
68     if (info != timerInfoMap_.end()) {
69         timerInfoMap_.erase(info);
70         TIME_HILOGD(TIME_MODULE_SERVICE, "end.");
71         return true;
72     }
73     TIME_HILOGD(TIME_MODULE_SERVICE, "end.");
74     return false;
75 }
76 
NotifyTimer(const uint64_t timerId,const sptr<IRemoteObject> & timerCallback)77 int32_t TimerCallback::NotifyTimer(const uint64_t timerId, const sptr<IRemoteObject> &timerCallback)
78 {
79     TIME_HILOGD(TIME_MODULE_SERVICE, "start.");
80     std::shared_ptr<ITimerInfo> timerInfo;
81     {
82         std::lock_guard<std::mutex> lock(timerInfoMutex_);
83         auto it = timerInfoMap_.find(timerId);
84         if (it != timerInfoMap_.end()) {
85             TIME_HILOGD(TIME_MODULE_SERVICE, "ontrigger.");
86             timerInfo = it->second;
87         }
88     }
89     if (timerInfo != nullptr) {
90         timerInfo->OnTrigger();
91     }
92     if (timerCallback == nullptr) {
93         return E_TIME_OK;
94     }
95     sptr<ITimerNotifyCallback> timerNotifyCallback = iface_cast<ITimerNotifyCallback>(timerCallback);
96     if (timerNotifyCallback == nullptr) {
97         TIME_HILOGE(TIME_MODULE_SERVICE, "timerNotifyCallback nullptr timerId:%{public}" PRId64 "", timerId);
98         return E_TIME_NULLPTR;
99     }
100     timerNotifyCallback->Finish(timerId);
101     TIME_HILOGD(TIME_MODULE_SERVICE, "end.");
102     return E_TIME_OK;
103 }
104 } // namespace MiscServices
105 } // namespace OHOS