1 #ifndef DBUS_FILTER_HPP 2 #define DBUS_FILTER_HPP 3 4 #include <functional> 5 #include <dbus/detail/queue.hpp> 6 #include <dbus/message.hpp> 7 #include <boost/asio.hpp> 8 9 namespace dbus { 10 11 class connection; 12 13 /// Represents a filter of incoming messages. 14 /** 15 * Filters examine incoming messages, demuxing them to multiple queues. 16 */ 17 class filter 18 { 19 connection& connection_; 20 std::function<bool(message)> predicate_; 21 detail::queue<message> queue_; 22 23 template<typename MessagePredicate> 24 filter(connection& c, 25 BOOST_ASIO_MOVE_ARG(MessagePredicate) p) 26 : connection_(c), 27 predicate_(BOOST_ASIO_MOVE_CAST(MessagePredicate)(p)) 28 {} 29 30 public: 31 friend class connection; 32 33 filter(const filter& f) 34 : connection_(f.connection_), 35 predicate_(f.predicate_), 36 queue_(f.queue_) 37 {} 38 39 bool offer(message m) 40 { 41 bool passed = predicate_(m); 42 queue_.push(m); 43 return passed; 44 } 45 connection& get_connection() { return connection_; } 46 ~filter(); 47 48 template<typename MessageHandler> 49 inline BOOST_ASIO_INITFN_RESULT_TYPE(MessageHandler, 50 void(boost::system::error_code, message)) 51 async_dispatch( 52 BOOST_ASIO_MOVE_ARG(MessageHandler) handler) 53 { 54 return queue_.async_pop( 55 BOOST_ASIO_MOVE_CAST(MessageHandler)(handler)); 56 } 57 58 }; 59 60 } // namespace dbus 61 62 63 #endif // DBUS_FILTER_HPP 64