xref: /openbmc/boost-dbus/include/dbus/filter.hpp (revision 28cbd28b)
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     return queue_.async_pop(
58       BOOST_ASIO_MOVE_CAST(MessageHandler)(handler));
59   }
60 
61 };
62 } // namespace dbus
63 
64 
65 #include <dbus/impl/filter.ipp>
66 #endif // DBUS_FILTER_HPP
67