xref: /openbmc/boost-dbus/include/dbus/connection_service.hpp (revision 2003615d74b8960b9276ae4d850fc9c9d6e28279)
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,
58a3cc3d57SBenjamin Kietzman       const string& address,
59a3cc3d57SBenjamin Kietzman       bool shared)
60d620effbSBenjamin Kietzman   {
61d620effbSBenjamin Kietzman     io_service& io = this->get_io_service();
62d620effbSBenjamin Kietzman 
63a3cc3d57SBenjamin Kietzman     impl = implementation_type(io, address, shared);
64d620effbSBenjamin Kietzman   }
65d620effbSBenjamin Kietzman 
66d620effbSBenjamin Kietzman   void open(implementation_type& impl,
6728cbd28bSBenjamin Kietzman       const int bus = bus::system,
68d620effbSBenjamin Kietzman       bool shared = true)
69d620effbSBenjamin Kietzman   {
70d620effbSBenjamin Kietzman     io_service& io = this->get_io_service();
71d620effbSBenjamin Kietzman 
72a3cc3d57SBenjamin Kietzman     impl = implementation_type(io, bus, shared);
73cd8b76a3SBenjamin Kietzman   }
74d620effbSBenjamin Kietzman 
75cd8b76a3SBenjamin Kietzman   message send(implementation_type& impl,
76cd8b76a3SBenjamin Kietzman       message& m)
77cd8b76a3SBenjamin Kietzman   {
7885860989SBenjamin Kietzman     error e;
7985860989SBenjamin Kietzman     message reply(dbus_connection_send_with_reply_and_block(impl,
8085860989SBenjamin Kietzman         m, -1, e));
8185860989SBenjamin Kietzman 
8285860989SBenjamin Kietzman     e.throw_if_set();
8385860989SBenjamin Kietzman     return reply;
84d620effbSBenjamin Kietzman   }
85d620effbSBenjamin Kietzman 
86d620effbSBenjamin Kietzman   template <typename Duration>
87d620effbSBenjamin Kietzman   message send(implementation_type& impl,
88d620effbSBenjamin Kietzman       message& m,
89d620effbSBenjamin Kietzman       const Duration& timeout)
90d620effbSBenjamin Kietzman   {
91d620effbSBenjamin Kietzman     //TODO generically convert timeout to milliseconds
92cd8b76a3SBenjamin Kietzman     if(timeout == Duration::zero()) {
93d620effbSBenjamin Kietzman       //TODO this can return false if it failed
944317e4d9SBenjamin Kietzman       dbus_connection_send(impl, m, NULL);
95d620effbSBenjamin Kietzman       return message();
96d620effbSBenjamin Kietzman     } else {
9785860989SBenjamin Kietzman       error e;
9885860989SBenjamin Kietzman       message reply(dbus_connection_send_with_reply_and_block(impl,
9985860989SBenjamin Kietzman           m, chrono::milliseconds(timeout).count(), e));
10085860989SBenjamin Kietzman 
10185860989SBenjamin Kietzman       e.throw_if_set();
10285860989SBenjamin Kietzman       return reply;
103d620effbSBenjamin Kietzman     }
104d620effbSBenjamin Kietzman   }
105d620effbSBenjamin Kietzman 
106d620effbSBenjamin Kietzman   template<typename MessageHandler>
107d620effbSBenjamin Kietzman   inline BOOST_ASIO_INITFN_RESULT_TYPE(MessageHandler,
108d620effbSBenjamin Kietzman       void(boost::system::error_code, message))
109d620effbSBenjamin Kietzman   async_send(implementation_type& impl,
110d620effbSBenjamin Kietzman       message& m,
111d620effbSBenjamin Kietzman       BOOST_ASIO_MOVE_ARG(MessageHandler) handler)
112d620effbSBenjamin Kietzman   {
113*2003615dSBenjamin Kietzman     // begin asynchronous operation
114*2003615dSBenjamin Kietzman     impl.start(this->get_io_service());
115*2003615dSBenjamin Kietzman 
116a1051121SBenjamin Kietzman     boost::asio::detail::async_result_init<
117a1051121SBenjamin Kietzman       MessageHandler, void(boost::system::error_code, message)> init(
118a1051121SBenjamin Kietzman         BOOST_ASIO_MOVE_CAST(MessageHandler)(handler));
119cd8b76a3SBenjamin Kietzman 
120a1051121SBenjamin Kietzman     detail::async_send_op<
121a1051121SBenjamin Kietzman       BOOST_ASIO_HANDLER_TYPE(MessageHandler,
122a1051121SBenjamin Kietzman         void(boost::system::error_code, message))>(
123a1051121SBenjamin Kietzman           this->get_io_service(),
124a1051121SBenjamin Kietzman             BOOST_ASIO_MOVE_CAST(MessageHandler)(init.handler)) (impl, m);
125a1051121SBenjamin Kietzman 
126a1051121SBenjamin Kietzman     return init.result.get();
127d620effbSBenjamin Kietzman   }
128d620effbSBenjamin Kietzman 
129cd8b76a3SBenjamin Kietzman   void new_match(implementation_type& impl,
13017826fe7SBenjamin Kietzman       match& m);
131cd8b76a3SBenjamin Kietzman 
132cd8b76a3SBenjamin Kietzman   void delete_match(implementation_type& impl,
13317826fe7SBenjamin Kietzman       match& m);
134cd8b76a3SBenjamin Kietzman 
135cd8b76a3SBenjamin Kietzman   void new_filter(implementation_type& impl,
13617826fe7SBenjamin Kietzman       filter& f);
137cd8b76a3SBenjamin Kietzman 
138cd8b76a3SBenjamin Kietzman   void delete_filter(implementation_type& impl,
13917826fe7SBenjamin Kietzman       filter& f);
14017826fe7SBenjamin Kietzman 
141d620effbSBenjamin Kietzman };
142d620effbSBenjamin Kietzman 
143d620effbSBenjamin Kietzman io_service::id connection_service::id;
144d620effbSBenjamin Kietzman 
145cd8b76a3SBenjamin Kietzman 
146cd8b76a3SBenjamin Kietzman 
147cd8b76a3SBenjamin Kietzman 
148d620effbSBenjamin Kietzman } // namespace dbus
149fc79e461SBenjamin Kietzman 
150fc79e461SBenjamin Kietzman #endif // DBUS_CONNECTION_SERVICE_HPP
151