aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/deps/rpclib/include/rpc/client.inl
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/deps/rpclib/include/rpc/client.inl')
-rw-r--r--host/lib/deps/rpclib/include/rpc/client.inl65
1 files changed, 65 insertions, 0 deletions
diff --git a/host/lib/deps/rpclib/include/rpc/client.inl b/host/lib/deps/rpclib/include/rpc/client.inl
new file mode 100644
index 000000000..4ff33294d
--- /dev/null
+++ b/host/lib/deps/rpclib/include/rpc/client.inl
@@ -0,0 +1,65 @@
+namespace rpc {
+
+template <typename... Args>
+RPCLIB_MSGPACK::object_handle client::call(std::string const &func_name,
+ Args... args) {
+ RPCLIB_CREATE_LOG_CHANNEL(client)
+ auto future = async_call(func_name, std::forward<Args>(args)...);
+ auto wait_result = future.wait_for(std::chrono::milliseconds(get_timeout()));
+
+ if (wait_result == std::future_status::timeout) {
+ throw_timeout(func_name);
+ }
+
+ return future.get();
+}
+
+template <typename... Args>
+std::future<RPCLIB_MSGPACK::object_handle>
+client::async_call(std::string const &func_name, Args... args) {
+ RPCLIB_CREATE_LOG_CHANNEL(client)
+ wait_conn();
+ using RPCLIB_MSGPACK::object;
+ LOG_DEBUG("Calling {}", func_name);
+
+ auto args_obj = std::make_tuple(args...);
+ const int idx = get_next_call_idx();
+ auto call_obj =
+ std::make_tuple(static_cast<uint8_t>(client::request_type::call), idx,
+ func_name, args_obj);
+
+ auto buffer = std::make_shared<RPCLIB_MSGPACK::sbuffer>();
+ RPCLIB_MSGPACK::pack(*buffer, call_obj);
+
+ // TODO: Change to move semantics when asio starts supporting move-only
+ // handlers in post(). [sztomi, 2016-02-14]
+ auto p = std::make_shared<std::promise<RPCLIB_MSGPACK::object_handle>>();
+ auto ft = p->get_future();
+
+ post(buffer, idx, func_name, p);
+
+ return ft;
+}
+
+//! \brief Sends a notification with the given name and arguments (if any).
+//! \param func_name The name of the notification to call.
+//! \param args The arguments to pass to the function.
+//! \note This function returns when the notification is written to the
+//! socket.
+//! \tparam Args THe types of the arguments.
+template <typename... Args>
+void client::send(std::string const &func_name, Args... args) {
+ RPCLIB_CREATE_LOG_CHANNEL(client)
+ LOG_DEBUG("Sending notification {}", func_name);
+
+ auto args_obj = std::make_tuple(args...);
+ auto call_obj = std::make_tuple(
+ static_cast<uint8_t>(client::request_type::notification), func_name,
+ args_obj);
+
+ auto buffer = new RPCLIB_MSGPACK::sbuffer;
+ RPCLIB_MSGPACK::pack(*buffer, call_obj);
+
+ post(buffer);
+}
+}