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