ascii-chat 0.6.0
Real-time terminal-based video chat with ASCII art conversion
Loading...
Searching...
No Matches
transport.h
Go to the documentation of this file.
1
43#pragma once
44
45#include "common.h"
46#include "asciichat_errno.h"
47#include "crypto/crypto.h"
48#include "platform/socket.h"
49#include <stddef.h>
50#include <stdint.h>
51#include <stdbool.h>
52
66
74
81typedef struct {
95 asciichat_error_t (*send)(acip_transport_t *transport, const void *data, size_t len);
96
111 asciichat_error_t (*recv)(acip_transport_t *transport, void **buffer, size_t *out_len, void **out_allocated_buffer);
112
123
131
141 socket_t (*get_socket)(acip_transport_t *transport);
142
149 bool (*is_connected)(acip_transport_t *transport);
150
160 void (*destroy_impl)(acip_transport_t *transport);
162
174
175// =============================================================================
176// Transport Lifecycle
177// =============================================================================
178
189
190// =============================================================================
191// Transport Operations (convenience wrappers)
192// =============================================================================
193
204static inline asciichat_error_t acip_transport_send(acip_transport_t *transport, const void *data, size_t len) {
205 if (!transport || !transport->methods || !transport->methods->send) {
206 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid transport");
207 }
208 return transport->methods->send(transport, data, len);
209}
210
222static inline asciichat_error_t acip_transport_recv(acip_transport_t *transport, void **buffer, size_t *out_len,
223 void **out_allocated_buffer) {
224 if (!transport || !transport->methods || !transport->methods->recv) {
225 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid transport");
226 }
227 return transport->methods->recv(transport, buffer, out_len, out_allocated_buffer);
228}
229
238static inline asciichat_error_t acip_transport_close(acip_transport_t *transport) {
239 if (!transport || !transport->methods || !transport->methods->close) {
240 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid transport");
241 }
242 return transport->methods->close(transport);
243}
244
251static inline acip_transport_type_t acip_transport_get_type(acip_transport_t *transport) {
252 if (!transport || !transport->methods || !transport->methods->get_type) {
253 return 0;
254 }
255 return transport->methods->get_type(transport);
256}
257
264static inline socket_t acip_transport_get_socket(acip_transport_t *transport) {
265 if (!transport || !transport->methods || !transport->methods->get_socket) {
267 }
268 return transport->methods->get_socket(transport);
269}
270
277static inline bool acip_transport_is_connected(acip_transport_t *transport) {
278 if (!transport || !transport->methods || !transport->methods->is_connected) {
279 return false;
280 }
281 return transport->methods->is_connected(transport);
282}
283
284// =============================================================================
285// Transport Implementations (defined in separate files)
286// =============================================================================
287
298
310
325 struct webrtc_data_channel *data_channel, crypto_context_t *crypto_ctx);
⚠️‼️ Error and/or exit() when things go bad.
#define SET_ERRNO(code, context_msg,...)
Set error code with custom context message and log it.
asciichat_error_t
Error and exit codes - unified status values (0-255)
Definition error_codes.h:46
@ ERROR_INVALID_PARAM
int socket_t
Socket handle type (POSIX: int)
Definition socket.h:50
#define INVALID_SOCKET_VALUE
Invalid socket value (POSIX: -1)
Definition socket.h:52
Cross-platform socket interface for ascii-chat.
#define bool
Definition stdbool.h:22
Transport method table (virtual function table)
Definition transport.h:81
asciichat_error_t(* send)(acip_transport_t *transport, const void *data, size_t len)
Send data through this transport.
Definition transport.h:95
bool(* is_connected)(acip_transport_t *transport)
Check if transport is connected.
Definition transport.h:149
asciichat_error_t(* close)(acip_transport_t *transport)
Close this transport.
Definition transport.h:122
socket_t(* get_socket)(acip_transport_t *transport)
Get underlying socket (if applicable)
Definition transport.h:141
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:111
acip_transport_type_t(* get_type)(acip_transport_t *transport)
Get transport type.
Definition transport.h:130
Transport instance structure.
Definition transport.h:169
void * impl_data
Transport-specific state.
Definition transport.h:172
const acip_transport_methods_t * methods
Method table (virtual functions)
Definition transport.h:170
crypto_context_t * crypto_ctx
Optional encryption context.
Definition transport.h:171
Cryptographic context structure.
acip_transport_t * acip_tcp_transport_create(socket_t sockfd, crypto_context_t *crypto_ctx)
Create TCP transport from existing socket.
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_type_t
Transport type enumeration.
Definition transport.h:59
@ ACIP_TRANSPORT_TCP
Raw TCP socket.
Definition transport.h:60
@ ACIP_TRANSPORT_WEBSOCKET
WebSocket over TCP.
Definition transport.h:61
@ ACIP_TRANSPORT_WEBRTC
WebRTC DataChannel (P2P)
Definition transport.h:62
@ ACIP_TRANSPORT_HTTP
HTTP long-polling (future)
Definition transport.h:63
@ ACIP_TRANSPORT_QUIC
QUIC/UDP (future)
Definition transport.h:64
acip_transport_t * acip_websocket_transport_create(socket_t sockfd, crypto_context_t *crypto_ctx)
Create WebSocket transport from existing socket.
void acip_transport_destroy(acip_transport_t *transport)
Destroy transport and free all resources.