• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }