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