2 * Copyright (c) 2019 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>
37 * Using Impl to hide away EFL specific members
39 struct FileDescriptorMonitor::Impl
42 Impl( int fileDescriptor, CallbackBase* callback, int eventsToMonitor)
43 : mFileDescriptor( fileDescriptor ),
44 mEventsToMonitor( eventsToMonitor ),
45 mCallback( callback ),
57 int mEventsToMonitor; ///< what file descriptor events to monitor
58 CallbackBase* mCallback;
59 Ecore_Fd_Handler* mHandler;
64 * Called when the file descriptor receives an event.
66 static Eina_Bool EventDispatch(void* data, Ecore_Fd_Handler *handler)
68 Impl* impl = reinterpret_cast<Impl*>(data);
70 // if we want read events, check to see if a read event is available
71 int type = FileDescriptorMonitor::FD_NO_EVENT;
73 if( ecore_main_fd_handler_active_get( handler, ECORE_FD_ERROR) )
75 CallbackBase::Execute( *impl->mCallback, FileDescriptorMonitor::FD_ERROR, impl->mFileDescriptor );
76 DALI_LOG_ERROR("ECORE_FD_ERROR occurred on %d\n", impl->mFileDescriptor);
78 return ECORE_CALLBACK_CANCEL;
81 if( impl->mEventsToMonitor & ECORE_FD_READ )
83 if (ecore_main_fd_handler_active_get( handler, ECORE_FD_READ))
85 type = FileDescriptorMonitor::FD_READABLE;
88 // check if we want write events
89 if( impl->mEventsToMonitor & ECORE_FD_WRITE )
91 if (ecore_main_fd_handler_active_get( handler, ECORE_FD_WRITE))
93 type |= FileDescriptorMonitor::FD_WRITABLE;
97 // if there is an event, execute the callback
98 if( type != FileDescriptorMonitor::FD_NO_EVENT )
100 CallbackBase::Execute( *impl->mCallback, static_cast< FileDescriptorMonitor::EventType >(type ), impl->mFileDescriptor );
103 return ECORE_CALLBACK_RENEW;
107 FileDescriptorMonitor::FileDescriptorMonitor( int fileDescriptor, CallbackBase* callback, int eventBitmask)
109 mImpl = new Impl(fileDescriptor, callback, eventBitmask);
111 if (fileDescriptor < 1)
113 DALI_ASSERT_ALWAYS( 0 && "Invalid File descriptor");
118 if( eventBitmask & FD_READABLE)
120 events = ECORE_FD_READ;
122 if( eventBitmask & FD_WRITABLE)
124 events |= ECORE_FD_WRITE;
126 mImpl->mEventsToMonitor = events;
127 mImpl->mHandler = ecore_main_fd_handler_add( fileDescriptor, static_cast<Ecore_Fd_Handler_Flags >( events ), &Impl::EventDispatch, mImpl, NULL, NULL );
131 FileDescriptorMonitor::~FileDescriptorMonitor()
135 ecore_main_fd_handler_del(mImpl->mHandler);
142 } // namespace Adaptor
144 } // namespace Internal