MOS Source Code
Loading...
Searching...
No Matches
rpc_server++.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-3.0-or-later
2
3#pragma once
4
5#include <stdexcept>
6#if defined(__MOS_KERNEL__) || !defined(__cplusplus)
7#error "This file is only for use in C++ userspace code"
8#endif
9
10#include "librpc/rpc_server.h"
11
12#include <pb_decode.h> // RPC_DECL_SERVER_INTERFACE_CLASS needs pb_decode.h
13#include <string>
14
16{
17 public:
18 explicit RPCServer(const std::string &server_name, const rpc_function_info_t *functions, size_t count) : server_name(server_name)
19 {
20 const auto redirector = [](rpc_context_t *context)
21 {
22 const auto fid = rpc_context_get_function_id(context);
23 const auto userdata = rpc_server_get_data(rpc_context_get_server(context));
24 return ((RPCServer *) userdata)->dispatcher(context, fid);
25 };
26
27 const auto redirector_on_connect = [](rpc_context_t *context)
28 {
29 const auto userdata = rpc_server_get_data(rpc_context_get_server(context));
30 ((RPCServer *) userdata)->on_connect(context);
31 };
32
33 const auto redirector_on_disconnect = [](rpc_context_t *context)
34 {
35 const auto userdata = rpc_server_get_data(rpc_context_get_server(context));
36 ((RPCServer *) userdata)->on_disconnect(context);
37 };
38
39 rpc_function_info_t *redirect_functions = (rpc_function_info_t *) alloca(sizeof(rpc_function_info_t) * count);
40 for (size_t i = 0; i < count; i++)
41 {
42 redirect_functions[i] = functions[i];
43 redirect_functions[i].func = redirector;
44 }
45
46 server = rpc_server_create(server_name.c_str(), this);
47 if (!server)
48 {
49 throw std::runtime_error("Failed to create RPC server: " + server_name + " (" + strerror(errno) + ")");
50 }
51
52 rpc_server_set_on_connect(server, redirector_on_connect);
53 rpc_server_set_on_disconnect(server, redirector_on_disconnect);
54 rpc_server_register_functions(server, redirect_functions, count);
55 }
56
57 virtual ~RPCServer()
58 {
60 }
61
62 void run()
63 {
65 }
66
67 std::string get_name() const
68 {
69 return server_name;
70 }
71
72 protected:
73 virtual rpc_result_code_t dispatcher(rpc_context_t *context, u32 funcid) = 0;
74
75 virtual void on_connect(rpc_context_t *)
76 {
77 }
78
79 virtual void on_disconnect(rpc_context_t *)
80 {
81 }
82
83 protected:
84 template<typename T>
85 T *get_data(rpc_context_t *context)
86 {
87 return (T *) rpc_context_get_data(context);
88 }
89
90 template<typename T>
91 void set_data(rpc_context_t *context, T *data)
92 {
93 rpc_context_set_data(context, data);
94 }
95
96 private:
98 std::string server_name;
99};
std::string get_name() const
virtual void on_disconnect(rpc_context_t *)
void set_data(rpc_context_t *context, T *data)
virtual ~RPCServer()
RPCServer(const std::string &server_name, const rpc_function_info_t *functions, size_t count)
T * get_data(rpc_context_t *context)
virtual rpc_result_code_t dispatcher(rpc_context_t *context, u32 funcid)=0
std::string server_name
virtual void on_connect(rpc_context_t *)
rpc_server_t * server
rpc_result_code_t
Definition rpc.h:25
MOSAPI rpc_server_t * rpc_server_create(const char *server_name, void *data)
Create a new RPC server.
MOSAPI void * rpc_context_set_data(rpc_context_t *context, void *data)
Set the context data for an RPC client.
MOSAPI bool rpc_server_register_functions(rpc_server_t *server, const rpc_function_info_t *functions, size_t count)
Register multiple functions with the server.
MOSAPI void rpc_server_close(rpc_server_t *server)
Close the RPC server.
MOSAPI void * rpc_server_get_data(rpc_server_t *server)
Get the user data for the server.
MOSAPI int rpc_context_get_function_id(const rpc_context_t *context)
Get the function ID for an RPC call context.
MOSAPI void * rpc_context_get_data(const rpc_context_t *context)
Get the context data for an RPC context.
MOSAPI void rpc_server_exec(rpc_server_t *server)
Run the server, this function will not return until the server is destroyed.
MOSAPI void rpc_server_set_on_connect(rpc_server_t *server, rpc_server_on_connect_t on_connect)
Sets the callback function to be called when a client connects to the RPC server.
MOSAPI rpc_server_t * rpc_context_get_server(const rpc_context_t *context)
Get the RPC server instance for an RPC call context.
MOSAPI void rpc_server_set_on_disconnect(rpc_server_t *server, rpc_server_on_disconnect_t on_disconnect)
Sets the callback function to be called when a client disconnects from the RPC server.
rpc_function_t func
Definition rpc_server.h:22
unsigned int u32
Definition types.h:17