1 // Copyright (c) Benjamin Kietzman (github.com/bkietz) 2 // 3 // Distributed under the Boost Software License, Version 1.0. (See accompanying 4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 5 6 #ifndef DBUS_FILTER_HPP 7 #define DBUS_FILTER_HPP 8 9 #include <dbus/connection.hpp> 10 #include <dbus/detail/queue.hpp> 11 #include <dbus/message.hpp> 12 #include <functional> 13 #include <boost/asio.hpp> 14 15 namespace dbus { 16 17 /// Represents a filter of incoming messages. 18 /** 19 * Filters examine incoming messages, demuxing them to multiple queues. 20 */ 21 class filter { 22 connection& connection_; 23 std::function<bool(message&)> predicate_; 24 detail::queue<message> queue_; 25 26 public: 27 bool offer(message& m) { 28 bool filtered = predicate_(m); 29 if (filtered) queue_.push(m); 30 return filtered; 31 } 32 33 template <typename MessagePredicate> 34 filter(connection& c, BOOST_ASIO_MOVE_ARG(MessagePredicate) p) 35 : connection_(c), 36 predicate_(BOOST_ASIO_MOVE_CAST(MessagePredicate)(p)), 37 queue_(connection_.get_io_service()) { 38 connection_.new_filter(*this); 39 } 40 41 ~filter() { connection_.delete_filter(*this); } 42 43 template <typename MessageHandler> 44 inline BOOST_ASIO_INITFN_RESULT_TYPE(MessageHandler, 45 void(boost::system::error_code, message)) 46 async_dispatch(BOOST_ASIO_MOVE_ARG(MessageHandler) handler) { 47 // begin asynchronous operation 48 connection_.get_implementation().start(connection_.get_io_service()); 49 50 return queue_.async_pop(BOOST_ASIO_MOVE_CAST(MessageHandler)(handler)); 51 } 52 }; 53 } // namespace dbus 54 55 #include <dbus/impl/filter.ipp> 56 #endif // DBUS_FILTER_HPP 57