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