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