#pragma once #include #include "util/packet.h" #include "packet_stream.h" struct nn_rpc_connection; struct nn_rpc_callback { u32 id; void (*callback)(void *, struct nn_rpc_connection *, struct nn_packet *); void *userdata; }; struct nn_rpc_connection { struct nn_packet_stream *stream; array(struct nn_rpc_callback) callbacks; u32 outgoing; bool flushing; struct nn_rpc *rpc; }; struct nn_rpc_command { s8 op; bool (*callback)(void *, struct nn_rpc_connection *, struct nn_packet *, struct nn_packet *); void *userdata; }; struct nn_rpc { struct nn_event_loop *loop; u32 increment; array(struct nn_rpc_command) commands; struct nn_rpc_connection *conn; // client array(struct nn_rpc_connection *) connections; void (*connection_callback)(void *, struct nn_rpc_connection *); void (*connection_closed_callback)(void *, struct nn_rpc_connection *); void *userdata; }; bool nn_rpc_init(struct nn_rpc *rpc, struct nn_event_loop *loop, void (*connection_callback)(void *, struct nn_rpc_connection *), void (*connection_closed_callback)(void *, struct nn_rpc_connection *), void *userdata); void nn_rpc_add_command(struct nn_rpc *rpc, struct nn_rpc_command *command); void nn_rpc_add_stream(struct nn_rpc *rpc, struct nn_packet_stream *stream); struct nn_rpc_connection *nn_rpc_prepare_client(struct nn_rpc *rpc); void nn_rpc_connect(struct nn_rpc *rpc, u8 id, u8 type, str *addr, u16 port); struct nn_rpc_connection *nn_rpc_reconnect(struct nn_rpc *rpc, str *addr, u16 port); struct nn_packet *nn_rpc_get_packet(struct nn_rpc *rpc, s8 op); void nn_rpc_free(struct nn_rpc *rpc); // The order of commands per-connection will be respected. void nn_rpc_connection_command(struct nn_rpc_connection *conn, struct nn_packet *packet, void (*callback)(void *, struct nn_rpc_connection *conn, struct nn_packet *), void *userdata); void nn_rpc_conn_flush(struct nn_rpc_connection *conn); void nn_rpc_conn_disconnect(struct nn_rpc_connection *conn);