4 #include "dbusdispatcher.h"
8 #include "dbusconnection.h"
29 WatchHandler(event_base *base, DBusWatch *watch) : m_base(base), m_watch(watch)
31 const unsigned int flags = dbus_watch_get_flags(watch);
32 short monitoredEvents = EV_PERSIST;
34 if (flags & DBUS_WATCH_READABLE) { monitoredEvents |= EV_READ; }
35 if (flags & DBUS_WATCH_WRITABLE) { monitoredEvents |= EV_WRITE; }
37 const int fd = dbus_watch_get_unix_fd(watch);
38 m_event.reset(event_new(m_base, fd, monitoredEvents, callback,
this));
39 event_add(m_event.get(),
nullptr);
46 const DBusWatch *
getWatch()
const {
return m_watch; }
50 static void callback(evutil_socket_t fd,
short event,
void *data)
55 unsigned int flags = 0;
56 if (event & EV_READ) { flags |= DBUS_WATCH_READABLE; }
57 if (event & EV_WRITE) { flags |= DBUS_WATCH_WRITABLE; }
58 dbus_watch_handle(watchHandler->m_watch, flags);
61 event_base *m_base =
nullptr;
62 std::unique_ptr<event, EventDeleter> m_event;
63 DBusWatch *m_watch =
nullptr;
71 TimeoutHandler(event_base *base, DBusTimeout *timeout) : m_base(base), m_timeout(timeout)
74 const int interval = dbus_timeout_get_interval(timeout);
75 timer.tv_sec = interval / 1000;
76 timer.tv_usec = (interval % 1000) * 1000;
78 m_event.reset(evtimer_new(m_base, callback,
this));
79 evtimer_add(m_event.get(), &timer);
83 const DBusTimeout *
getTimeout()
const {
return m_timeout; }
87 static void callback(evutil_socket_t fd,
short event,
void *data)
92 dbus_timeout_handle(timeoutHandler->m_timeout);
95 event_base *m_base =
nullptr;
96 std::unique_ptr<event, EventDeleter> m_event;
97 DBusTimeout *m_timeout =
nullptr;
106 Timer(event_base *base,
const timeval &timeout,
const std::function<
void()> &func) : m_base(base), m_func(func)
108 m_event.reset(evtimer_new(m_base, callback,
this));
109 evtimer_add(m_event.get(), &timeout);
114 static void callback(evutil_socket_t fd,
short event,
void *data)
118 auto *timer =
static_cast<Timer *
>(data);
123 event_base *m_base =
nullptr;
124 std::unique_ptr<event, EventDeleter> m_event;
125 std::function<void()> m_func;
130 using namespace std::placeholders;
131 m_watchCallbacks = WatchCallbacks(std::bind(&CDBusDispatcher::dbusAddWatch,
this, _1),
132 std::bind(&CDBusDispatcher::dbusRemoveWatch,
this, _1),
133 std::bind(&CDBusDispatcher::dbusWatchToggled,
this, _1));
135 m_timeoutCallbacks = TimeoutCallbacks(std::bind(&CDBusDispatcher::dbusAddTimeout,
this, _1),
136 std::bind(&CDBusDispatcher::dbusRemoveTimeout,
this, _1),
137 std::bind(&CDBusDispatcher::dbusTimeoutToggled,
this, _1));
146 auto it = std::find(m_dispatchList.begin(), m_dispatchList.end(), dispatchable);
147 if (it != m_dispatchList.end()) { m_dispatchList.erase(it); }
152 if (!m_eventBase) {
return; }
153 event_base_dispatch(m_eventBase.get());
158 if (!m_eventBase) {
return; }
159 event_base_loop(m_eventBase.get(), EVLOOP_NONBLOCK);
163 void CDBusDispatcher::dispatch()
165 if (m_dispatchList.empty()) {
return; }
167 for (IDispatchable *dispatchable : m_dispatchList) { dispatchable->dispatch(); }
170 dbus_bool_t CDBusDispatcher::dbusAddWatch(DBusWatch *watch)
172 if (dbus_watch_get_enabled(watch) == FALSE) {
return true; }
174 int fd = dbus_watch_get_unix_fd(watch);
175 m_watchers.emplace(fd, std::make_unique<WatchHandler>(m_eventBase.get(), watch));
179 void CDBusDispatcher::dbusRemoveWatch(
const DBusWatch *watch)
181 for (
auto it = m_watchers.begin(); it != m_watchers.end();)
183 if (it->second->getWatch() == watch) { it = m_watchers.erase(it); }
188 void CDBusDispatcher::dbusWatchToggled(DBusWatch *watch)
190 if (dbus_watch_get_enabled(watch) == TRUE) { dbusAddWatch(watch); }
191 else { dbusRemoveWatch(watch); }
194 dbus_bool_t CDBusDispatcher::dbusAddTimeout(DBusTimeout *timeout)
196 if (dbus_timeout_get_enabled(timeout) == FALSE) {
return TRUE; }
197 m_timeouts.emplace(m_timeouts.end(), std::make_unique<TimeoutHandler>(m_eventBase.get(), timeout));
201 void CDBusDispatcher::dbusRemoveTimeout(DBusTimeout *timeout)
203 auto predicate = [timeout](
const std::unique_ptr<TimeoutHandler> &ptr) {
return ptr->getTimeout() == timeout; };
205 m_timeouts.erase(std::remove_if(m_timeouts.begin(), m_timeouts.end(), predicate), m_timeouts.end());
208 void CDBusDispatcher::dbusTimeoutToggled(DBusTimeout *timeout)
210 if (dbus_timeout_get_enabled(timeout) == TRUE)
211 dbusAddTimeout(timeout);
213 dbusRemoveTimeout(timeout);
void add(IDispatchable *dispatchable)
Add dispatchable object.
virtual ~CDBusDispatcher()
Destructor.
void remove(IDispatchable *dispatchable)
Remove dispatchable object.
CDBusDispatcher()
Constructor.
void runOnce()
Dispatches ready handlers and returns without waiting.
void waitAndRun()
Waits for events to be dispatched and handles them.
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.
DBusWatch * getWatch()
Get DBus watch.
WatchHandler(event_base *base, DBusWatch *watch)
Constructor.
const DBusWatch * getWatch() const
Get DBus watch.
Plugin loaded by X-Plane which publishes a DBus service.
Functor struct deleteing an event.
void operator()(event *obj) const
Delete functor.