implement client C binding
parent
168b5fdfea
commit
f261621c68
@ -0,0 +1,33 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Непрозрачный тип для RPC клиента (обёртка над IpcPipeChannel)
|
||||||
|
typedef struct RpcClient RpcClient;
|
||||||
|
|
||||||
|
// Непрозрачный тип для маршаллера (обёртка над IpcMarshaller)
|
||||||
|
typedef struct IpcMarshallerHandle IpcMarshallerHandle;
|
||||||
|
|
||||||
|
// Создание RPC клиента
|
||||||
|
// read_pipe - путь к FIFO для чтения ответов
|
||||||
|
// write_pipe - путь к FIFO для отправки запросов
|
||||||
|
// Возвращает указатель на клиент или NULL при ошибке
|
||||||
|
RpcClient* rpc_client_create(const char* read_pipe, const char* write_pipe);
|
||||||
|
|
||||||
|
// Уничтожение RPC клиента
|
||||||
|
void rpc_client_destroy(RpcClient* client);
|
||||||
|
|
||||||
|
// Создание маршаллера для конкретного объекта
|
||||||
|
// client - RPC клиент
|
||||||
|
// object_id - идентификатор удалённого объекта
|
||||||
|
// Возвращает указатель на маршаллер или NULL при ошибке
|
||||||
|
IpcMarshallerHandle* rpc_client_create_marshaller(RpcClient* client, int object_id);
|
||||||
|
|
||||||
|
// Уничтожение маршаллера
|
||||||
|
void rpc_marshaller_destroy(IpcMarshallerHandle* marshaller);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
@ -0,0 +1,45 @@
|
|||||||
|
#include "{{ cls.name }}Client_c.h"
|
||||||
|
#include "rpc/rpc_client_c_impl.h"
|
||||||
|
#include "ipc/IpcMarshaller.h"
|
||||||
|
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
struct {{ cls.name }}Client {
|
||||||
|
IpcMarshaller* marshaller;
|
||||||
|
|
||||||
|
{{ cls.name }}Client(IpcMarshaller* m) : marshaller(m) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
{{ cls.name }}Client* {{ cls.name|lower }}_client_create(IpcMarshallerHandle* marshaller) {
|
||||||
|
if (!marshaller || !marshaller->marshaller) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return new {{ cls.name }}Client(marshaller->marshaller);
|
||||||
|
} catch (...) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void {{ cls.name|lower }}_client_destroy({{ cls.name }}Client* client) {
|
||||||
|
if (client) {
|
||||||
|
delete client;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{% for m in cls.methods %}
|
||||||
|
{{ m.return_type }} {{ cls.name|lower }}_{{ m.name }}({{ cls.name }}Client* client{% for a in m.args %}, {{ a.type }} {{ a.name }}{% endfor %}) {
|
||||||
|
if (!client || !client->marshaller) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return client->marshaller->template callTyped<{{ m.return_type }}>("{{ cls.name }}.{{ m.name }}"{% for a in m.args %}, {{ a.name }}{% endfor %});
|
||||||
|
} catch (...) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
} // extern "C"
|
||||||
@ -0,0 +1,32 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "rpc/rpc_client_c.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Непрозрачный тип для клиента {{ cls.name }}
|
||||||
|
typedef struct {{ cls.name }}Client {{ cls.name }}Client;
|
||||||
|
|
||||||
|
// Создание клиента {{ cls.name }}
|
||||||
|
// marshaller - маршаллер, созданный через rpc_client_create_marshaller
|
||||||
|
// Возвращает указатель на клиент или NULL при ошибке
|
||||||
|
{{ cls.name }}Client* {{ cls.name|lower }}_client_create(IpcMarshallerHandle* marshaller);
|
||||||
|
|
||||||
|
// Уничтожение клиента {{ cls.name }}
|
||||||
|
void {{ cls.name|lower }}_client_destroy({{ cls.name }}Client* client);
|
||||||
|
|
||||||
|
{% for m in cls.methods %}
|
||||||
|
// Вызов метода {{ m.name }}
|
||||||
|
// client - клиент {{ cls.name }}
|
||||||
|
{% for a in m.args %}
|
||||||
|
// {{ a.name }} - {{ a.type }} аргумент
|
||||||
|
{% endfor %}
|
||||||
|
// Возвращает результат или -1 при ошибке
|
||||||
|
{{ m.return_type }} {{ cls.name|lower }}_{{ m.name }}({{ cls.name }}Client* client{% for a in m.args %}, {{ a.type }} {{ a.name }}{% endfor %});
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
Loading…
Reference in New Issue