xref: /openbmc/boost-dbus/include/dbus/filter.hpp (revision cd8b76a3)
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