2 * Copyright (c) 2021 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <dali/internal/system/common/file-descriptor-monitor.h>
22 #include <dali/internal/system/linux/dali-ecore.h>
25 #include <dali/integration-api/debug.h>
34 * Using Impl to hide away EFL specific members
36 struct FileDescriptorMonitor::Impl
39 Impl(int fileDescriptor, CallbackBase* callback, int eventsToMonitor)
40 : mFileDescriptor(fileDescriptor),
41 mEventsToMonitor(eventsToMonitor),
54 int mEventsToMonitor; ///< what file descriptor events to monitor
55 CallbackBase* mCallback;
56 Ecore_Fd_Handler* mHandler;
61 * Called when the file descriptor receives an event.
63 static Eina_Bool EventDispatch(void* data, Ecore_Fd_Handler* handler)
65 Impl* impl = reinterpret_cast<Impl*>(data);
67 // if we want read events, check to see if a read event is available
68 int type = FileDescriptorMonitor::FD_NO_EVENT;
70 if(ecore_main_fd_handler_active_get(handler, ECORE_FD_ERROR))
72 CallbackBase::Execute(*impl->mCallback, FileDescriptorMonitor::FD_ERROR, impl->mFileDescriptor);
73 DALI_LOG_ERROR("ECORE_FD_ERROR occurred on %d\n", impl->mFileDescriptor);
75 return ECORE_CALLBACK_CANCEL;
78 if(impl->mEventsToMonitor & ECORE_FD_READ)
80 if(ecore_main_fd_handler_active_get(handler, ECORE_FD_READ))
82 type = FileDescriptorMonitor::FD_READABLE;
85 // check if we want write events
86 if(impl->mEventsToMonitor & ECORE_FD_WRITE)
88 if(ecore_main_fd_handler_active_get(handler, ECORE_FD_WRITE))
90 type |= FileDescriptorMonitor::FD_WRITABLE;
94 // if there is an event, execute the callback
95 if(type != FileDescriptorMonitor::FD_NO_EVENT)
97 CallbackBase::Execute(*impl->mCallback, static_cast<FileDescriptorMonitor::EventType>(type), impl->mFileDescriptor);
100 return ECORE_CALLBACK_RENEW;
104 FileDescriptorMonitor::FileDescriptorMonitor(int fileDescriptor, CallbackBase* callback, int eventBitmask)
106 mImpl = new Impl(fileDescriptor, callback, eventBitmask);
108 if(fileDescriptor < 1)
110 DALI_ASSERT_ALWAYS(0 && "Invalid File descriptor");
115 if(eventBitmask & FD_READABLE)
117 events = ECORE_FD_READ;
119 if(eventBitmask & FD_WRITABLE)
121 events |= ECORE_FD_WRITE;
123 mImpl->mEventsToMonitor = events;
124 mImpl->mHandler = ecore_main_fd_handler_add(fileDescriptor, static_cast<Ecore_Fd_Handler_Flags>(events), &Impl::EventDispatch, mImpl, NULL, NULL);
127 FileDescriptorMonitor::~FileDescriptorMonitor()
131 ecore_main_fd_handler_del(mImpl->mHandler);
138 } // namespace Adaptor
140 } // namespace Internal