#pragma once #include #include "util/packet.h" #include "socket/socket.h" #include "loop.h" struct nn_packet_stream { struct nn_event_loop *loop; struct nn_socket sock; ev_io revent; ev_io wevent; u8 id; // multiplex u8 connect; bool corked; struct { struct nn_packet *packet; size_t index; bool have_header; } in; struct { array(struct nn_packet *) queue; struct nn_packet *packet; size_t index; bool running; } out; struct nn_packet_stream *direct; bool (*connection_callback)(void *, struct nn_packet_stream *); void (*connection_closed_callback)(void *, struct nn_packet_stream *); void (*packet_callback)(void *, struct nn_packet_stream *, struct nn_packet *); void (*packet_sent_callback)(void *, struct nn_packet *); void (*packets_sent_callback)(void *, struct nn_packet **, u32); void *userdata; }; void nn_packet_stream_init(struct nn_packet_stream *stream, bool (*connection_callback)(void *, struct nn_packet_stream *), void (*connection_closed_callback)(void *, struct nn_packet_stream *), void *userdata); void nn_packet_stream_set_nodelay(struct nn_packet_stream *stream, s32 no_delay); void nn_packet_stream_from_socket(struct nn_packet_stream *stream, struct nn_event_loop *loop, struct nn_socket *sock); void nn_packet_stream_connect(struct nn_packet_stream *stream, struct nn_event_loop *loop, u8 id, u8 type, str *addr, u16 port); void nn_packet_stream_reconnect(struct nn_packet_stream *stream, str *addr, u16 port); bool nn_packet_stream_set_connected(struct nn_packet_stream *stream); void nn_packet_stream_cork(struct nn_packet_stream *stream, bool cork); bool nn_packet_stream_send_packet(struct nn_packet_stream *stream, struct nn_packet *packet); void nn_packet_stream_discard_queue(struct nn_packet_stream *stream); void nn_packet_stream_return_packet(struct nn_packet_stream *stream, struct nn_packet *packet); void nn_packet_stream_return_packets(struct nn_packet_stream *stream, struct nn_packet **packets, u32 count); void nn_packet_stream_disconnect(struct nn_packet_stream *stream); void nn_packet_stream_free(struct nn_packet_stream *stream);