1a3cc3d57SBenjamin Kietzman// Copyright (c) Benjamin Kietzman (github.com/bkietz) 2a3cc3d57SBenjamin Kietzman// 3a3cc3d57SBenjamin Kietzman// Distributed under the Boost Software License, Version 1.0. (See accompanying 4a3cc3d57SBenjamin Kietzman// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 5a3cc3d57SBenjamin Kietzman 6a3cc3d57SBenjamin Kietzman#ifndef DBUS_CONNECTION_IPP 7a3cc3d57SBenjamin Kietzman#define DBUS_CONNECTION_IPP 8a3cc3d57SBenjamin Kietzman 9a3cc3d57SBenjamin Kietzman#include <dbus/dbus.h> 10a3cc3d57SBenjamin Kietzman#include <dbus/detail/watch_timeout.hpp> 11a3cc3d57SBenjamin Kietzman 12a3cc3d57SBenjamin Kietzman#include <boost/intrusive_ptr.hpp> 13a3cc3d57SBenjamin Kietzman 14a3cc3d57SBenjamin Kietzmanvoid intrusive_ptr_add_ref(DBusConnection *c) 15a3cc3d57SBenjamin Kietzman{ 16a3cc3d57SBenjamin Kietzman dbus_connection_ref(c); 17a3cc3d57SBenjamin Kietzman} 18a3cc3d57SBenjamin Kietzman 19a3cc3d57SBenjamin Kietzmanvoid intrusive_ptr_release(DBusConnection *c) 20a3cc3d57SBenjamin Kietzman{ 21a3cc3d57SBenjamin Kietzman dbus_connection_unref(c); 22a3cc3d57SBenjamin Kietzman} 23a3cc3d57SBenjamin Kietzman 24a3cc3d57SBenjamin Kietzmannamespace dbus { 25a3cc3d57SBenjamin Kietzmannamespace impl { 26a3cc3d57SBenjamin Kietzman 27a3cc3d57SBenjamin Kietzmanclass connection 28a3cc3d57SBenjamin Kietzman{ 29a3cc3d57SBenjamin Kietzmanpublic: 30a3cc3d57SBenjamin Kietzman boost::intrusive_ptr<DBusConnection> conn; 31a3cc3d57SBenjamin Kietzman bool is_shared; 32a3cc3d57SBenjamin Kietzman bool is_paused; 33a3cc3d57SBenjamin Kietzman 34a3cc3d57SBenjamin Kietzman connection() 35a3cc3d57SBenjamin Kietzman { 36a3cc3d57SBenjamin Kietzman } 37a3cc3d57SBenjamin Kietzman 38a3cc3d57SBenjamin Kietzman connection(boost::asio::io_service& io, int bus, bool shared) 39a3cc3d57SBenjamin Kietzman : is_shared(shared), 40a3cc3d57SBenjamin Kietzman is_paused(true) 41a3cc3d57SBenjamin Kietzman { 42a3cc3d57SBenjamin Kietzman error e; 43a3cc3d57SBenjamin Kietzman if(is_shared) 44a3cc3d57SBenjamin Kietzman { 45a3cc3d57SBenjamin Kietzman conn = dbus_bus_get((DBusBusType)bus, e); 46a3cc3d57SBenjamin Kietzman } 47a3cc3d57SBenjamin Kietzman else 48a3cc3d57SBenjamin Kietzman { 49a3cc3d57SBenjamin Kietzman conn = dbus_bus_get_private((DBusBusType)bus, e); 50a3cc3d57SBenjamin Kietzman } 51a3cc3d57SBenjamin Kietzman e.throw_if_set(); 52a3cc3d57SBenjamin Kietzman 53a3cc3d57SBenjamin Kietzman dbus_connection_set_exit_on_disconnect(conn.get(), false); 54a3cc3d57SBenjamin Kietzman 55a3cc3d57SBenjamin Kietzman detail::set_watch_timeout_dispatch_functions(conn.get(), io); 56a3cc3d57SBenjamin Kietzman } 57a3cc3d57SBenjamin Kietzman 58a3cc3d57SBenjamin Kietzman connection(boost::asio::io_service& io, const string& address, bool shared) 59a3cc3d57SBenjamin Kietzman : is_shared(shared), 60a3cc3d57SBenjamin Kietzman is_paused(true) 61a3cc3d57SBenjamin Kietzman { 62a3cc3d57SBenjamin Kietzman error e; 63a3cc3d57SBenjamin Kietzman if(shared) 64a3cc3d57SBenjamin Kietzman { 65a3cc3d57SBenjamin Kietzman conn = dbus_connection_open(address.c_str(), e); 66a3cc3d57SBenjamin Kietzman } 67a3cc3d57SBenjamin Kietzman else 68a3cc3d57SBenjamin Kietzman { 69a3cc3d57SBenjamin Kietzman conn = dbus_connection_open_private(address.c_str(), e); 70a3cc3d57SBenjamin Kietzman } 71*2003615dSBenjamin Kietzman e.throw_if_set(); 72a3cc3d57SBenjamin Kietzman 73*2003615dSBenjamin Kietzman dbus_bus_register(conn.get(), e); 74a3cc3d57SBenjamin Kietzman e.throw_if_set(); 75a3cc3d57SBenjamin Kietzman 76a3cc3d57SBenjamin Kietzman dbus_connection_set_exit_on_disconnect(conn.get(), false); 77a3cc3d57SBenjamin Kietzman 78a3cc3d57SBenjamin Kietzman detail::set_watch_timeout_dispatch_functions(conn.get(), io); 79a3cc3d57SBenjamin Kietzman } 80a3cc3d57SBenjamin Kietzman 81a3cc3d57SBenjamin Kietzman ~connection() 82a3cc3d57SBenjamin Kietzman { 83a3cc3d57SBenjamin Kietzman if(!is_shared) dbus_connection_close(conn.get()); 84a3cc3d57SBenjamin Kietzman } 85a3cc3d57SBenjamin Kietzman 86a3cc3d57SBenjamin Kietzman operator DBusConnection *() 87a3cc3d57SBenjamin Kietzman { 88a3cc3d57SBenjamin Kietzman return conn.get(); 89a3cc3d57SBenjamin Kietzman } 90a3cc3d57SBenjamin Kietzman operator const DBusConnection *() const 91a3cc3d57SBenjamin Kietzman { 92a3cc3d57SBenjamin Kietzman return conn.get(); 93a3cc3d57SBenjamin Kietzman } 94a3cc3d57SBenjamin Kietzman 95*2003615dSBenjamin Kietzman // begin asynchronous operation 96*2003615dSBenjamin Kietzman //FIXME should not get io from an argument 97*2003615dSBenjamin Kietzman void start(boost::asio::io_service& io) 98a3cc3d57SBenjamin Kietzman { 99*2003615dSBenjamin Kietzman if(is_paused) 100*2003615dSBenjamin Kietzman { 101*2003615dSBenjamin Kietzman is_paused = false; 102*2003615dSBenjamin Kietzman io.post(detail::dispatch_handler(io, conn.get())); 103*2003615dSBenjamin Kietzman } 104a3cc3d57SBenjamin Kietzman } 105a3cc3d57SBenjamin Kietzman}; 106a3cc3d57SBenjamin Kietzman 107a3cc3d57SBenjamin Kietzman} // namespace impl 108a3cc3d57SBenjamin Kietzman} // namespace dbus 109a3cc3d57SBenjamin Kietzman 110a3cc3d57SBenjamin Kietzman#endif // DBUS_CONNECTION_IPP 111