1*d620effbSBenjamin Kietzman #include <dbus/detail/watch_timeout.hpp> 2*d620effbSBenjamin Kietzman #include <dbus/detail/queue.hpp> 3*d620effbSBenjamin Kietzman #include <boost/asio.hpp> 4*d620effbSBenjamin Kietzman 5*d620effbSBenjamin Kietzman namespace dbus { 6*d620effbSBenjamin Kietzman 7*d620effbSBenjamin Kietzman class connection_service 8*d620effbSBenjamin Kietzman : public io_service::service 9*d620effbSBenjamin Kietzman { 10*d620effbSBenjamin Kietzman public: 11*d620effbSBenjamin Kietzman static io_service::id id; 12*d620effbSBenjamin Kietzman 13*d620effbSBenjamin Kietzman typedef DBusConnection *implementation_type; 14*d620effbSBenjamin Kietzman 15*d620effbSBenjamin Kietzman explicit connection_service(io_service& io) 16*d620effbSBenjamin Kietzman : service(io) 17*d620effbSBenjamin Kietzman { 18*d620effbSBenjamin Kietzman } 19*d620effbSBenjamin Kietzman 20*d620effbSBenjamin Kietzman void construct(implementation_type& impl) 21*d620effbSBenjamin Kietzman { 22*d620effbSBenjamin Kietzman } 23*d620effbSBenjamin Kietzman 24*d620effbSBenjamin Kietzman void destroy(implementation_type& impl) 25*d620effbSBenjamin Kietzman { 26*d620effbSBenjamin Kietzman dbus_connection_unref(impl); 27*d620effbSBenjamin Kietzman } 28*d620effbSBenjamin Kietzman 29*d620effbSBenjamin Kietzman void shutdown_service() 30*d620effbSBenjamin Kietzman { 31*d620effbSBenjamin Kietzman //TODO 32*d620effbSBenjamin Kietzman } 33*d620effbSBenjamin Kietzman 34*d620effbSBenjamin Kietzman void open(implementation_type& impl, 35*d620effbSBenjamin Kietzman const string& address, bool shared=true) 36*d620effbSBenjamin Kietzman { 37*d620effbSBenjamin Kietzman io_service& io = this->get_io_service(); 38*d620effbSBenjamin Kietzman 39*d620effbSBenjamin Kietzman using namespace detail; 40*d620effbSBenjamin Kietzman 41*d620effbSBenjamin Kietzman DBusError error; 42*d620effbSBenjamin Kietzman dbus_error_init(&error); 43*d620effbSBenjamin Kietzman impl = dbus_connection_open(address.c_str(), &error); 44*d620effbSBenjamin Kietzman //TODO actually deal with that error 45*d620effbSBenjamin Kietzman 46*d620effbSBenjamin Kietzman dbus_connection_set_watch_functions(impl, 47*d620effbSBenjamin Kietzman &add_watch, &remove_watch, &watch_toggled, &io, NULL); 48*d620effbSBenjamin Kietzman 49*d620effbSBenjamin Kietzman dbus_connection_set_timeout_functions(impl, 50*d620effbSBenjamin Kietzman &add_timeout, &remove_timeout, &timeout_toggled, &io, NULL); 51*d620effbSBenjamin Kietzman 52*d620effbSBenjamin Kietzman dbus_connection_set_dispatch_status_function(impl, 53*d620effbSBenjamin Kietzman &dispatch_status, &io, NULL); 54*d620effbSBenjamin Kietzman 55*d620effbSBenjamin Kietzman dispatch_status(impl, 56*d620effbSBenjamin Kietzman dbus_connection_get_dispatch_status(impl), &io); 57*d620effbSBenjamin Kietzman } 58*d620effbSBenjamin Kietzman 59*d620effbSBenjamin Kietzman void open(implementation_type& impl, 60*d620effbSBenjamin Kietzman const unsigned bus_type = DBUS_BUS_SYSTEM, 61*d620effbSBenjamin Kietzman bool shared=true) 62*d620effbSBenjamin Kietzman { 63*d620effbSBenjamin Kietzman io_service& io = this->get_io_service(); 64*d620effbSBenjamin Kietzman 65*d620effbSBenjamin Kietzman using namespace detail; 66*d620effbSBenjamin Kietzman 67*d620effbSBenjamin Kietzman DBusError error; 68*d620effbSBenjamin Kietzman dbus_error_init(&error); 69*d620effbSBenjamin Kietzman impl = dbus_bus_get(bus_type, &error); 70*d620effbSBenjamin Kietzman //TODO actually deal with that error 71*d620effbSBenjamin Kietzman 72*d620effbSBenjamin Kietzman dbus_connection_set_watch_functions(impl, 73*d620effbSBenjamin Kietzman &add_watch, &remove_watch, &watch_toggled, &io, NULL); 74*d620effbSBenjamin Kietzman 75*d620effbSBenjamin Kietzman dbus_connection_set_timeout_functions(impl, 76*d620effbSBenjamin Kietzman &add_timeout, &remove_timeout, &timeout_toggled, &io, NULL); 77*d620effbSBenjamin Kietzman 78*d620effbSBenjamin Kietzman dbus_connection_set_dispatch_status_function(impl, 79*d620effbSBenjamin Kietzman &dispatch_status, &io, NULL); 80*d620effbSBenjamin Kietzman 81*d620effbSBenjamin Kietzman dispatch_status(impl, 82*d620effbSBenjamin Kietzman dbus_connection_get_dispatch_status(impl), &io); 83*d620effbSBenjamin Kietzman } 84*d620effbSBenjamin Kietzman 85*d620effbSBenjamin Kietzman template <typename Duration> 86*d620effbSBenjamin Kietzman message send(implementation_type& impl, 87*d620effbSBenjamin Kietzman message& m, 88*d620effbSBenjamin Kietzman const Duration& timeout) 89*d620effbSBenjamin Kietzman { 90*d620effbSBenjamin Kietzman //TODO generically convert timeout to milliseconds 91*d620effbSBenjamin Kietzman if(timeout == 0) { 92*d620effbSBenjamin Kietzman //TODO this can return false if it failed 93*d620effbSBenjamin Kietzman dbus_connection_send(impl, m, &m.serial); 94*d620effbSBenjamin Kietzman return message(); 95*d620effbSBenjamin Kietzman } else { 96*d620effbSBenjamin Kietzman DBusError error; 97*d620effbSBenjamin Kietzman dbus_error_init(&error); 98*d620effbSBenjamin Kietzman return dbus_connection_send_with_reply_and_block(impl, 99*d620effbSBenjamin Kietzman m, timeout, &error); 100*d620effbSBenjamin Kietzman //TODO deal with that error 101*d620effbSBenjamin Kietzman } 102*d620effbSBenjamin Kietzman } 103*d620effbSBenjamin Kietzman 104*d620effbSBenjamin Kietzman template<typename MessageHandler> 105*d620effbSBenjamin Kietzman inline BOOST_ASIO_INITFN_RESULT_TYPE(MessageHandler, 106*d620effbSBenjamin Kietzman void(boost::system::error_code, message)) 107*d620effbSBenjamin Kietzman async_send(implementation_type& impl, 108*d620effbSBenjamin Kietzman message& m, 109*d620effbSBenjamin Kietzman BOOST_ASIO_MOVE_ARG(MessageHandler) handler) 110*d620effbSBenjamin Kietzman { 111*d620effbSBenjamin Kietzman DBusPendingCall *p; 112*d620effbSBenjamin Kietzman //TODO set up p with handler etc. 113*d620effbSBenjamin Kietzman dbus_connection_send_with_reply(impl, 114*d620effbSBenjamin Kietzman m, &p, -1); 115*d620effbSBenjamin Kietzman } 116*d620effbSBenjamin Kietzman 117*d620effbSBenjamin Kietzman }; 118*d620effbSBenjamin Kietzman 119*d620effbSBenjamin Kietzman io_service::id connection_service::id; 120*d620effbSBenjamin Kietzman 121*d620effbSBenjamin Kietzman } // namespace dbus 122