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
25 std::map<uint64_t, std::shared_ptr<ITimerInfo>> TimerCallback::timerInfoMap_;
26 std::mutex TimerCallback::timerInfoMutex_;
27
TimerCallback()28 TimerCallback::TimerCallback()
29 {
30 }
31
~TimerCallback()32 TimerCallback::~TimerCallback()
33 {
34 timerInfoMap_.clear();
35 }
36
GetInstance()37 sptr<TimerCallback> TimerCallback::GetInstance()
38 {
39 if (instance_ == nullptr) {
40 std::lock_guard<std::mutex> autoLock(instanceLock_);
41 if (instance_ == nullptr) {
42 instance_ = new TimerCallback;
43 }
44 }
45 return instance_;
46 }
47
InsertTimerCallbackInfo(const uint64_t timerId,const std::shared_ptr<ITimerInfo> & timerInfo)48 bool TimerCallback::InsertTimerCallbackInfo(const uint64_t timerId, const std::shared_ptr<ITimerInfo> &timerInfo)
49 {
50 TIME_HILOGD(TIME_MODULE_SERVICE, "start.");
51 if (timerInfo == nullptr) {
52 return false;
53 }
54
55 std::lock_guard<std::mutex> lock(timerInfoMutex_);
56 auto info = timerInfoMap_.find(timerId);
57 if (info != timerInfoMap_.end()) {
58 TIME_HILOGE(TIME_MODULE_CLIENT, "timer info already insert.");
59 return false;
60 } else {
61 timerInfoMap_[timerId] = timerInfo;
62 }
63 TIME_HILOGD(TIME_MODULE_SERVICE, "end.");
64 return true;
65 }
66
RemoveTimerCallbackInfo(const uint64_t timerId)67 bool TimerCallback::RemoveTimerCallbackInfo(const uint64_t timerId)
68 {
69 TIME_HILOGD(TIME_MODULE_SERVICE, "start.");
70 std::lock_guard<std::mutex> lock(timerInfoMutex_);
71 auto info = timerInfoMap_.find(timerId);
72 if (info != timerInfoMap_.end()) {
73 timerInfoMap_.erase(info);
74 TIME_HILOGD(TIME_MODULE_SERVICE, "end.");
75 return true;
76 }
77 TIME_HILOGD(TIME_MODULE_SERVICE, "end.");
78 return false;
79 }
80
NotifyTimer(const uint64_t timerId,const sptr<IRemoteObject> & timerCallback)81 void TimerCallback::NotifyTimer(const uint64_t timerId, const sptr<IRemoteObject> &timerCallback)
82 {
83 TIME_HILOGD(TIME_MODULE_SERVICE, "start.");
84 std::shared_ptr<ITimerInfo> timerInfo;
85 {
86 std::lock_guard<std::mutex> lock(timerInfoMutex_);
87 auto it = timerInfoMap_.find(timerId);
88 if (it != timerInfoMap_.end()) {
89 TIME_HILOGD(TIME_MODULE_SERVICE, "ontrigger.");
90 timerInfo = it->second;
91 }
92 }
93 if (timerInfo != nullptr) {
94 timerInfo->OnTrigger();
95 }
96 if (timerCallback == nullptr) {
97 TIME_HILOGE(TIME_MODULE_SERVICE, "timerCallback nullptr timerId:%{public}" PRId64 "", timerId);
98 return;
99 }
100 sptr<ITimerNotifyCallback> timerNotifyCallback = iface_cast<ITimerNotifyCallback>(timerCallback);
101 if (timerNotifyCallback == nullptr) {
102 TIME_HILOGE(TIME_MODULE_SERVICE, "timerNotifyCallback nullptr timerId:%{public}" PRId64 "", timerId);
103 return;
104 }
105 timerNotifyCallback->Finish(timerId);
106 TIME_HILOGD(TIME_MODULE_SERVICE, "end.");
107 }
108 } // namespace MiscServices
109 } // namespace OHOS