1 /*
2 * Copyright (c) 2022-2024 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 "dm_log.h"
17 #include "dm_timer.h"
18 #include "dm_constants.h"
19
20 namespace OHOS {
21 namespace DistributedHardware {
22 namespace {
23 const int32_t MIN_TIME_OUT = 0;
24 const int32_t MAX_TIME_OUT = 300;
25 const int32_t MILLISECOND_TO_SECOND = 1000;
26 }
27
CommonEventHandler(const std::shared_ptr<AppExecFwk::EventRunner> & runner)28 CommonEventHandler::CommonEventHandler(const std::shared_ptr<AppExecFwk::EventRunner> &runner)
29 : AppExecFwk::EventHandler(runner)
30 {
31 LOGI("CommonEventHandler constructor");
32 }
33
PostTask(const Callback & callback,const std::string & name,int64_t delayTime)34 bool CommonEventHandler::PostTask(const Callback &callback, const std::string &name, int64_t delayTime)
35 {
36 return AppExecFwk::EventHandler::PostTask(callback, name, delayTime);
37 }
38
RemoveTask(const std::string & name)39 void CommonEventHandler::RemoveTask(const std::string &name)
40 {
41 AppExecFwk::EventHandler::RemoveTask(name);
42 }
43
DmTimer()44 DmTimer::DmTimer()
45 {
46 LOGI("DmTimer constructor");
47 std::shared_ptr<AppExecFwk::EventRunner> runner = AppExecFwk::EventRunner::Create(true);
48 eventHandler_ = std::make_shared<CommonEventHandler>(runner);
49 }
50
~DmTimer()51 DmTimer::~DmTimer()
52 {
53 LOGI("DmTimer destructor");
54 DeleteAll();
55 }
56
StartTimer(std::string name,int32_t timeOut,TimerCallback callback)57 int32_t DmTimer::StartTimer(std::string name, int32_t timeOut, TimerCallback callback)
58 {
59 if (name.empty() || timeOut <= MIN_TIME_OUT || timeOut > MAX_TIME_OUT || callback == nullptr) {
60 LOGI("DmTimer StartTimer input value invalid");
61 return ERR_DM_INPUT_PARA_INVALID;
62 }
63 LOGI("DmTimer StartTimer start name: %{public}s", name.c_str());
64 std::lock_guard<std::mutex> locker(timerMutex_);
65 timerVec_.insert(name);
66
67 auto taskFunc = [callback, name] () { callback(name); };
68 if (eventHandler_ != nullptr) {
69 eventHandler_->PostTask(taskFunc, name, timeOut * MILLISECOND_TO_SECOND);
70 }
71 return DM_OK;
72 }
73
DeleteTimer(std::string timerName)74 int32_t DmTimer::DeleteTimer(std::string timerName)
75 {
76 if (timerName.empty()) {
77 LOGE("DmTimer DeleteTimer timer is null");
78 return ERR_DM_INPUT_PARA_INVALID;
79 }
80 LOGI("DmTimer DeleteTimer start name: %{public}s", timerName.c_str());
81 std::lock_guard<std::mutex> locker(timerMutex_);
82 if (timerVec_.empty() || timerVec_.find(timerName) == timerVec_.end()) {
83 LOGI("DmTimer DeleteTimer is not exist.");
84 return ERR_DM_FAILED;
85 }
86 timerVec_.erase(timerName);
87 if (eventHandler_ != nullptr) {
88 eventHandler_->RemoveTask(timerName);
89 }
90 return DM_OK;
91 }
92
DeleteAll()93 int32_t DmTimer::DeleteAll()
94 {
95 LOGI("DmTimer DeleteAll start");
96 std::lock_guard<std::mutex> locker(timerMutex_);
97 if (eventHandler_ == nullptr) {
98 LOGE("DmTimer eventHandler_ is null");
99 timerVec_.clear();
100 return ERR_DM_FAILED;
101 }
102 for (auto name : timerVec_) {
103 eventHandler_->RemoveTask(name);
104 }
105 timerVec_.clear();
106 return DM_OK;
107 }
108 }
109 }