From 101dd1c2bae2c2fb2f1b44948468937f0f408bfe Mon Sep 17 00:00:00 2001 From: Taras Zaporozhets Date: Sun, 30 Oct 2022 18:35:47 +0100 Subject: [PATCH] Add boost asio integration --- CMakeLists.txt | 1 + include/sdbus-c++/SdbusAsio.h | 67 +++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 include/sdbus-c++/SdbusAsio.h diff --git a/CMakeLists.txt b/CMakeLists.txt index c5a8a03..76476e1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -81,6 +81,7 @@ set(SDBUSCPP_PUBLIC_HDRS ${SDBUSCPP_INCLUDE_DIR}/Types.h ${SDBUSCPP_INCLUDE_DIR}/TypeTraits.h ${SDBUSCPP_INCLUDE_DIR}/Flags.h + ${SDBUSCPP_INCLUDE_DIR}/SdbusAsio.h ${SDBUSCPP_INCLUDE_DIR}/sdbus-c++.h) set(SDBUSCPP_SRCS ${SDBUSCPP_CPP_SRCS} ${SDBUSCPP_HDR_SRCS} ${SDBUSCPP_PUBLIC_HDRS}) diff --git a/include/sdbus-c++/SdbusAsio.h b/include/sdbus-c++/SdbusAsio.h new file mode 100644 index 0000000..9644819 --- /dev/null +++ b/include/sdbus-c++/SdbusAsio.h @@ -0,0 +1,67 @@ +#pragma once + +#include +#include +#include +#include + +class SdbusAsio final : boost::noncopyable { +public: + explicit SdbusAsio(boost::asio::io_context& io_context, + std::unique_ptr conn = sdbus::createDefaultBusConnection()) + : conn_ { std::move(conn) } + , timer_ { io_context } + , dbus_desc_ { io_context } + , event_desc_ { io_context } + + { + auto poll_data = conn_->getEventLoopPollData(); + dbus_desc_.async_wait(boost::asio::posix::stream_descriptor::wait_read, + [this](const boost::system::error_code&) { processRead(); }); + dbus_desc_.assign(poll_data.fd); + + event_desc_.async_read_some(boost::asio::null_buffers(), [this](auto&, auto) { processEvent(); }); + event_desc_.assign(poll_data.event_fd); + + if (poll_data.timeout_usec != UINT64_MAX) { + timer_.async_wait([this](boost::system::error_code const&) { processTimeout(); }); + timer_.expires_from_now(boost::posix_time::microsec(poll_data.timeout_usec)); + } + } + + std::shared_ptr getConnection() { return conn_; } + +private: + void process() + { + for (auto i = 0; i < DBUS_PROCESS_MAX; i++) { + if (!conn_->processPendingRequest()) { + break; + } + } + } + void processRead() + { + process(); + dbus_desc_.async_wait(boost::asio::posix::stream_descriptor::wait_read, + [this](const boost::system::error_code&) { processRead(); }); + } + + void processEvent() + { + process(); + event_desc_.async_read_some(boost::asio::null_buffers(), [this](auto, auto) { processEvent(); }); + } + + void processTimeout() + { + process(); + timer_.async_wait([this](boost::system::error_code const&) { processTimeout(); }); + } + + static constexpr auto DBUS_PROCESS_MAX = 32; + std::shared_ptr conn_; + boost::asio::deadline_timer timer_; + boost::asio::posix::stream_descriptor dbus_desc_; + boost::asio::posix::stream_descriptor event_desc_; +};