1 /*
2 * Copyright (c) 2021-2022 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 "event_manager.h"
17
18 #include "netstack_log.h"
19 #include <algorithm>
20
21 namespace OHOS::NetStack {
22 static constexpr const int CALLBACK_PARAM_NUM = 1;
23
24 static constexpr const int ASYNC_CALLBACK_PARAM_NUM = 2;
25
EventManager()26 EventManager::EventManager() : data_(nullptr), isValid_(true) {}
27
~EventManager()28 EventManager::~EventManager()
29 {
30 NETSTACK_LOGI("EventManager is destructed by the destructor");
31 }
32
IsManagerValid() const33 bool EventManager::IsManagerValid() const
34 {
35 return isValid_;
36 }
37
SetInvalid()38 void EventManager::SetInvalid()
39 {
40 isValid_ = false;
41 }
42
AddListener(napi_env env,const std::string & type,napi_value callback,bool once,bool asyncCallback)43 void EventManager::AddListener(napi_env env, const std::string &type, napi_value callback, bool once,
44 bool asyncCallback)
45 {
46 auto it = std::remove_if(listeners_.begin(), listeners_.end(),
47 [type](const EventListener &listener) -> bool { return listener.MatchType(type); });
48 if (it != listeners_.end()) {
49 listeners_.erase(it, listeners_.end());
50 }
51
52 listeners_.emplace_back(EventListener(env, type, callback, once, asyncCallback));
53 }
54
DeleteListener(const std::string & type,napi_value callback)55 void EventManager::DeleteListener(const std::string &type, napi_value callback)
56 {
57 auto it =
58 std::remove_if(listeners_.begin(), listeners_.end(), [type, callback](const EventListener &listener) -> bool {
59 return listener.Match(type, callback);
60 });
61 listeners_.erase(it, listeners_.end());
62 }
63
Emit(const std::string & type,const std::pair<napi_value,napi_value> & argv)64 void EventManager::Emit(const std::string &type, const std::pair<napi_value, napi_value> &argv)
65 {
66 std::for_each(listeners_.begin(), listeners_.end(), [type, argv](const EventListener &listener) {
67 if (listener.IsAsyncCallback()) {
68 /* AsyncCallback(BusinessError error, T data) */
69 napi_value arg[ASYNC_CALLBACK_PARAM_NUM] = {argv.first, argv.second};
70 listener.Emit(type, ASYNC_CALLBACK_PARAM_NUM, arg);
71 } else {
72 /* Callback(T data) */
73 napi_value arg[CALLBACK_PARAM_NUM] = {argv.second};
74 listener.Emit(type, CALLBACK_PARAM_NUM, arg);
75 }
76 });
77
78 auto it = std::remove_if(listeners_.begin(), listeners_.end(),
79 [type](const EventListener &listener) -> bool { return listener.MatchOnce(type); });
80 listeners_.erase(it, listeners_.end());
81 }
82
SetData(void * data)83 void EventManager::SetData(void *data)
84 {
85 std::lock_guard<std::mutex> lock(mutex_);
86 data_ = data;
87 }
88
GetData()89 void *EventManager::GetData()
90 {
91 std::lock_guard<std::mutex> lock(mutex_);
92 return data_;
93 }
94
EmitByUv(const std::string & type,void * data,void (Handler)(uv_work_t *,int status))95 void EventManager::EmitByUv(const std::string &type, void *data, void(Handler)(uv_work_t *, int status))
96 {
97 if (!IsManagerValid()) {
98 return;
99 }
100
101 std::for_each(listeners_.begin(), listeners_.end(), [type, data, Handler, this](const EventListener &listener) {
102 auto workWrapper = new UvWorkWrapper(data, listener.GetEnv(), type, this);
103 listener.EmitByUv(type, workWrapper, Handler);
104 });
105 }
106
HasEventListener(const std::string & type)107 bool EventManager::HasEventListener(const std::string &type)
108 {
109 return std::any_of(listeners_.begin(), listeners_.end(),
110 [&type](const EventListener &listener) -> bool { return listener.MatchType(type); });
111 }
112
DeleteListener(const std::string & type)113 void EventManager::DeleteListener(const std::string &type)
114 {
115 auto it = std::remove_if(listeners_.begin(), listeners_.end(),
116 [type](const EventListener &listener) -> bool { return listener.MatchType(type); });
117 listeners_.erase(it, listeners_.end());
118 }
119
UvWorkWrapper(void * theData,napi_env theEnv,std::string eventType,EventManager * eventManager)120 UvWorkWrapper::UvWorkWrapper(void *theData, napi_env theEnv, std::string eventType, EventManager *eventManager)
121 : data(theData), env(theEnv), type(std::move(eventType)), manager(eventManager)
122 {
123 }
124 } // namespace OHOS::NetStack
125