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 <boost/asio.hpp> 10 #include <dbus/detail/queue.hpp> 11 #include <dbus/message.hpp> 12 #include <dbus/connection.hpp> 13 #include <dbus/functional.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 { 23 connection& connection_; 24 function<bool(message&)> predicate_; 25 detail::queue<message> queue_; 26 27 public: 28 29 bool offer(message& m) 30 { 31 bool filtered = predicate_(m); 32 if(filtered) queue_.push(m); 33 return filtered; 34 } 35 36 template<typename MessagePredicate> 37 filter(connection& c, 38 BOOST_ASIO_MOVE_ARG(MessagePredicate) p) 39 : connection_(c), 40 predicate_(BOOST_ASIO_MOVE_CAST(MessagePredicate)(p)), 41 queue_(connection_.get_io_service()) 42 { 43 connection_.new_filter(*this); 44 } 45 46 ~filter() 47 { 48 connection_.delete_filter(*this); 49 } 50 51 template<typename MessageHandler> 52 inline BOOST_ASIO_INITFN_RESULT_TYPE(MessageHandler, 53 void(boost::system::error_code, message)) 54 async_dispatch( 55 BOOST_ASIO_MOVE_ARG(MessageHandler) handler) 56 { 57 // begin asynchronous operation 58 connection_.get_implementation().start( 59 connection_.get_io_service()); 60 61 return queue_.async_pop( 62 BOOST_ASIO_MOVE_CAST(MessageHandler)(handler)); 63 } 64 65 }; 66 } // namespace dbus 67 68 69 #include <dbus/impl/filter.ipp> 70 #endif // DBUS_FILTER_HPP 71