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 }