improve interfaces

Make an interface structure to hold methods and events.
Move interface setup to protocol
This commit is contained in:
Wim Taymans 2017-03-09 13:00:56 +01:00
parent 905743dac6
commit 7ad02f553a
13 changed files with 341 additions and 255 deletions

View file

@ -158,7 +158,7 @@ core_event_remove_id (void *object,
} }
} }
static const PinosCoreEvent core_events = { static const PinosCoreEvents core_events = {
&core_event_info, &core_event_info,
&core_event_done, &core_event_done,
&core_event_error, &core_event_error,
@ -189,7 +189,7 @@ module_event_info (void *object,
proxy->id); proxy->id);
} }
static const PinosModuleEvent module_events = { static const PinosModuleEvents module_events = {
&module_event_info, &module_event_info,
}; };
@ -223,7 +223,7 @@ node_event_info (void *object,
proxy->id); proxy->id);
} }
static const PinosNodeEvent node_events = { static const PinosNodeEvents node_events = {
&node_event_done, &node_event_done,
&node_event_info &node_event_info
}; };
@ -252,7 +252,7 @@ client_event_info (void *object,
proxy->id); proxy->id);
} }
static const PinosClientEvent client_events = { static const PinosClientEvents client_events = {
&client_event_info &client_event_info
}; };
@ -280,7 +280,7 @@ link_event_info (void *object,
proxy->id); proxy->id);
} }
static const PinosLinkEvent link_events = { static const PinosLinkEvents link_events = {
&link_event_info &link_event_info
}; };
@ -302,9 +302,7 @@ registry_event_global (void *object,
if (proxy == NULL) if (proxy == NULL)
goto no_mem; goto no_mem;
proxy->event = &node_events; proxy->implementation = &node_events;
proxy->demarshal = &pinos_protocol_native_client_node_demarshal;
proxy->interface = NULL;
} else if (!strcmp (type, PINOS_MODULE_URI)) { } else if (!strcmp (type, PINOS_MODULE_URI)) {
proxy = pinos_proxy_new (this, proxy = pinos_proxy_new (this,
SPA_ID_INVALID, SPA_ID_INVALID,
@ -312,9 +310,7 @@ registry_event_global (void *object,
if (proxy == NULL) if (proxy == NULL)
goto no_mem; goto no_mem;
proxy->event = &module_events; proxy->implementation = &module_events;
proxy->demarshal = &pinos_protocol_native_client_module_demarshal;
proxy->interface = NULL;
} else if (!strcmp (type, PINOS_CLIENT_URI)) { } else if (!strcmp (type, PINOS_CLIENT_URI)) {
proxy = pinos_proxy_new (this, proxy = pinos_proxy_new (this,
SPA_ID_INVALID, SPA_ID_INVALID,
@ -322,9 +318,7 @@ registry_event_global (void *object,
if (proxy == NULL) if (proxy == NULL)
goto no_mem; goto no_mem;
proxy->event = &client_events; proxy->implementation = &client_events;
proxy->demarshal = &pinos_protocol_native_client_client_demarshal;
proxy->interface = NULL;
} else if (!strcmp (type, PINOS_LINK_URI)) { } else if (!strcmp (type, PINOS_LINK_URI)) {
proxy = pinos_proxy_new (this, proxy = pinos_proxy_new (this,
SPA_ID_INVALID, SPA_ID_INVALID,
@ -332,12 +326,11 @@ registry_event_global (void *object,
if (proxy == NULL) if (proxy == NULL)
goto no_mem; goto no_mem;
proxy->event = &link_events; proxy->implementation = &link_events;
proxy->demarshal = &pinos_protocol_native_client_link_demarshal;
proxy->interface = NULL;
} }
if (proxy) if (proxy) {
pinos_registry_do_bind (this->registry_proxy, id, proxy->id); pinos_registry_do_bind (this->registry_proxy, id, proxy->id);
}
return; return;
@ -362,11 +355,13 @@ registry_event_global_remove (void *object,
id); id);
} }
static const PinosRegistryEvent registry_events = { static const PinosRegistryEvents registry_events = {
&registry_event_global, &registry_event_global,
&registry_event_global_remove &registry_event_global_remove
}; };
typedef bool (*PinosDemarshalFunc) (void *object, void *data, size_t size);
static void static void
on_context_data (SpaSource *source, on_context_data (SpaSource *source,
int fd, int fd,
@ -375,6 +370,7 @@ on_context_data (SpaSource *source,
{ {
PinosContextImpl *impl = data; PinosContextImpl *impl = data;
PinosContext *this = &impl->this; PinosContext *this = &impl->this;
PinosConnection *conn = impl->connection;
if (mask & (SPA_IO_ERR | SPA_IO_HUP)) { if (mask & (SPA_IO_ERR | SPA_IO_HUP)) {
context_set_state (this, context_set_state (this,
@ -384,7 +380,6 @@ on_context_data (SpaSource *source,
} }
if (mask & SPA_IO_IN) { if (mask & SPA_IO_IN) {
PinosConnection *conn = impl->connection;
uint8_t opcode; uint8_t opcode;
uint32_t id; uint32_t id;
uint32_t size; uint32_t size;
@ -399,12 +394,19 @@ on_context_data (SpaSource *source,
pinos_log_error ("context %p: could not find proxy %u", this, id); pinos_log_error ("context %p: could not find proxy %u", this, id);
continue; continue;
} }
if (opcode >= proxy->iface->n_events) {
pinos_log_error ("context %p: invalid method %u", this, opcode);
continue;
}
pinos_log_debug ("context %p: object demarshal %u, %u", this, id, opcode); pinos_log_debug ("context %p: object demarshal %u, %u", this, id, opcode);
demarshal = proxy->demarshal; demarshal = proxy->iface->events;
if (demarshal[opcode]) { if (demarshal[opcode]) {
if (!demarshal[opcode] (proxy, message, size)) if (!demarshal[opcode] (proxy, message, size)) {
pinos_log_error ("context %p: invalid message received", this); pinos_log_error ("context %p: invalid message received %u", this, opcode);
spa_debug_pod (message);
}
} else } else
pinos_log_error ("context %p: function %d not implemented", this, opcode); pinos_log_error ("context %p: function %d not implemented", this, opcode);
@ -596,9 +598,7 @@ pinos_context_connect_fd (PinosContext *context,
if (context->core_proxy == NULL) if (context->core_proxy == NULL)
goto no_proxy; goto no_proxy;
context->core_proxy->event = &core_events; context->core_proxy->implementation = &core_events;
context->core_proxy->interface = &pinos_protocol_native_client_core_interface;
context->core_proxy->demarshal = &pinos_protocol_native_client_core_demarshal;
pinos_core_do_client_update (context->core_proxy, pinos_core_do_client_update (context->core_proxy,
&context->properties->dict); &context->properties->dict);
@ -609,9 +609,7 @@ pinos_context_connect_fd (PinosContext *context,
if (context->registry_proxy == NULL) if (context->registry_proxy == NULL)
goto no_registry; goto no_registry;
context->registry_proxy->event = &registry_events; context->registry_proxy->implementation = &registry_events;
context->registry_proxy->interface = &pinos_protocol_native_client_registry_interface;
context->registry_proxy->demarshal = &pinos_protocol_native_client_registry_demarshal;
pinos_core_do_get_registry (context->core_proxy, pinos_core_do_get_registry (context->core_proxy,
0, 0,

View file

@ -31,9 +31,17 @@ extern "C" {
#include <spa/node.h> #include <spa/node.h>
typedef struct _PinosClientNodeBuffer PinosClientNodeBuffer; typedef struct _PinosClientNodeBuffer PinosClientNodeBuffer;
typedef struct _PinosInterface PinosInterface;
#include <pinos/client/introspect.h> #include <pinos/client/introspect.h>
struct _PinosInterface {
uint32_t n_methods;
const void *methods;
uint32_t n_events;
const void *events;
};
typedef struct { typedef struct {
void (*client_update) (void *object, void (*client_update) (void *object,
const SpaDict *props); const SpaDict *props);
@ -53,13 +61,13 @@ typedef struct {
const char *name, const char *name,
const SpaDict *props, const SpaDict *props,
uint32_t new_id); uint32_t new_id);
} PinosCoreInterface; } PinosCoreMethods;
#define pinos_core_do_client_update(r,...) ((PinosCoreInterface*)r->interface)->client_update(r,__VA_ARGS__) #define pinos_core_do_client_update(r,...) ((PinosCoreMethods*)r->iface->methods)->client_update(r,__VA_ARGS__)
#define pinos_core_do_sync(r,...) ((PinosCoreInterface*)r->interface)->sync(r,__VA_ARGS__) #define pinos_core_do_sync(r,...) ((PinosCoreMethods*)r->iface->methods)->sync(r,__VA_ARGS__)
#define pinos_core_do_get_registry(r,...) ((PinosCoreInterface*)r->interface)->get_registry(r,__VA_ARGS__) #define pinos_core_do_get_registry(r,...) ((PinosCoreMethods*)r->iface->methods)->get_registry(r,__VA_ARGS__)
#define pinos_core_do_create_node(r,...) ((PinosCoreInterface*)r->interface)->create_node(r,__VA_ARGS__) #define pinos_core_do_create_node(r,...) ((PinosCoreMethods*)r->iface->methods)->create_node(r,__VA_ARGS__)
#define pinos_core_do_create_client_node(r,...) ((PinosCoreInterface*)r->interface)->create_client_node(r,__VA_ARGS__) #define pinos_core_do_create_client_node(r,...) ((PinosCoreMethods*)r->iface->methods)->create_client_node(r,__VA_ARGS__)
typedef struct { typedef struct {
void (*info) (void *object, void (*info) (void *object,
@ -72,20 +80,20 @@ typedef struct {
const char *error, ...); const char *error, ...);
void (*remove_id) (void *object, void (*remove_id) (void *object,
uint32_t id); uint32_t id);
} PinosCoreEvent; } PinosCoreEvents;
#define pinos_core_notify_info(r,...) ((PinosCoreEvent*)r->event)->info(r,__VA_ARGS__) #define pinos_core_notify_info(r,...) ((PinosCoreEvents*)r->iface->events)->info(r,__VA_ARGS__)
#define pinos_core_notify_done(r,...) ((PinosCoreEvent*)r->event)->done(r,__VA_ARGS__) #define pinos_core_notify_done(r,...) ((PinosCoreEvents*)r->iface->events)->done(r,__VA_ARGS__)
#define pinos_core_notify_error(r,...) ((PinosCoreEvent*)r->event)->error(r,__VA_ARGS__) #define pinos_core_notify_error(r,...) ((PinosCoreEvents*)r->iface->events)->error(r,__VA_ARGS__)
#define pinos_core_notify_remove_id(r,...) ((PinosCoreEvent*)r->event)->remove_id(r,__VA_ARGS__) #define pinos_core_notify_remove_id(r,...) ((PinosCoreEvents*)r->iface->events)->remove_id(r,__VA_ARGS__)
typedef struct { typedef struct {
void (*bind) (void *object, void (*bind) (void *object,
uint32_t id, uint32_t id,
uint32_t new_id); uint32_t new_id);
} PinosRegistryInterface; } PinosRegistryMethods;
#define pinos_registry_do_bind(r,...) ((PinosRegistryInterface*)r->interface)->bind(r,__VA_ARGS__) #define pinos_registry_do_bind(r,...) ((PinosRegistryMethods*)r->iface->methods)->bind(r,__VA_ARGS__)
typedef struct { typedef struct {
void (*global) (void *object, void (*global) (void *object,
@ -93,27 +101,27 @@ typedef struct {
const char *type); const char *type);
void (*global_remove) (void *object, void (*global_remove) (void *object,
uint32_t id); uint32_t id);
} PinosRegistryEvent; } PinosRegistryEvents;
#define pinos_registry_notify_global(r,...) ((PinosRegistryEvent*)r->event)->global(r,__VA_ARGS__) #define pinos_registry_notify_global(r,...) ((PinosRegistryEvents*)r->iface->events)->global(r,__VA_ARGS__)
#define pinos_registry_notify_global_remove(r,...) ((PinosRegistryEvent*)r->event)->global_remove(r,__VA_ARGS__) #define pinos_registry_notify_global_remove(r,...) ((PinosRegistryEvents*)r->iface->events)->global_remove(r,__VA_ARGS__)
typedef struct { typedef struct {
void (*info) (void *object, void (*info) (void *object,
PinosModuleInfo *info); PinosModuleInfo *info);
} PinosModuleEvent; } PinosModuleEvents;
#define pinos_module_notify_info(r,...) ((PinosModuleEvent*)r->event)->info(r,__VA_ARGS__) #define pinos_module_notify_info(r,...) ((PinosModuleEvents*)r->iface->events)->info(r,__VA_ARGS__)
typedef struct { typedef struct {
void (*done) (void *object, void (*done) (void *object,
uint32_t seq); uint32_t seq);
void (*info) (void *object, void (*info) (void *object,
PinosNodeInfo *info); PinosNodeInfo *info);
} PinosNodeEvent; } PinosNodeEvents;
#define pinos_node_notify_done(r,...) ((PinosNodeEvent*)r->event)->done(r,__VA_ARGS__) #define pinos_node_notify_done(r,...) ((PinosNodeEvents*)r->iface->events)->done(r,__VA_ARGS__)
#define pinos_node_notify_info(r,...) ((PinosNodeEvent*)r->event)->info(r,__VA_ARGS__) #define pinos_node_notify_info(r,...) ((PinosNodeEvents*)r->iface->events)->info(r,__VA_ARGS__)
struct _PinosClientNodeBuffer { struct _PinosClientNodeBuffer {
uint32_t mem_id; uint32_t mem_id;
@ -151,13 +159,13 @@ typedef struct {
SpaNodeEvent *event); SpaNodeEvent *event);
void (*destroy) (void *object, void (*destroy) (void *object,
uint32_t seq); uint32_t seq);
} PinosClientNodeInterface; } PinosClientNodeMethods;
#define pinos_client_node_do_update(r,...) ((PinosClientNodeInterface*)r->interface)->update(r,__VA_ARGS__) #define pinos_client_node_do_update(r,...) ((PinosClientNodeMethods*)r->iface->methods)->update(r,__VA_ARGS__)
#define pinos_client_node_do_port_update(r,...) ((PinosClientNodeInterface*)r->interface)->port_update(r,__VA_ARGS__) #define pinos_client_node_do_port_update(r,...) ((PinosClientNodeMethods*)r->iface->methods)->port_update(r,__VA_ARGS__)
#define pinos_client_node_do_state_change(r,...) ((PinosClientNodeInterface*)r->interface)->state_change(r,__VA_ARGS__) #define pinos_client_node_do_state_change(r,...) ((PinosClientNodeMethods*)r->iface->methods)->state_change(r,__VA_ARGS__)
#define pinos_client_node_do_event(r,...) ((PinosClientNodeInterface*)r->interface)->event(r,__VA_ARGS__) #define pinos_client_node_do_event(r,...) ((PinosClientNodeMethods*)r->iface->methods)->event(r,__VA_ARGS__)
#define pinos_client_node_do_destroy(r,...) ((PinosClientNodeInterface*)r->interface)->destroy(r,__VA_ARGS__) #define pinos_client_node_do_destroy(r,...) ((PinosClientNodeMethods*)r->iface->methods)->destroy(r,__VA_ARGS__)
typedef struct { typedef struct {
void (*done) (void *object, void (*done) (void *object,
@ -209,33 +217,33 @@ typedef struct {
int memfd, int memfd,
uint32_t offset, uint32_t offset,
uint32_t size); uint32_t size);
} PinosClientNodeEvent; } PinosClientNodeEvents;
#define pinos_client_node_notify_done(r,...) ((PinosClientNodeEvent*)r->event)->done(r,__VA_ARGS__) #define pinos_client_node_notify_done(r,...) ((PinosClientNodeEvents*)r->iface->events)->done(r,__VA_ARGS__)
#define pinos_client_node_notify_event(r,...) ((PinosClientNodeEvent*)r->event)->event(r,__VA_ARGS__) #define pinos_client_node_notify_event(r,...) ((PinosClientNodeEvents*)r->iface->events)->event(r,__VA_ARGS__)
#define pinos_client_node_notify_add_port(r,...) ((PinosClientNodeEvent*)r->event)->add_port(r,__VA_ARGS__) #define pinos_client_node_notify_add_port(r,...) ((PinosClientNodeEvents*)r->iface->events)->add_port(r,__VA_ARGS__)
#define pinos_client_node_notify_remove_port(r,...) ((PinosClientNodeEvent*)r->event)->remove_port(r,__VA_ARGS__) #define pinos_client_node_notify_remove_port(r,...) ((PinosClientNodeEvents*)r->iface->events)->remove_port(r,__VA_ARGS__)
#define pinos_client_node_notify_set_format(r,...) ((PinosClientNodeEvent*)r->event)->set_format(r,__VA_ARGS__) #define pinos_client_node_notify_set_format(r,...) ((PinosClientNodeEvents*)r->iface->events)->set_format(r,__VA_ARGS__)
#define pinos_client_node_notify_set_property(r,...) ((PinosClientNodeEvent*)r->event)->set_property(r,__VA_ARGS__) #define pinos_client_node_notify_set_property(r,...) ((PinosClientNodeEvents*)r->iface->events)->set_property(r,__VA_ARGS__)
#define pinos_client_node_notify_add_mem(r,...) ((PinosClientNodeEvent*)r->event)->add_mem(r,__VA_ARGS__) #define pinos_client_node_notify_add_mem(r,...) ((PinosClientNodeEvents*)r->iface->events)->add_mem(r,__VA_ARGS__)
#define pinos_client_node_notify_use_buffers(r,...) ((PinosClientNodeEvent*)r->event)->use_buffers(r,__VA_ARGS__) #define pinos_client_node_notify_use_buffers(r,...) ((PinosClientNodeEvents*)r->iface->events)->use_buffers(r,__VA_ARGS__)
#define pinos_client_node_notify_node_command(r,...) ((PinosClientNodeEvent*)r->event)->node_command(r,__VA_ARGS__) #define pinos_client_node_notify_node_command(r,...) ((PinosClientNodeEvents*)r->iface->events)->node_command(r,__VA_ARGS__)
#define pinos_client_node_notify_port_command(r,...) ((PinosClientNodeEvent*)r->event)->port_command(r,__VA_ARGS__) #define pinos_client_node_notify_port_command(r,...) ((PinosClientNodeEvents*)r->iface->events)->port_command(r,__VA_ARGS__)
#define pinos_client_node_notify_transport(r,...) ((PinosClientNodeEvent*)r->event)->transport(r,__VA_ARGS__) #define pinos_client_node_notify_transport(r,...) ((PinosClientNodeEvents*)r->iface->events)->transport(r,__VA_ARGS__)
typedef struct { typedef struct {
void (*info) (void *object, void (*info) (void *object,
PinosClientInfo *info); PinosClientInfo *info);
} PinosClientEvent; } PinosClientEvents;
#define pinos_client_notify_info(r,...) ((PinosClientEvent*)r->event)->info(r,__VA_ARGS__) #define pinos_client_notify_info(r,...) ((PinosClientEvents*)r->iface->events)->info(r,__VA_ARGS__)
typedef struct { typedef struct {
void (*info) (void *object, void (*info) (void *object,
PinosLinkInfo *info); PinosLinkInfo *info);
} PinosLinkEvent; } PinosLinkEvents;
#define pinos_link_notify_info(r,...) ((PinosLinkEvent*)r->event)->info(r,__VA_ARGS__) #define pinos_link_notify_info(r,...) ((PinosLinkEvents*)r->iface->events)->info(r,__VA_ARGS__)
#ifdef __cplusplus #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */

View file

@ -31,6 +31,8 @@ typedef struct {
PinosConnection *connection; PinosConnection *connection;
} Builder; } Builder;
typedef bool (*PinosDemarshalFunc) (void *object, void *data, size_t size);
static uint32_t static uint32_t
write_pod (SpaPODBuilder *b, uint32_t ref, const void *data, uint32_t size) write_pod (SpaPODBuilder *b, uint32_t ref, const void *data, uint32_t size)
{ {
@ -213,7 +215,7 @@ core_demarshal_info (void *object,
0)) 0))
return false; return false;
} }
pinos_core_notify_info (proxy, &info); ((PinosCoreEvents*)proxy->implementation)->info (proxy, &info);
return true; return true;
} }
@ -232,7 +234,7 @@ core_demarshal_done (void *object,
0)) 0))
return false; return false;
pinos_core_notify_done (proxy, seq); ((PinosCoreEvents*)proxy->implementation)->done (proxy, seq);
return true; return true;
} }
@ -254,7 +256,7 @@ core_demarshal_error (void *object,
0)) 0))
return false; return false;
pinos_core_notify_error (proxy, id, res, error); ((PinosCoreEvents*)proxy->implementation)->error (proxy, id, res, error);
return true; return true;
} }
@ -273,7 +275,7 @@ core_demarshal_remove_id (void *object,
0)) 0))
return false; return false;
pinos_core_notify_remove_id (proxy, id); ((PinosCoreEvents*)proxy->implementation)->remove_id (proxy, id);
return true; return true;
} }
@ -308,7 +310,7 @@ module_demarshal_info (void *object,
0)) 0))
return false; return false;
} }
pinos_module_notify_info (proxy, &info); ((PinosModuleEvents*)proxy->implementation)->info (proxy, &info);
return true; return true;
} }
@ -327,7 +329,7 @@ node_demarshal_done (void *object,
0)) 0))
return false; return false;
pinos_node_notify_done (proxy, seq); ((PinosNodeEvents*)proxy->implementation)->done (proxy, seq);
return true; return true;
} }
@ -386,7 +388,7 @@ node_demarshal_info (void *object,
0)) 0))
return false; return false;
} }
pinos_node_notify_info (proxy, &info); ((PinosNodeEvents*)proxy->implementation)->info (proxy, &info);
return true; return true;
} }
@ -551,7 +553,7 @@ client_node_demarshal_done (void *object,
return false; return false;
fd = pinos_connection_get_fd (connection, idx); fd = pinos_connection_get_fd (connection, idx);
pinos_client_node_notify_done (proxy, seq, fd); ((PinosClientNodeEvents*)proxy->implementation)->done (proxy, seq, fd);
return true; return true;
} }
@ -571,7 +573,7 @@ client_node_demarshal_event (void *object,
0)) 0))
return false; return false;
pinos_client_node_notify_event (proxy, event); ((PinosClientNodeEvents*)proxy->implementation)->event (proxy, event);
return true; return true;
} }
@ -592,7 +594,7 @@ client_node_demarshal_add_port (void *object,
0)) 0))
return false; return false;
pinos_client_node_notify_add_port (proxy, seq, direction, port_id); ((PinosClientNodeEvents*)proxy->implementation)->add_port (proxy, seq, direction, port_id);
return true; return true;
} }
@ -613,7 +615,7 @@ client_node_demarshal_remove_port (void *object,
0)) 0))
return false; return false;
pinos_client_node_notify_remove_port (proxy, seq, direction, port_id); ((PinosClientNodeEvents*)proxy->implementation)->remove_port (proxy, seq, direction, port_id);
return true; return true;
} }
@ -640,7 +642,7 @@ client_node_demarshal_set_format (void *object,
if (have_format && !spa_pod_iter_get (&it, SPA_POD_TYPE_OBJECT, &format, 0)) if (have_format && !spa_pod_iter_get (&it, SPA_POD_TYPE_OBJECT, &format, 0))
return false; return false;
pinos_client_node_notify_set_format (proxy, seq, direction, port_id, ((PinosClientNodeEvents*)proxy->implementation)->set_format (proxy, seq, direction, port_id,
flags, format); flags, format);
return true; return true;
} }
@ -664,7 +666,7 @@ client_node_demarshal_set_property (void *object,
0)) 0))
return false; return false;
pinos_client_node_notify_set_property (proxy, seq, id, s, value); ((PinosClientNodeEvents*)proxy->implementation)->set_property (proxy, seq, id, s, value);
return true; return true;
} }
@ -694,15 +696,15 @@ client_node_demarshal_add_mem (void *object,
memfd = pinos_connection_get_fd (connection, memfd_idx); memfd = pinos_connection_get_fd (connection, memfd_idx);
pinos_client_node_notify_add_mem (proxy, ((PinosClientNodeEvents*)proxy->implementation)->add_mem (proxy,
direction, direction,
port_id, port_id,
mem_id, mem_id,
type, type,
memfd, memfd,
flags, flags,
offset, offset,
sz); sz);
return true; return true;
} }
@ -768,12 +770,12 @@ client_node_demarshal_use_buffers (void *object,
d->data = SPA_UINT32_TO_PTR (data_id); d->data = SPA_UINT32_TO_PTR (data_id);
} }
} }
pinos_client_node_notify_use_buffers (proxy, ((PinosClientNodeEvents*)proxy->implementation)->use_buffers (proxy,
seq, seq,
direction, direction,
port_id, port_id,
n_buffers, n_buffers,
buffers); buffers);
return true; return true;
} }
@ -794,7 +796,7 @@ client_node_demarshal_node_command (void *object,
0)) 0))
return false; return false;
pinos_client_node_notify_node_command (proxy, seq, command); ((PinosClientNodeEvents*)proxy->implementation)->node_command (proxy, seq, command);
return true; return true;
} }
@ -815,7 +817,7 @@ client_node_demarshal_port_command (void *object,
0)) 0))
return false; return false;
pinos_client_node_notify_port_command (proxy, port_id, command); ((PinosClientNodeEvents*)proxy->implementation)->port_command (proxy, port_id, command);
return true; return true;
} }
@ -839,7 +841,7 @@ client_node_demarshal_transport (void *object,
return false; return false;
memfd = pinos_connection_get_fd (connection, memfd_idx); memfd = pinos_connection_get_fd (connection, memfd_idx);
pinos_client_node_notify_transport (proxy, memfd, offset, sz); ((PinosClientNodeEvents*)proxy->implementation)->transport (proxy, memfd, offset, sz);
return true; return true;
} }
@ -871,7 +873,7 @@ client_demarshal_info (void *object,
0)) 0))
return false; return false;
} }
pinos_client_notify_info (proxy, &info); ((PinosClientEvents*)proxy->implementation)->info (proxy, &info);
return true; return true;
} }
@ -895,7 +897,7 @@ link_demarshal_info (void *object,
0)) 0))
return false; return false;
pinos_link_notify_info (proxy, &info); ((PinosLinkEvents*)proxy->implementation)->info (proxy, &info);
return true; return true;
} }
@ -916,7 +918,7 @@ registry_demarshal_global (void *object,
0)) 0))
return false; return false;
pinos_registry_notify_global (proxy, id, type); ((PinosRegistryEvents*)proxy->implementation)->global (proxy, id, type);
return true; return true;
} }
@ -935,7 +937,7 @@ registry_demarshal_global_remove (void *object,
0)) 0))
return false; return false;
pinos_registry_notify_global_remove (proxy, id); ((PinosRegistryEvents*)proxy->implementation)->global_remove (proxy, id);
return true; return true;
} }
@ -958,7 +960,7 @@ registry_marshal_bind (void *object,
pinos_connection_end_write (connection, proxy->id, 0, b.b.offset); pinos_connection_end_write (connection, proxy->id, 0, b.b.offset);
} }
const PinosCoreInterface pinos_protocol_native_client_core_interface = { static const PinosCoreMethods pinos_protocol_native_client_core_methods = {
&core_marshal_client_update, &core_marshal_client_update,
&core_marshal_sync, &core_marshal_sync,
&core_marshal_get_registry, &core_marshal_get_registry,
@ -966,11 +968,33 @@ const PinosCoreInterface pinos_protocol_native_client_core_interface = {
&core_marshal_create_client_node &core_marshal_create_client_node
}; };
const PinosRegistryInterface pinos_protocol_native_client_registry_interface = { static const PinosDemarshalFunc pinos_protocol_native_client_core_demarshal[] = {
&core_demarshal_info,
&core_demarshal_done,
&core_demarshal_error,
&core_demarshal_remove_id,
};
static const PinosInterface pinos_protocol_native_client_core_interface = {
5, &pinos_protocol_native_client_core_methods,
4, pinos_protocol_native_client_core_demarshal
};
static const PinosRegistryMethods pinos_protocol_native_client_registry_methods = {
&registry_marshal_bind &registry_marshal_bind
}; };
const PinosClientNodeInterface pinos_protocol_native_client_client_node_interface = { static const PinosDemarshalFunc pinos_protocol_native_client_registry_demarshal[] = {
&registry_demarshal_global,
&registry_demarshal_global_remove,
};
static const PinosInterface pinos_protocol_native_client_registry_interface = {
1, &pinos_protocol_native_client_registry_methods,
2, pinos_protocol_native_client_registry_demarshal,
};
static const PinosClientNodeMethods pinos_protocol_native_client_client_node_methods = {
&client_node_marshal_update, &client_node_marshal_update,
&client_node_marshal_port_update, &client_node_marshal_port_update,
&client_node_marshal_state_change, &client_node_marshal_state_change,
@ -978,23 +1002,7 @@ const PinosClientNodeInterface pinos_protocol_native_client_client_node_interfac
&client_node_marshal_destroy &client_node_marshal_destroy
}; };
const PinosDemarshalFunc pinos_protocol_native_client_core_demarshal[] = { static const PinosDemarshalFunc pinos_protocol_native_client_client_node_demarshal[] = {
&core_demarshal_info,
&core_demarshal_done,
&core_demarshal_error,
&core_demarshal_remove_id,
};
const PinosDemarshalFunc pinos_protocol_native_client_module_demarshal[] = {
&module_demarshal_info,
};
const PinosDemarshalFunc pinos_protocol_native_client_node_demarshal[] = {
&node_demarshal_done,
&node_demarshal_info,
};
const PinosDemarshalFunc pinos_protocol_native_client_client_node_demarshal[] = {
&client_node_demarshal_done, &client_node_demarshal_done,
&client_node_demarshal_event, &client_node_demarshal_event,
&client_node_demarshal_add_port, &client_node_demarshal_add_port,
@ -1008,15 +1016,69 @@ const PinosDemarshalFunc pinos_protocol_native_client_client_node_demarshal[] =
&client_node_demarshal_transport &client_node_demarshal_transport
}; };
const PinosDemarshalFunc pinos_protocol_native_client_client_demarshal[] = { static const PinosInterface pinos_protocol_native_client_client_node_interface = {
5, &pinos_protocol_native_client_client_node_methods,
11, pinos_protocol_native_client_client_node_demarshal,
};
static const PinosDemarshalFunc pinos_protocol_native_client_module_demarshal[] = {
&module_demarshal_info,
};
static const PinosInterface pinos_protocol_native_client_module_interface = {
0, NULL,
1, pinos_protocol_native_client_module_demarshal,
};
static const PinosDemarshalFunc pinos_protocol_native_client_node_demarshal[] = {
&node_demarshal_done,
&node_demarshal_info,
};
static const PinosInterface pinos_protocol_native_client_node_interface = {
0, NULL,
2, pinos_protocol_native_client_node_demarshal,
};
static const PinosDemarshalFunc pinos_protocol_native_client_client_demarshal[] = {
&client_demarshal_info, &client_demarshal_info,
}; };
const PinosDemarshalFunc pinos_protocol_native_client_link_demarshal[] = { static const PinosInterface pinos_protocol_native_client_client_interface = {
0, NULL,
1, pinos_protocol_native_client_client_demarshal,
};
static const PinosDemarshalFunc pinos_protocol_native_client_link_demarshal[] = {
&link_demarshal_info, &link_demarshal_info,
}; };
const PinosDemarshalFunc pinos_protocol_native_client_registry_demarshal[] = { static const PinosInterface pinos_protocol_native_client_link_interface = {
&registry_demarshal_global, 0, NULL,
&registry_demarshal_global_remove, 1, pinos_protocol_native_client_link_demarshal,
}; };
bool
pinos_protocol_native_client_setup (PinosProxy *proxy)
{
const PinosInterface *iface;
if (proxy->type == proxy->context->uri.core) {
iface = &pinos_protocol_native_client_core_interface;
} else if (proxy->type == proxy->context->uri.registry) {
iface = &pinos_protocol_native_client_registry_interface;
} else if (proxy->type == proxy->context->uri.module) {
iface = &pinos_protocol_native_client_module_interface;
} else if (proxy->type == proxy->context->uri.node) {
iface = &pinos_protocol_native_client_node_interface;
} else if (proxy->type == proxy->context->uri.client_node) {
iface = &pinos_protocol_native_client_client_node_interface;
} else if (proxy->type == proxy->context->uri.client) {
iface = &pinos_protocol_native_client_client_interface;
} else if (proxy->type == proxy->context->uri.link) {
iface = &pinos_protocol_native_client_link_interface;
} else
return false;
proxy->iface = iface;
return true;
}

View file

@ -20,16 +20,4 @@
#include "pinos/client/pinos.h" #include "pinos/client/pinos.h"
#include "pinos/client/interfaces.h" #include "pinos/client/interfaces.h"
typedef bool (*PinosDemarshalFunc) (void *object, void *data, size_t size); bool pinos_protocol_native_client_setup (PinosProxy *proxy);
extern const PinosCoreInterface pinos_protocol_native_client_core_interface;
extern const PinosRegistryInterface pinos_protocol_native_client_registry_interface;
extern const PinosClientNodeInterface pinos_protocol_native_client_client_node_interface;
extern const PinosDemarshalFunc pinos_protocol_native_client_core_demarshal[];
extern const PinosDemarshalFunc pinos_protocol_native_client_module_demarshal[];
extern const PinosDemarshalFunc pinos_protocol_native_client_node_demarshal[];
extern const PinosDemarshalFunc pinos_protocol_native_client_client_node_demarshal[];
extern const PinosDemarshalFunc pinos_protocol_native_client_client_demarshal[];
extern const PinosDemarshalFunc pinos_protocol_native_client_link_demarshal[];
extern const PinosDemarshalFunc pinos_protocol_native_client_registry_demarshal[];

View file

@ -42,6 +42,8 @@ pinos_proxy_new (PinosContext *context,
pinos_signal_init (&this->destroy_signal); pinos_signal_init (&this->destroy_signal);
pinos_protocol_native_client_setup (this);
this->id = pinos_map_insert_new (&context->objects, this); this->id = pinos_map_insert_new (&context->objects, this);
spa_list_insert (&this->context->proxy_list, &this->link); spa_list_insert (&this->context->proxy_list, &this->link);

View file

@ -28,19 +28,19 @@ typedef struct _PinosProxy PinosProxy;
#include <pinos/client/connection.h> #include <pinos/client/connection.h>
#include <pinos/client/context.h> #include <pinos/client/context.h>
#include <pinos/client/interfaces.h>
struct _PinosProxy { struct _PinosProxy {
PinosContext *context; PinosContext *context;
SpaList link; SpaList link;
uint32_t id; uint32_t id;
uint32_t type; uint32_t type;
void *user_data; const PinosInterface *iface;
const void *implementation;
const void *interface; void *user_data;
const void *event;
const void *demarshal;
PINOS_SIGNAL (destroy_signal, (PinosListener *listener, PINOS_SIGNAL (destroy_signal, (PinosListener *listener,
PinosProxy *proxy)); PinosProxy *proxy));

View file

@ -914,7 +914,7 @@ client_node_transport (void *object,
pinos_log_debug ("transport update %d %p", impl->rtfd, impl->trans); pinos_log_debug ("transport update %d %p", impl->rtfd, impl->trans);
} }
static const PinosClientNodeEvent client_node_events = { static const PinosClientNodeEvents client_node_events = {
&client_node_done, &client_node_done,
&client_node_event, &client_node_event,
&client_node_add_port, &client_node_add_port,
@ -997,9 +997,7 @@ pinos_stream_connect (PinosStream *stream,
on_node_proxy_destroy); on_node_proxy_destroy);
impl->node_proxy->user_data = stream; impl->node_proxy->user_data = stream;
impl->node_proxy->event = &client_node_events; impl->node_proxy->implementation = &client_node_events;
impl->node_proxy->interface = &pinos_protocol_native_client_client_node_interface;
impl->node_proxy->demarshal = &pinos_protocol_native_client_client_node_demarshal;
pinos_core_do_create_client_node (stream->context->core_proxy, pinos_core_do_create_client_node (stream->context->core_proxy,
++impl->seq, ++impl->seq,
@ -1103,8 +1101,7 @@ pinos_stream_disconnect (PinosStream *stream)
unhandle_socket (stream); unhandle_socket (stream);
pinos_client_node_do_destroy (impl->node_proxy, pinos_client_node_do_destroy (impl->node_proxy, ++impl->seq);
++impl->seq);
return true; return true;
} }

View file

@ -52,6 +52,8 @@
#define LOCK_SUFFIX ".lock" #define LOCK_SUFFIX ".lock"
#define LOCK_SUFFIXLEN 5 #define LOCK_SUFFIXLEN 5
typedef bool (*PinosDemarshalFunc) (void *object, void *data, size_t size);
typedef struct { typedef struct {
int fd; int fd;
int fd_lock; int fd_lock;
@ -101,34 +103,7 @@ on_resource_added (PinosListener *listener,
PinosClient *client, PinosClient *client,
PinosResource *resource) PinosResource *resource)
{ {
if (resource->type == resource->core->uri.core) { pinos_protocol_native_server_setup (resource);
resource->event = &pinos_protocol_native_server_core_event;
resource->demarshal = &pinos_protocol_native_server_core_demarshal;
}
else if (resource->type == resource->core->uri.registry) {
resource->event = &pinos_protocol_native_server_registry_event;
resource->demarshal = &pinos_protocol_native_server_registry_demarshal;
}
else if (resource->type == resource->core->uri.module) {
resource->event = &pinos_protocol_native_server_module_event;
resource->demarshal = NULL;
}
else if (resource->type == resource->core->uri.node) {
resource->event = &pinos_protocol_native_server_node_event;
resource->demarshal = NULL;
}
else if (resource->type == resource->core->uri.client) {
resource->event = &pinos_protocol_native_server_client_event;
resource->demarshal = NULL;
}
else if (resource->type == resource->core->uri.client_node) {
resource->event = &pinos_protocol_native_server_client_node_events;
resource->demarshal = &pinos_protocol_native_server_client_node_demarshal;
}
else if (resource->type == resource->core->uri.link) {
resource->event = &pinos_protocol_native_server_link_event;
resource->demarshal = NULL;
}
} }
static void static void
@ -162,7 +137,11 @@ connection_data (SpaSource *source,
pinos_log_error ("protocol-native %p: unknown resource %u", client->impl, id); pinos_log_error ("protocol-native %p: unknown resource %u", client->impl, id);
continue; continue;
} }
demarshal = resource->demarshal; if (opcode >= resource->iface->n_methods) {
pinos_log_error ("protocol-native %p: invalid method %u", client->impl, opcode);
continue;
}
demarshal = resource->iface->methods;
if (demarshal[opcode]) { if (demarshal[opcode]) {
if (!demarshal[opcode] (resource, message, size)) if (!demarshal[opcode] (resource, message, size))
pinos_log_error ("protocol-native %p: invalid message received", client->impl); pinos_log_error ("protocol-native %p: invalid message received", client->impl);

View file

@ -979,7 +979,7 @@ client_node_destroy (void *object,
pinos_client_node_destroy (node); pinos_client_node_destroy (node);
} }
static PinosClientNodeInterface client_node_interface = { static PinosClientNodeMethods client_node_methods = {
&client_node_update, &client_node_update,
&client_node_port_update, &client_node_port_update,
&client_node_state_change, &client_node_state_change,
@ -1147,7 +1147,6 @@ client_node_resource_destroy (PinosResource *resource)
if (proxy->data_source.fd != -1) { if (proxy->data_source.fd != -1) {
spa_loop_remove_source (proxy->data_loop, &proxy->data_source); spa_loop_remove_source (proxy->data_loop, &proxy->data_source);
close (proxy->data_source.fd); close (proxy->data_source.fd);
proxy->data_source.fd = -1;
} }
pinos_node_destroy (this->node); pinos_node_destroy (this->node);
@ -1239,7 +1238,7 @@ pinos_client_node_new (PinosClient *client,
&impl->global_added, &impl->global_added,
on_global_added); on_global_added);
this->resource->interface = &client_node_interface; this->resource->implementation = &client_node_methods;
return this; return this;

View file

@ -66,7 +66,7 @@ no_id:
"unknown object id %u", id); "unknown object id %u", id);
} }
static PinosRegistryInterface registry_interface = { static PinosRegistryMethods registry_methods = {
&registry_bind &registry_bind
}; };
@ -114,7 +114,7 @@ core_get_registry (void *object,
if (registry_resource == NULL) if (registry_resource == NULL)
goto no_mem; goto no_mem;
registry_resource->interface = &registry_interface; registry_resource->implementation = &registry_methods;
spa_list_insert (this->registry_resource_list.prev, &registry_resource->link); spa_list_insert (this->registry_resource_list.prev, &registry_resource->link);
@ -202,7 +202,7 @@ no_mem:
return; return;
} }
static PinosCoreInterface core_interface = { static PinosCoreMethods core_methods = {
&core_client_update, &core_client_update,
&core_sync, &core_sync,
&core_get_registry, &core_get_registry,
@ -235,7 +235,7 @@ core_bind_func (PinosGlobal *global,
if (resource == NULL) if (resource == NULL)
goto no_mem; goto no_mem;
resource->interface = &core_interface; resource->implementation = &core_methods;
spa_list_insert (this->resource_list.prev, &resource->link); spa_list_insert (this->resource_list.prev, &resource->link);
client->core_resource = resource; client->core_resource = resource;

View file

@ -24,6 +24,7 @@
#include "pinos/server/resource.h" #include "pinos/server/resource.h"
#include "pinos/server/protocol-native.h" #include "pinos/server/protocol-native.h"
typedef bool (*PinosDemarshalFunc) (void *object, void *data, size_t size);
typedef struct { typedef struct {
SpaPODBuilder b; SpaPODBuilder b;
@ -164,7 +165,7 @@ core_demarshal_client_update (void *object,
0)) 0))
return false; return false;
} }
pinos_core_do_client_update (resource, &props); ((PinosCoreMethods*)resource->implementation)->client_update (resource, &props);
return true; return true;
} }
@ -183,7 +184,7 @@ core_demarshal_sync (void *object,
0)) 0))
return false; return false;
pinos_core_do_sync (resource, seq); ((PinosCoreMethods*)resource->implementation)->sync (resource, seq);
return true; return true;
} }
@ -203,7 +204,7 @@ core_demarshal_get_registry (void *object,
0)) 0))
return false; return false;
pinos_core_do_get_registry (resource, seq, new_id); ((PinosCoreMethods*)resource->implementation)->get_registry (resource, seq, new_id);
return true; return true;
} }
@ -238,12 +239,12 @@ core_demarshal_create_node (void *object,
if (!spa_pod_iter_get (&it, SPA_POD_TYPE_INT, &new_id, 0)) if (!spa_pod_iter_get (&it, SPA_POD_TYPE_INT, &new_id, 0))
return false; return false;
pinos_core_do_create_node (resource, ((PinosCoreMethods*)resource->implementation)->create_node (resource,
seq, seq,
factory_name, factory_name,
name, name,
&props, &props,
new_id); new_id);
return true; return true;
} }
@ -277,11 +278,11 @@ core_demarshal_create_client_node (void *object,
if (!spa_pod_iter_get (&it, SPA_POD_TYPE_INT, &new_id, 0)) if (!spa_pod_iter_get (&it, SPA_POD_TYPE_INT, &new_id, 0))
return false; return false;
pinos_core_do_create_client_node (resource, ((PinosCoreMethods*)resource->implementation)->create_client_node (resource,
seq, seq,
name, name,
&props, &props,
new_id); new_id);
return true; return true;
} }
@ -337,7 +338,7 @@ registry_demarshal_bind (void *object,
0)) 0))
return false; return false;
pinos_registry_do_bind (resource, id, new_id); ((PinosRegistryMethods*)resource->implementation)->bind (resource, id, new_id);
return true; return true;
} }
@ -757,7 +758,7 @@ client_node_demarshal_update (void *object,
if (have_props && !spa_pod_iter_get (&it, SPA_POD_TYPE_OBJECT, &props, 0)) if (have_props && !spa_pod_iter_get (&it, SPA_POD_TYPE_OBJECT, &props, 0))
return false; return false;
pinos_client_node_do_update (resource, change_mask, max_input_ports, max_output_ports, props); ((PinosClientNodeMethods*)resource->implementation)->update (resource, change_mask, max_input_ports, max_output_ports, props);
return true; return true;
} }
@ -829,7 +830,7 @@ client_node_demarshal_port_update (void *object,
} }
} }
pinos_client_node_do_port_update (resource, ((PinosClientNodeMethods*)resource->implementation)->port_update (resource,
direction, direction,
port_id, port_id,
change_mask, change_mask,
@ -854,7 +855,7 @@ client_node_demarshal_state_change (void *object,
!spa_pod_iter_get (&it, SPA_POD_TYPE_INT, &state, 0)) !spa_pod_iter_get (&it, SPA_POD_TYPE_INT, &state, 0))
return false; return false;
pinos_client_node_do_state_change (resource, state); ((PinosClientNodeMethods*)resource->implementation)->state_change (resource, state);
return true; return true;
} }
@ -872,7 +873,7 @@ client_node_demarshal_event (void *object,
!spa_pod_iter_get (&it, SPA_POD_TYPE_BYTES, &event, &sz, 0)) !spa_pod_iter_get (&it, SPA_POD_TYPE_BYTES, &event, &sz, 0))
return false; return false;
pinos_client_node_do_event (resource, event); ((PinosClientNodeMethods*)resource->implementation)->event (resource, event);
return true; return true;
} }
@ -889,7 +890,7 @@ client_node_demarshal_destroy (void *object,
!spa_pod_iter_get (&it, SPA_POD_TYPE_INT, &seq, 0)) !spa_pod_iter_get (&it, SPA_POD_TYPE_INT, &seq, 0))
return false; return false;
pinos_client_node_do_destroy (resource, seq); ((PinosClientNodeMethods*)resource->implementation)->destroy (resource, seq);
return true; return true;
} }
@ -906,23 +907,16 @@ link_marshal_info (void *object,
SPA_POD_TYPE_STRUCT, &f, SPA_POD_TYPE_STRUCT, &f,
SPA_POD_TYPE_INT, info->id, SPA_POD_TYPE_INT, info->id,
SPA_POD_TYPE_LONG, info->change_mask, SPA_POD_TYPE_LONG, info->change_mask,
SPA_POD_TYPE_LONG, info->output_node_id, SPA_POD_TYPE_INT, info->output_node_id,
SPA_POD_TYPE_LONG, info->output_port_id, SPA_POD_TYPE_INT, info->output_port_id,
SPA_POD_TYPE_LONG, info->input_node_id, SPA_POD_TYPE_INT, info->input_node_id,
SPA_POD_TYPE_LONG, info->input_port_id, SPA_POD_TYPE_INT, info->input_port_id,
-SPA_POD_TYPE_STRUCT, &f, 0); -SPA_POD_TYPE_STRUCT, &f, 0);
pinos_connection_end_write (connection, resource->id, 0, b.b.offset); pinos_connection_end_write (connection, resource->id, 0, b.b.offset);
} }
const PinosCoreEvent pinos_protocol_native_server_core_event = { static const PinosDemarshalFunc pinos_protocol_native_server_core_demarshal[] = {
&core_marshal_info,
&core_marshal_done,
&core_marshal_error,
&core_marshal_remove_id
};
const PinosDemarshalFunc pinos_protocol_native_server_core_demarshal[] = {
&core_demarshal_client_update, &core_demarshal_client_update,
&core_demarshal_sync, &core_demarshal_sync,
&core_demarshal_get_registry, &core_demarshal_get_registry,
@ -930,29 +924,69 @@ const PinosDemarshalFunc pinos_protocol_native_server_core_demarshal[] = {
&core_demarshal_create_client_node &core_demarshal_create_client_node
}; };
const PinosRegistryEvent pinos_protocol_native_server_registry_event = { static const PinosCoreEvents pinos_protocol_native_server_core_events = {
&core_marshal_info,
&core_marshal_done,
&core_marshal_error,
&core_marshal_remove_id
};
const PinosInterface pinos_protocol_native_server_core_interface = {
5, pinos_protocol_native_server_core_demarshal,
4, &pinos_protocol_native_server_core_events,
};
static const PinosDemarshalFunc pinos_protocol_native_server_registry_demarshal[] = {
&registry_demarshal_bind,
};
static const PinosRegistryEvents pinos_protocol_native_server_registry_events = {
&registry_marshal_global, &registry_marshal_global,
&registry_marshal_global_remove, &registry_marshal_global_remove,
}; };
const PinosDemarshalFunc pinos_protocol_native_server_registry_demarshal[] = { const PinosInterface pinos_protocol_native_server_registry_interface = {
&registry_demarshal_bind, 1, pinos_protocol_native_server_registry_demarshal,
2, &pinos_protocol_native_server_registry_events,
}; };
const PinosModuleEvent pinos_protocol_native_server_module_event = { static const PinosModuleEvents pinos_protocol_native_server_module_events = {
&module_marshal_info, &module_marshal_info,
}; };
const PinosNodeEvent pinos_protocol_native_server_node_event = { const PinosInterface pinos_protocol_native_server_module_interface = {
0, NULL,
1, &pinos_protocol_native_server_module_events,
};
static const PinosNodeEvents pinos_protocol_native_server_node_events = {
&node_marshal_done, &node_marshal_done,
&node_marshal_info, &node_marshal_info,
}; };
const PinosClientEvent pinos_protocol_native_server_client_event = { const PinosInterface pinos_protocol_native_server_node_interface = {
0, NULL,
2, &pinos_protocol_native_server_node_events,
};
static const PinosClientEvents pinos_protocol_native_server_client_events = {
&client_marshal_info, &client_marshal_info,
}; };
const PinosClientNodeEvent pinos_protocol_native_server_client_node_events = { const PinosInterface pinos_protocol_native_server_client_interface = {
0, NULL,
2, &pinos_protocol_native_server_client_events,
};
static const PinosDemarshalFunc pinos_protocol_native_server_client_node_demarshal[] = {
&client_node_demarshal_update,
&client_node_demarshal_port_update,
&client_node_demarshal_state_change,
&client_node_demarshal_event,
&client_node_demarshal_destroy,
};
static const PinosClientNodeEvents pinos_protocol_native_server_client_node_events = {
&client_node_marshal_done, &client_node_marshal_done,
&client_node_marshal_event, &client_node_marshal_event,
&client_node_marshal_add_port, &client_node_marshal_add_port,
@ -966,14 +1000,46 @@ const PinosClientNodeEvent pinos_protocol_native_server_client_node_events = {
&client_node_marshal_transport, &client_node_marshal_transport,
}; };
const PinosDemarshalFunc pinos_protocol_native_server_client_node_demarshal[] = { const PinosInterface pinos_protocol_native_server_client_node_interface = {
&client_node_demarshal_update, 5, &pinos_protocol_native_server_client_node_demarshal,
&client_node_demarshal_port_update, 11, &pinos_protocol_native_server_client_node_events,
&client_node_demarshal_state_change,
&client_node_demarshal_event,
&client_node_demarshal_destroy,
}; };
const PinosLinkEvent pinos_protocol_native_server_link_event = { static const PinosLinkEvents pinos_protocol_native_server_link_events = {
&link_marshal_info, &link_marshal_info,
}; };
const PinosInterface pinos_protocol_native_server_link_interface = {
0, NULL,
1, &pinos_protocol_native_server_link_events,
};
bool
pinos_protocol_native_server_setup (PinosResource *resource)
{
const PinosInterface *iface;
if (resource->type == resource->core->uri.core) {
iface = &pinos_protocol_native_server_core_interface;
}
else if (resource->type == resource->core->uri.registry) {
iface = &pinos_protocol_native_server_registry_interface;
}
else if (resource->type == resource->core->uri.module) {
iface = &pinos_protocol_native_server_module_interface;
}
else if (resource->type == resource->core->uri.node) {
iface = &pinos_protocol_native_server_node_interface;
}
else if (resource->type == resource->core->uri.client) {
iface = &pinos_protocol_native_server_client_interface;
}
else if (resource->type == resource->core->uri.client_node) {
iface = &pinos_protocol_native_server_client_node_interface;
}
else if (resource->type == resource->core->uri.link) {
iface = &pinos_protocol_native_server_link_interface;
} else
return false;
resource->iface = iface;
return true;
}

View file

@ -19,16 +19,4 @@
#include "pinos/client/pinos.h" #include "pinos/client/pinos.h"
typedef bool (*PinosDemarshalFunc) (void *object, void *data, size_t size); bool pinos_protocol_native_server_setup (PinosResource *resource);
extern const PinosCoreEvent pinos_protocol_native_server_core_event;
extern const PinosRegistryEvent pinos_protocol_native_server_registry_event;
extern const PinosModuleEvent pinos_protocol_native_server_module_event;
extern const PinosNodeEvent pinos_protocol_native_server_node_event;
extern const PinosClientEvent pinos_protocol_native_server_client_event;
extern const PinosClientNodeEvent pinos_protocol_native_server_client_node_events;
extern const PinosLinkEvent pinos_protocol_native_server_link_event;
extern const PinosDemarshalFunc pinos_protocol_native_server_core_demarshal[];
extern const PinosDemarshalFunc pinos_protocol_native_server_registry_demarshal[];
extern const PinosDemarshalFunc pinos_protocol_native_server_client_node_demarshal[];

View file

@ -48,9 +48,8 @@ struct _PinosResource {
void *object; void *object;
PinosDestroy destroy; PinosDestroy destroy;
const void *interface; const PinosInterface *iface;
const void *event; const void *implementation;
const void *demarshal;
PINOS_SIGNAL (destroy_signal, (PinosListener *listener, PINOS_SIGNAL (destroy_signal, (PinosListener *listener,
PinosResource *resource)); PinosResource *resource));