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