ascii-chat 0.11.33
Video chat in your terminal
Loading...
Searching...
No Matches
transport.h
Go to the documentation of this file.
1
77#pragma once
78
79#include "../../common.h"
80#include "../../asciichat_errno.h"
81#include "../../crypto/crypto.h"
82#include "../../platform/socket.h"
83#include <stddef.h>
84#include <stdint.h>
85#include <stdbool.h>
86
100
108
115typedef struct {
129 asciichat_error_t (*send)(acip_transport_t *transport, const void *data, size_t len);
130
145 asciichat_error_t (*recv)(acip_transport_t *transport, void **buffer, size_t *out_len, void **out_allocated_buffer);
146
157
165
175 socket_t (*get_socket)(acip_transport_t *transport);
176
183 bool (*is_connected)(acip_transport_t *transport);
184
194 bool (*has_pending_data)(acip_transport_t *transport);
195
205 void (*destroy_impl)(acip_transport_t *transport);
207
221
222// =============================================================================
223// Transport Lifecycle
224// =============================================================================
225
236
237// =============================================================================
238// Transport Operations (convenience wrappers)
239// =============================================================================
240
251static inline asciichat_error_t acip_transport_send(acip_transport_t *transport, const void *data, size_t len) {
252 if (!transport || !transport->methods || !transport->methods->send) {
253 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid transport");
254 }
255 return transport->methods->send(transport, data, len);
256}
257
269static inline asciichat_error_t acip_transport_recv(acip_transport_t *transport, void **buffer, size_t *out_len,
270 void **out_allocated_buffer) {
271 if (!transport || !transport->methods || !transport->methods->recv) {
272 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid transport");
273 }
274 return transport->methods->recv(transport, buffer, out_len, out_allocated_buffer);
275}
276
285static inline asciichat_error_t acip_transport_close(acip_transport_t *transport) {
286 if (!transport || !transport->methods || !transport->methods->close) {
287 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid transport");
288 }
289 return transport->methods->close(transport);
290}
291
298static inline acip_transport_type_t acip_transport_get_type(acip_transport_t *transport) {
299 if (!transport || !transport->methods || !transport->methods->get_type) {
300 return 0;
301 }
302 return transport->methods->get_type(transport);
303}
304
311static inline socket_t acip_transport_get_socket(acip_transport_t *transport) {
312 if (!transport || !transport->methods || !transport->methods->get_socket) {
314 }
315 return transport->methods->get_socket(transport);
316}
317
324static inline bool acip_transport_is_connected(acip_transport_t *transport) {
325 if (!transport || !transport->methods || !transport->methods->is_connected) {
326 return false;
327 }
328 return transport->methods->is_connected(transport);
329}
330
331static inline bool acip_transport_has_pending_data(acip_transport_t *transport) {
332 if (!transport || !transport->methods || !transport->methods->has_pending_data) {
333 return false;
334 }
335 return transport->methods->has_pending_data(transport);
336}
337
338// =============================================================================
339// Transport Implementations (defined in separate files)
340// =============================================================================
341
352acip_transport_t *acip_tcp_transport_create(const char *name, socket_t sockfd, crypto_context_t *crypto_ctx);
353
369acip_transport_t *acip_websocket_client_transport_create(const char *name, const char *url, crypto_context_t *crypto_ctx);
370
385struct lws;
386acip_transport_t *acip_websocket_server_transport_create(const char *name, struct lws *wsi, crypto_context_t *crypto_ctx);
387
402 struct webrtc_data_channel *data_channel, crypto_context_t *crypto_ctx);
unsigned long long uint64_t
Definition common.h:59
#define SET_ERRNO(code, context_msg,...)
Set error code with custom context message and log it, returning the error code.
asciichat_error_t
Error and exit codes - unified status values (0-255)
Definition error_codes.h:49
@ ERROR_INVALID_PARAM
#define INVALID_SOCKET_VALUE
Invalid socket value (POSIX: -1)
Definition socket.h:278
int socket_t
ClangTool/LibTooling compatibility shim for stdbool.h.
#define bool
Definition stdbool.h:61
Transport method table (virtual function table)
Definition transport.h:115
asciichat_error_t(* send)(acip_transport_t *transport, const void *data, size_t len)
Send data through this transport.
Definition transport.h:129
bool(* is_connected)(acip_transport_t *transport)
Check if transport is connected.
Definition transport.h:183
asciichat_error_t(* close)(acip_transport_t *transport)
Close this transport.
Definition transport.h:156
socket_t(* get_socket)(acip_transport_t *transport)
Get underlying socket (if applicable)
Definition transport.h:175
asciichat_error_t(* recv)(acip_transport_t *transport, void **buffer, size_t *out_len, void **out_allocated_buffer)
Receive data from this transport.
Definition transport.h:145
acip_transport_type_t(* get_type)(acip_transport_t *transport)
Get transport type.
Definition transport.h:164
bool(* has_pending_data)(acip_transport_t *transport)
Check whether the transport has pending readable data.
Definition transport.h:194
Transport instance structure.
Definition transport.h:214
void * impl_data
Transport-specific state.
Definition transport.h:218
const acip_transport_methods_t * methods
Method table (virtual functions)
Definition transport.h:215
crypto_context_t * crypto_ctx
Optional encryption context.
Definition transport.h:216
void * user_data
Application-specific context (e.g., per-client data)
Definition transport.h:219
uint64_t receive_timeout_ns
Optional TCP receive timeout override; zero uses the normal polling timeout.
Definition transport.h:217
Cryptographic context structure.
WebRTC data channel for sending/receiving messages.
WebRTC peer connection state.
acip_transport_t * acip_webrtc_transport_create(struct webrtc_peer_connection *peer_conn, struct webrtc_data_channel *data_channel, crypto_context_t *crypto_ctx)
acip_transport_t * acip_websocket_client_transport_create(const char *name, const char *url, crypto_context_t *crypto_ctx)
Create WebSocket client transport.
acip_transport_t * acip_tcp_transport_create(const char *name, socket_t sockfd, crypto_context_t *crypto_ctx)
Create TCP transport from existing socket.
acip_transport_type_t
Transport type enumeration.
Definition transport.h:93
@ ACIP_TRANSPORT_TCP
Raw TCP socket.
Definition transport.h:94
@ ACIP_TRANSPORT_WEBSOCKET
WebSocket over TCP.
Definition transport.h:95
@ ACIP_TRANSPORT_WEBRTC
WebRTC DataChannel (P2P)
Definition transport.h:96
@ ACIP_TRANSPORT_HTTP
HTTP long-polling (future)
Definition transport.h:97
@ ACIP_TRANSPORT_QUIC
QUIC/UDP (future)
Definition transport.h:98
acip_transport_t * acip_websocket_server_transport_create(const char *name, struct lws *wsi, crypto_context_t *crypto_ctx)
Create WebSocket server transport from existing connection.
void acip_transport_destroy(acip_transport_t *transport)
Destroy transport and free all resources.