xref: /openbmc/boost-dbus/include/dbus/connection_service.hpp (revision a3cc3d577df6681906e591e3294f0d1915cb9f8f)
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>
12*a3cc3d57SBenjamin Kietzman #include <dbus/element.hpp>
13fc79e461SBenjamin Kietzman #include <dbus/message.hpp>
14a1051121SBenjamin Kietzman #include <dbus/detail/async_send_op.hpp>
15fc79e461SBenjamin Kietzman 
16*a3cc3d57SBenjamin Kietzman #include <dbus/impl/connection.ipp>
17*a3cc3d57SBenjamin 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 
37*a3cc3d57SBenjamin 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,
58*a3cc3d57SBenjamin Kietzman       const string& address,
59*a3cc3d57SBenjamin Kietzman       bool shared)
60d620effbSBenjamin Kietzman   {
61d620effbSBenjamin Kietzman     io_service& io = this->get_io_service();
62d620effbSBenjamin Kietzman 
63*a3cc3d57SBenjamin 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 
72*a3cc3d57SBenjamin 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   {
113a1051121SBenjamin Kietzman     boost::asio::detail::async_result_init<
114a1051121SBenjamin Kietzman       MessageHandler, void(boost::system::error_code, message)> init(
115a1051121SBenjamin Kietzman         BOOST_ASIO_MOVE_CAST(MessageHandler)(handler));
116cd8b76a3SBenjamin Kietzman 
117a1051121SBenjamin Kietzman     detail::async_send_op<
118a1051121SBenjamin Kietzman       BOOST_ASIO_HANDLER_TYPE(MessageHandler,
119a1051121SBenjamin Kietzman         void(boost::system::error_code, message))>(
120a1051121SBenjamin Kietzman           this->get_io_service(),
121a1051121SBenjamin Kietzman             BOOST_ASIO_MOVE_CAST(MessageHandler)(init.handler)) (impl, m);
122a1051121SBenjamin Kietzman 
123a1051121SBenjamin Kietzman     return init.result.get();
124d620effbSBenjamin Kietzman   }
125d620effbSBenjamin Kietzman 
126cd8b76a3SBenjamin Kietzman   void new_match(implementation_type& impl,
12717826fe7SBenjamin Kietzman       match& m);
128cd8b76a3SBenjamin Kietzman 
129cd8b76a3SBenjamin Kietzman   void delete_match(implementation_type& impl,
13017826fe7SBenjamin Kietzman       match& m);
131cd8b76a3SBenjamin Kietzman 
132cd8b76a3SBenjamin Kietzman   void new_filter(implementation_type& impl,
13317826fe7SBenjamin Kietzman       filter& f);
134cd8b76a3SBenjamin Kietzman 
135cd8b76a3SBenjamin Kietzman   void delete_filter(implementation_type& impl,
13617826fe7SBenjamin Kietzman       filter& f);
13717826fe7SBenjamin Kietzman 
138d620effbSBenjamin Kietzman };
139d620effbSBenjamin Kietzman 
140d620effbSBenjamin Kietzman io_service::id connection_service::id;
141d620effbSBenjamin Kietzman 
142cd8b76a3SBenjamin Kietzman 
143cd8b76a3SBenjamin Kietzman 
144cd8b76a3SBenjamin Kietzman 
145d620effbSBenjamin Kietzman } // namespace dbus
146fc79e461SBenjamin Kietzman 
147fc79e461SBenjamin Kietzman #endif // DBUS_CONNECTION_SERVICE_HPP
148