xref: /openbmc/boost-dbus/include/dbus/connection_service.hpp (revision d620effb340c7f10b9e336927d4a8aa8eda2bdf8)
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