xref: /openbmc/boost-dbus/include/dbus/connection_service.hpp (revision b55ed5d5c17cab07d34268a047806bf5f0fbb41d)
191cdbe46SBenjamin Kietzman // Copyright (c) Benjamin Kietzman (github.com/bkietz)
291cdbe46SBenjamin Kietzman //
391cdbe46SBenjamin Kietzman // Distributed under the Boost Software License, Version 1.0. (See accompanying
491cdbe46SBenjamin Kietzman // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
591cdbe46SBenjamin Kietzman 
6fc79e461SBenjamin Kietzman #ifndef DBUS_CONNECTION_SERVICE_HPP
7fc79e461SBenjamin Kietzman #define DBUS_CONNECTION_SERVICE_HPP
8fc79e461SBenjamin Kietzman 
9d620effbSBenjamin Kietzman #include <boost/asio.hpp>
10d620effbSBenjamin Kietzman 
1185860989SBenjamin Kietzman #include <dbus/error.hpp>
12a3cc3d57SBenjamin Kietzman #include <dbus/element.hpp>
13fc79e461SBenjamin Kietzman #include <dbus/message.hpp>
14a1051121SBenjamin Kietzman #include <dbus/detail/async_send_op.hpp>
15fc79e461SBenjamin Kietzman 
16a3cc3d57SBenjamin Kietzman #include <dbus/impl/connection.ipp>
17a3cc3d57SBenjamin Kietzman 
18d620effbSBenjamin Kietzman namespace dbus {
19d620effbSBenjamin Kietzman 
20cd8b76a3SBenjamin Kietzman namespace bus {
21cd8b76a3SBenjamin Kietzman   static const int session = DBUS_BUS_SESSION;
22cd8b76a3SBenjamin Kietzman   static const int system  = DBUS_BUS_SYSTEM;
23cd8b76a3SBenjamin Kietzman   static const int starter = DBUS_BUS_STARTER;
24cd8b76a3SBenjamin Kietzman } // namespace bus
25cd8b76a3SBenjamin Kietzman 
26fc79e461SBenjamin Kietzman using namespace boost::asio;
27fc79e461SBenjamin Kietzman 
2817826fe7SBenjamin Kietzman class filter;
2917826fe7SBenjamin Kietzman class match;
3017826fe7SBenjamin Kietzman 
31d620effbSBenjamin Kietzman class connection_service
32d620effbSBenjamin Kietzman   : public io_service::service
33d620effbSBenjamin Kietzman {
34d620effbSBenjamin Kietzman public:
35d620effbSBenjamin Kietzman   static io_service::id id;
36d620effbSBenjamin Kietzman 
37a3cc3d57SBenjamin Kietzman   typedef impl::connection implementation_type;
38d620effbSBenjamin Kietzman 
39d620effbSBenjamin Kietzman   explicit connection_service(io_service& io)
40d620effbSBenjamin Kietzman     : service(io)
41d620effbSBenjamin Kietzman   {
42d620effbSBenjamin Kietzman   }
43d620effbSBenjamin Kietzman 
44d620effbSBenjamin Kietzman   void construct(implementation_type& impl)
45d620effbSBenjamin Kietzman   {
46d620effbSBenjamin Kietzman   }
47d620effbSBenjamin Kietzman 
48d620effbSBenjamin Kietzman   void destroy(implementation_type& impl)
49d620effbSBenjamin Kietzman   {
50d620effbSBenjamin Kietzman   }
51d620effbSBenjamin Kietzman 
52d620effbSBenjamin Kietzman   void shutdown_service()
53d620effbSBenjamin Kietzman   {
54cd8b76a3SBenjamin Kietzman     //TODO is there anything that needs shutting down?
55d620effbSBenjamin Kietzman   }
56d620effbSBenjamin Kietzman 
57d620effbSBenjamin Kietzman   void open(implementation_type& impl,
58cfc0655fSBenjamin Kietzman       const string& address)
59d620effbSBenjamin Kietzman   {
60d620effbSBenjamin Kietzman     io_service& io = this->get_io_service();
61d620effbSBenjamin Kietzman 
62cfc0655fSBenjamin Kietzman     impl.open(io, address);
63d620effbSBenjamin Kietzman   }
64d620effbSBenjamin Kietzman 
65d620effbSBenjamin Kietzman   void open(implementation_type& impl,
66cfc0655fSBenjamin Kietzman       const int bus = bus::system)
67d620effbSBenjamin Kietzman   {
68d620effbSBenjamin Kietzman     io_service& io = this->get_io_service();
69d620effbSBenjamin Kietzman 
70cfc0655fSBenjamin Kietzman     impl.open(io, bus);
71cd8b76a3SBenjamin Kietzman   }
72d620effbSBenjamin Kietzman 
73cd8b76a3SBenjamin Kietzman   message send(implementation_type& impl,
74cd8b76a3SBenjamin Kietzman       message& m)
75cd8b76a3SBenjamin Kietzman   {
76*b55ed5d5SBenjamin Kietzman     return impl.send_with_reply_and_block(m);
77d620effbSBenjamin Kietzman   }
78d620effbSBenjamin Kietzman 
79d620effbSBenjamin Kietzman   template <typename Duration>
80d620effbSBenjamin Kietzman   message send(implementation_type& impl,
81d620effbSBenjamin Kietzman       message& m,
82d620effbSBenjamin Kietzman       const Duration& timeout)
83d620effbSBenjamin Kietzman   {
84cd8b76a3SBenjamin Kietzman     if(timeout == Duration::zero()) {
85d620effbSBenjamin Kietzman       //TODO this can return false if it failed
86*b55ed5d5SBenjamin Kietzman       impl.send(m);
87d620effbSBenjamin Kietzman       return message();
88d620effbSBenjamin Kietzman     } else {
89*b55ed5d5SBenjamin Kietzman       return impl.send_with_reply_and_block(m,
90*b55ed5d5SBenjamin Kietzman         chrono::milliseconds(timeout).count());
91d620effbSBenjamin Kietzman     }
92d620effbSBenjamin Kietzman   }
93d620effbSBenjamin Kietzman 
94d620effbSBenjamin Kietzman   template<typename MessageHandler>
95d620effbSBenjamin Kietzman   inline BOOST_ASIO_INITFN_RESULT_TYPE(MessageHandler,
96d620effbSBenjamin Kietzman       void(boost::system::error_code, message))
97d620effbSBenjamin Kietzman   async_send(implementation_type& impl,
98d620effbSBenjamin Kietzman       message& m,
99d620effbSBenjamin Kietzman       BOOST_ASIO_MOVE_ARG(MessageHandler) handler)
100d620effbSBenjamin Kietzman   {
1012003615dSBenjamin Kietzman     // begin asynchronous operation
1022003615dSBenjamin Kietzman     impl.start(this->get_io_service());
1032003615dSBenjamin Kietzman 
104a1051121SBenjamin Kietzman     boost::asio::detail::async_result_init<
105a1051121SBenjamin Kietzman       MessageHandler, void(boost::system::error_code, message)> init(
106a1051121SBenjamin Kietzman         BOOST_ASIO_MOVE_CAST(MessageHandler)(handler));
107cd8b76a3SBenjamin Kietzman 
108a1051121SBenjamin Kietzman     detail::async_send_op<
109a1051121SBenjamin Kietzman       BOOST_ASIO_HANDLER_TYPE(MessageHandler,
110a1051121SBenjamin Kietzman         void(boost::system::error_code, message))>(
111a1051121SBenjamin Kietzman           this->get_io_service(),
112a1051121SBenjamin Kietzman             BOOST_ASIO_MOVE_CAST(MessageHandler)(init.handler)) (impl, m);
113a1051121SBenjamin Kietzman 
114a1051121SBenjamin Kietzman     return init.result.get();
115d620effbSBenjamin Kietzman   }
116d620effbSBenjamin Kietzman 
117cd8b76a3SBenjamin Kietzman   void new_match(implementation_type& impl,
11817826fe7SBenjamin Kietzman       match& m);
119cd8b76a3SBenjamin Kietzman 
120cd8b76a3SBenjamin Kietzman   void delete_match(implementation_type& impl,
12117826fe7SBenjamin Kietzman       match& m);
122cd8b76a3SBenjamin Kietzman 
123cd8b76a3SBenjamin Kietzman   void new_filter(implementation_type& impl,
12417826fe7SBenjamin Kietzman       filter& f);
125cd8b76a3SBenjamin Kietzman 
126cd8b76a3SBenjamin Kietzman   void delete_filter(implementation_type& impl,
12717826fe7SBenjamin Kietzman       filter& f);
12817826fe7SBenjamin Kietzman 
129d620effbSBenjamin Kietzman };
130d620effbSBenjamin Kietzman 
131d620effbSBenjamin Kietzman io_service::id connection_service::id;
132d620effbSBenjamin Kietzman 
133cd8b76a3SBenjamin Kietzman 
134cd8b76a3SBenjamin Kietzman 
135cd8b76a3SBenjamin Kietzman 
136d620effbSBenjamin Kietzman } // namespace dbus
137fc79e461SBenjamin Kietzman 
138fc79e461SBenjamin Kietzman #endif // DBUS_CONNECTION_SERVICE_HPP
139