13template <
typename T,
typename... Args>
14std::unique_ptr<T> our_make_unique(Args&&... args)
16 return std::unique_ptr<T>(
new T(std::forward<Args>(args)...));
39 : m_base(base), m_watch(watch)
41 const unsigned int flags = dbus_watch_get_flags(watch);
42 short monitoredEvents = EV_PERSIST;
44 if (flags & DBUS_WATCH_READABLE) { monitoredEvents |= EV_READ; }
45 if (flags & DBUS_WATCH_WRITABLE) { monitoredEvents |= EV_WRITE; }
47 const int fd = dbus_watch_get_unix_fd(watch);
48 m_event.reset(event_new(m_base, fd, monitoredEvents, callback,
this));
49 event_add(m_event.get(),
nullptr);
56 const DBusWatch*
getWatch()
const {
return m_watch; }
60 static void callback(evutil_socket_t fd,
short event,
void* data)
65 unsigned int flags = 0;
66 if (event & EV_READ) { flags |= DBUS_WATCH_READABLE; }
67 if (event & EV_WRITE) { flags |= DBUS_WATCH_WRITABLE; }
68 dbus_watch_handle(watchHandler->m_watch, flags);
71 event_base* m_base =
nullptr;
72 std::unique_ptr<event, EventDeleter> m_event;
73 DBusWatch* m_watch =
nullptr;
82 : m_base(base), m_timeout(timeout)
85 const int interval = dbus_timeout_get_interval(timeout);
86 timer.tv_sec = interval / 1000;
87 timer.tv_usec = (interval % 1000) * 1000;
89 m_event.reset(evtimer_new(m_base, callback,
this));
90 evtimer_add(m_event.get(), &timer);
94 const DBusTimeout*
getTimeout()
const {
return m_timeout; }
98 static void callback(evutil_socket_t fd,
short event,
void* data)
103 dbus_timeout_handle(timeoutHandler->m_timeout);
106 event_base* m_base =
nullptr;
107 std::unique_ptr<event, EventDeleter> m_event;
108 DBusTimeout* m_timeout =
nullptr;
117 Timer(event_base* base,
const timeval& timeout,
const std::function<
void()>&
func)
118 : m_base(base), m_func(
func)
120 m_event.reset(evtimer_new(m_base, callback,
this));
121 evtimer_add(m_event.get(), &timeout);
126 static void callback(evutil_socket_t fd,
short event,
void* data)
130 auto* timer =
static_cast<Timer*
>(data);
135 event_base* m_base =
nullptr;
136 std::unique_ptr<event, EventDeleter> m_event;
137 std::function<void()> m_func;
142 using namespace std::placeholders;
143 m_watchCallbacks = WatchCallbacks(std::bind(&CDBusDispatcher::dbusAddWatch,
this, _1),
144 std::bind(&CDBusDispatcher::dbusRemoveWatch,
this, _1),
145 std::bind(&CDBusDispatcher::dbusWatchToggled,
this, _1));
147 m_timeoutCallbacks = TimeoutCallbacks(std::bind(&CDBusDispatcher::dbusAddTimeout,
this, _1),
148 std::bind(&CDBusDispatcher::dbusRemoveTimeout,
this, _1),
149 std::bind(&CDBusDispatcher::dbusTimeoutToggled,
this, _1));
158 m_dispatchList.push_back(dispatchable);
163 auto it = std::find(m_dispatchList.begin(), m_dispatchList.end(), dispatchable);
164 if (it != m_dispatchList.end()) { m_dispatchList.erase(it); }
169 if (!m_eventBase) {
return; }
170 event_base_dispatch(m_eventBase.get());
175 if (!m_eventBase) {
return; }
176 event_base_loop(m_eventBase.get(), EVLOOP_NONBLOCK);
180void CDBusDispatcher::dispatch()
182 if (m_dispatchList.empty()) {
return; }
184 for (IDispatchable* dispatchable : m_dispatchList) {
185 dispatchable->dispatch();
189dbus_bool_t CDBusDispatcher::dbusAddWatch(DBusWatch* watch)
191 if (dbus_watch_get_enabled(watch) == FALSE) {
return true; }
193 int fd = dbus_watch_get_unix_fd(watch);
194 m_watchers.emplace(fd, our_make_unique<WatchHandler>(m_eventBase.get(), watch));
198void CDBusDispatcher::dbusRemoveWatch(DBusWatch* watch)
200 for (
auto it = m_watchers.begin(); it != m_watchers.end();) {
201 if (it->second->getWatch() == watch) {
202 it = m_watchers.erase(it);
209void CDBusDispatcher::dbusWatchToggled(DBusWatch* watch)
211 if (dbus_watch_get_enabled(watch) == TRUE) {
214 dbusRemoveWatch(watch);
218dbus_bool_t CDBusDispatcher::dbusAddTimeout(DBusTimeout* timeout)
220 if (dbus_timeout_get_enabled(timeout) == FALSE) {
return TRUE; }
221 m_timeouts.emplace_back(
new TimeoutHandler(m_eventBase.get(), timeout));
225void CDBusDispatcher::dbusRemoveTimeout(DBusTimeout* timeout)
227 auto predicate = [timeout](
const std::unique_ptr<TimeoutHandler>& ptr) {
228 return ptr->getTimeout() == timeout;
231 m_timeouts.erase(std::remove_if(m_timeouts.begin(), m_timeouts.end(), predicate), m_timeouts.end());
234void CDBusDispatcher::dbusTimeoutToggled(DBusTimeout* timeout)
236 if (dbus_timeout_get_enabled(timeout) == TRUE)
237 dbusAddTimeout(timeout);
239 dbusRemoveTimeout(timeout);
void remove(IDispatchable *dispatchable)
Remove dispatchable object.
CDBusDispatcher()
Constructor.
friend class TimeoutHandler
void waitAndRun()
Waits for events to be dispatched and handles them.
void add(IDispatchable *dispatchable)
Add dispatchable object.
void runOnce()
Dispatches ready handlers and returns without waiting.
virtual ~CDBusDispatcher()
Destructor.
TimeoutHandler(event_base *base, DBusTimeout *timeout)
Constructor.
const DBusTimeout * getTimeout() const
Get DBus timeout.
Timer(event_base *base, const timeval &timeout, const std::function< void()> &func)
Constructor.
WatchHandler(event_base *base, DBusWatch *watch)
Constructor.
const DBusWatch * getWatch() const
Get DBus watch.
DBusWatch * getWatch()
Get DBus watch.
Functor struct deleteing an event.
void operator()(event *obj) const
Delete functor.