aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/deps/rpclib/include/rpc/this_handler.h
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/deps/rpclib/include/rpc/this_handler.h')
-rw-r--r--host/lib/deps/rpclib/include/rpc/this_handler.h82
1 files changed, 82 insertions, 0 deletions
diff --git a/host/lib/deps/rpclib/include/rpc/this_handler.h b/host/lib/deps/rpclib/include/rpc/this_handler.h
new file mode 100644
index 000000000..b5e602fb7
--- /dev/null
+++ b/host/lib/deps/rpclib/include/rpc/this_handler.h
@@ -0,0 +1,82 @@
+#pragma once
+
+#ifndef HANDLER_H_BZ8DT5WS
+#define HANDLER_H_BZ8DT5WS
+
+#include <memory>
+
+#include "rpc/config.h"
+#include "rpc/msgpack.hpp"
+
+#include "rpc/detail/util.h"
+
+namespace rpc {
+
+namespace detail {
+class server_session;
+class handler_error {};
+class handler_spec_response {};
+}
+
+//! \brief Encapsulates information about the currently executing
+//! handler. This is the interface through which bound functions
+//! may return errors, arbitrary type responses or prohibit sending a response.
+//! \note Setting each property of the handler is only relevant
+//! for one call in one thread. If the same handler is executing concurrently
+//! in a different thread, you can safely set different properties
+//! and everything will "just work".
+class this_handler_t {
+public:
+ //! \brief Sets an arbitrary object to be sent back as an error
+ //! response to the client.
+ //! \param err_obj The error object. This can be anything that
+ //! is possible to encode with messagepack (even custom structures).
+ //! \tparam T The type of the error object.
+ template <typename T> void respond_error(T &&err_obj);
+
+ //! \brief Sets an arbitrary object to be sent back as the response
+ //! to the call.
+ //! \param resp_obj The response object. This can be anything that
+ //! is possible to encode with messagepack (even custom structures).
+ //! \tparam T The type of the response object.
+ //! \note The normal return value of the function (if any) will be
+ //! ignored if a special response is set.
+ //! \note You can use clear_special_response() to clear the special
+ //! response and use the normal return value.
+ template <typename T> void respond(T &&resp_obj);
+
+ //! \brief Instructs the server to not send a response to the client
+ //! (ignoring any errors and return values).
+ //! \note It is unusual to not send a response to requests, and doing so
+ //! might cause problems in the client (depending on its implementation).
+ void disable_response();
+
+ //! \brief Enables sending a response to the call. Sending the response
+ //! is by default enabled. Enabling the response multiple times have
+ //! no effect.
+ void enable_response();
+
+ //! \brief Sets all state of the object to default.
+ void clear();
+
+ friend class rpc::detail::server_session;
+
+private:
+ RPCLIB_MSGPACK::object_handle error_, resp_;
+ bool resp_enabled_ = true;
+};
+}
+
+#include "this_handler.inl"
+
+namespace rpc {
+//! \brief A thread-local object that can be used to control
+//! the behavior of the server w.r.t. the handler. Accessing this object
+//! from handlers that execute the same function concurrently is safe.
+//! \note Accessing this object outside of handlers while a server is
+//! running is potentially unsafe.
+this_handler_t &this_handler();
+}
+
+#endif /* end of include guard: HANDLER_H_BZ8DT5WS */
+