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 "native_implement_eventhandler.h"
17
18 #include <cstdint> // for int32_t, uint32_t
19 #include <memory> // for shared_ptr, operator!=
20
21 #include "event_runner.h"
22 #include "errors.h" // for ErrCode
23 #include "event_handler_errors.h" // for EVENT_HANDLER_ERR_NO_EVEN...
24 #include "event_queue.h" // for EventQueue
25 #include "file_descriptor_listener.h"
26
27 struct FileDescriptorCallbacks {
28 const FileFDCallback readableCallback_;
29 const FileFDCallback writableCallback_;
30 const FileFDCallback shutdownCallback_;
31 const FileFDCallback exceptionCallback_;
32 };
33
34 class NativeFileDescriptorListener : public OHOS::AppExecFwk::FileDescriptorListener {
35 public:
NativeFileDescriptorListener(const struct FileDescriptorCallbacks * fileDescriptorCallbacks)36 explicit NativeFileDescriptorListener(const struct FileDescriptorCallbacks *fileDescriptorCallbacks)
37 {
38 if (fileDescriptorCallbacks->readableCallback_ != nullptr) {
39 onReadableCallback_ = fileDescriptorCallbacks->readableCallback_;
40 }
41 if (fileDescriptorCallbacks->writableCallback_ != nullptr) {
42 onWritableCallback_ = fileDescriptorCallbacks->writableCallback_;
43 }
44 if (fileDescriptorCallbacks->shutdownCallback_ != nullptr) {
45 onShutdownCallback_ = fileDescriptorCallbacks->shutdownCallback_;
46 }
47 if (fileDescriptorCallbacks->exceptionCallback_ != nullptr) {
48 onExceptionCallback_ = fileDescriptorCallbacks->exceptionCallback_;
49 }
50 }
51
~NativeFileDescriptorListener()52 ~NativeFileDescriptorListener()
53 {}
54
55 /**
56 * Called while file descriptor is readable.
57 *
58 * @param fileDescriptor File descriptor which is readable.
59 */
OnReadable(int32_t filedescriptor)60 void OnReadable(int32_t filedescriptor)
61 {
62 if (onReadableCallback_ != nullptr) {
63 onReadableCallback_(filedescriptor);
64 }
65 }
66
67 /**
68 * Called while file descriptor is writable.
69 *
70 * @param fileDescriptor File descriptor which is writable.
71 */
OnWritable(int32_t filedescriptor)72 void OnWritable(int32_t filedescriptor)
73 {
74 if (onWritableCallback_ != nullptr) {
75 onWritableCallback_(filedescriptor);
76 }
77 }
78
79 /**
80 * Called while shutting down this file descriptor.
81 *
82 * @param fileDescriptor File descriptor which is shutting down.
83 */
OnShutdown(int32_t filedescriptor)84 void OnShutdown(int32_t filedescriptor)
85 {
86 if (onShutdownCallback_ != nullptr) {
87 onShutdownCallback_(filedescriptor);
88 }
89 }
90
91 /**
92 * Called while error happened on this file descriptor.
93 *
94 * @param fileDescriptor Error happened on this file descriptor.
95 */
OnException(int32_t filedescriptor)96 void OnException(int32_t filedescriptor)
97 {
98 if (onExceptionCallback_ != nullptr) {
99 onExceptionCallback_(filedescriptor);
100 }
101 }
102
103 NativeFileDescriptorListener(const NativeFileDescriptorListener &) = delete;
104 NativeFileDescriptorListener &operator=(const NativeFileDescriptorListener &) = delete;
105 NativeFileDescriptorListener(NativeFileDescriptorListener &&) = delete;
106 NativeFileDescriptorListener &operator=(NativeFileDescriptorListener &&) = delete;
107
108 private:
109 FileFDCallback onReadableCallback_ = nullptr;
110 FileFDCallback onWritableCallback_ = nullptr;
111 FileFDCallback onShutdownCallback_ = nullptr;
112 FileFDCallback onExceptionCallback_ = nullptr;
113 };
114
EventRunnerNativeImplement(bool current)115 EventRunnerNativeImplement::EventRunnerNativeImplement(bool current)
116 {
117 if (current) {
118 eventRunner_ = EventRunner::Current();
119 } else {
120 eventRunner_ = EventRunner::Create(false);
121 }
122 }
123
~EventRunnerNativeImplement()124 EventRunnerNativeImplement::~EventRunnerNativeImplement()
125 {
126 eventRunner_ = nullptr;
127 }
128
GetEventRunnerNativeObj()129 const EventRunnerNativeImplement *EventRunnerNativeImplement::GetEventRunnerNativeObj()
130 {
131 return new EventRunnerNativeImplement(true);
132 }
133
CreateEventRunnerNativeObj()134 const EventRunnerNativeImplement *EventRunnerNativeImplement::CreateEventRunnerNativeObj()
135 {
136 return new EventRunnerNativeImplement(false);
137 }
138
RunEventRunnerNativeObj() const139 ErrCode EventRunnerNativeImplement::RunEventRunnerNativeObj() const
140 {
141 if (eventRunner_ != nullptr) {
142 return eventRunner_->Run();
143 }
144 return OHOS::AppExecFwk::EVENT_HANDLER_ERR_NO_EVENT_RUNNER;
145 }
146
StopEventRunnerNativeObj() const147 ErrCode EventRunnerNativeImplement::StopEventRunnerNativeObj() const
148 {
149 if (eventRunner_ != nullptr) {
150 return eventRunner_->Stop();
151 }
152 return OHOS::AppExecFwk::EVENT_HANDLER_ERR_NO_EVENT_RUNNER;
153 }
154
AddFileDescriptorListener(int32_t fileDescriptor,uint32_t events,const FileDescriptorCallbacks * fdCallbacks) const155 ErrCode EventRunnerNativeImplement::AddFileDescriptorListener(
156 int32_t fileDescriptor, uint32_t events, const FileDescriptorCallbacks *fdCallbacks) const
157 {
158 auto nativeFileDescriptorListener = std::make_shared<NativeFileDescriptorListener>(fdCallbacks);
159 return eventRunner_->GetEventQueue()->AddFileDescriptorListener(
160 fileDescriptor, events, nativeFileDescriptorListener);
161 }
162
RemoveFileDescriptorListener(int32_t fileDescriptor) const163 void EventRunnerNativeImplement::RemoveFileDescriptorListener(int32_t fileDescriptor) const
164 {
165 eventRunner_->GetEventQueue()->RemoveFileDescriptorListener(fileDescriptor);
166 }