xref: /openbmc/boost-dbus/include/dbus/connection_service.hpp (revision cfc0655f1f08e5a7c62c4ada1b54292783b88647)
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,
58*cfc0655fSBenjamin Kietzman       const string& address)
59d620effbSBenjamin Kietzman   {
60d620effbSBenjamin Kietzman     io_service& io = this->get_io_service();
61d620effbSBenjamin Kietzman 
62*cfc0655fSBenjamin Kietzman     impl.open(io, address);
63d620effbSBenjamin Kietzman   }
64d620effbSBenjamin Kietzman 
65d620effbSBenjamin Kietzman   void open(implementation_type& impl,
66*cfc0655fSBenjamin Kietzman       const int bus = bus::system)
67d620effbSBenjamin Kietzman   {
68d620effbSBenjamin Kietzman     io_service& io = this->get_io_service();
69d620effbSBenjamin Kietzman 
70*cfc0655fSBenjamin Kietzman     impl.open(io, bus);
71cd8b76a3SBenjamin Kietzman   }
72d620effbSBenjamin Kietzman 
73cd8b76a3SBenjamin Kietzman   message send(implementation_type& impl,
74cd8b76a3SBenjamin Kietzman       message& m)
75cd8b76a3SBenjamin Kietzman   {
7685860989SBenjamin Kietzman     error e;
7785860989SBenjamin Kietzman     message reply(dbus_connection_send_with_reply_and_block(impl,
7885860989SBenjamin Kietzman         m, -1, e));
7985860989SBenjamin Kietzman 
8085860989SBenjamin Kietzman     e.throw_if_set();
8185860989SBenjamin Kietzman     return reply;
82d620effbSBenjamin Kietzman   }
83d620effbSBenjamin Kietzman 
84d620effbSBenjamin Kietzman   template <typename Duration>
85d620effbSBenjamin Kietzman   message send(implementation_type& impl,
86d620effbSBenjamin Kietzman       message& m,
87d620effbSBenjamin Kietzman       const Duration& timeout)
88d620effbSBenjamin Kietzman   {
89d620effbSBenjamin Kietzman     //TODO generically convert timeout to milliseconds
90cd8b76a3SBenjamin Kietzman     if(timeout == Duration::zero()) {
91d620effbSBenjamin Kietzman       //TODO this can return false if it failed
924317e4d9SBenjamin Kietzman       dbus_connection_send(impl, m, NULL);
93d620effbSBenjamin Kietzman       return message();
94d620effbSBenjamin Kietzman     } else {
9585860989SBenjamin Kietzman       error e;
9685860989SBenjamin Kietzman       message reply(dbus_connection_send_with_reply_and_block(impl,
9785860989SBenjamin Kietzman           m, chrono::milliseconds(timeout).count(), e));
9885860989SBenjamin Kietzman 
9985860989SBenjamin Kietzman       e.throw_if_set();
10085860989SBenjamin Kietzman       return reply;
101d620effbSBenjamin Kietzman     }
102d620effbSBenjamin Kietzman   }
103d620effbSBenjamin Kietzman 
104d620effbSBenjamin Kietzman   template<typename MessageHandler>
105d620effbSBenjamin Kietzman   inline BOOST_ASIO_INITFN_RESULT_TYPE(MessageHandler,
106d620effbSBenjamin Kietzman       void(boost::system::error_code, message))
107d620effbSBenjamin Kietzman   async_send(implementation_type& impl,
108d620effbSBenjamin Kietzman       message& m,
109d620effbSBenjamin Kietzman       BOOST_ASIO_MOVE_ARG(MessageHandler) handler)
110d620effbSBenjamin Kietzman   {
1112003615dSBenjamin Kietzman     // begin asynchronous operation
1122003615dSBenjamin Kietzman     impl.start(this->get_io_service());
1132003615dSBenjamin Kietzman 
114a1051121SBenjamin Kietzman     boost::asio::detail::async_result_init<
115a1051121SBenjamin Kietzman       MessageHandler, void(boost::system::error_code, message)> init(
116a1051121SBenjamin Kietzman         BOOST_ASIO_MOVE_CAST(MessageHandler)(handler));
117cd8b76a3SBenjamin Kietzman 
118a1051121SBenjamin Kietzman     detail::async_send_op<
119a1051121SBenjamin Kietzman       BOOST_ASIO_HANDLER_TYPE(MessageHandler,
120a1051121SBenjamin Kietzman         void(boost::system::error_code, message))>(
121a1051121SBenjamin Kietzman           this->get_io_service(),
122a1051121SBenjamin Kietzman             BOOST_ASIO_MOVE_CAST(MessageHandler)(init.handler)) (impl, m);
123a1051121SBenjamin Kietzman 
124a1051121SBenjamin Kietzman     return init.result.get();
125d620effbSBenjamin Kietzman   }
126d620effbSBenjamin Kietzman 
127cd8b76a3SBenjamin Kietzman   void new_match(implementation_type& impl,
12817826fe7SBenjamin Kietzman       match& m);
129cd8b76a3SBenjamin Kietzman 
130cd8b76a3SBenjamin Kietzman   void delete_match(implementation_type& impl,
13117826fe7SBenjamin Kietzman       match& m);
132cd8b76a3SBenjamin Kietzman 
133cd8b76a3SBenjamin Kietzman   void new_filter(implementation_type& impl,
13417826fe7SBenjamin Kietzman       filter& f);
135cd8b76a3SBenjamin Kietzman 
136cd8b76a3SBenjamin Kietzman   void delete_filter(implementation_type& impl,
13717826fe7SBenjamin Kietzman       filter& f);
13817826fe7SBenjamin Kietzman 
139d620effbSBenjamin Kietzman };
140d620effbSBenjamin Kietzman 
141d620effbSBenjamin Kietzman io_service::id connection_service::id;
142d620effbSBenjamin Kietzman 
143cd8b76a3SBenjamin Kietzman 
144cd8b76a3SBenjamin Kietzman 
145cd8b76a3SBenjamin Kietzman 
146d620effbSBenjamin Kietzman } // namespace dbus
147fc79e461SBenjamin Kietzman 
148fc79e461SBenjamin Kietzman #endif // DBUS_CONNECTION_SERVICE_HPP
149