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