ascii-chat
Binary v0.15.83-53-gb711d8720
Library lib/v0.3.2-701-gb711d8720
Video chat in your terminal
Loading...
Searching...
No Matches
render_contract.h File Reference

Go to the source code of this file.

Macros

#define FRAME_RENDER_MAX_BYTES   (16u * 1024u * 1024u)
#define FRAME_RENDER_CONTRACT_SCHEMA   1u
#define FRAME_RENDER_CONTRACT_HEADER   20u
#define FRAME_RENDER_CONTRACT_MAX   (FRAME_RENDER_CONTRACT_HEADER + 255u)
#define FRAME_RENDER_CONTRACT_RAIN   1u
#define FRAME_RENDER_CONTRACT_GRID   2u

Functions

asciichat_error_t frame_render_contract_encode (const acip_render_settings_t *settings, uint32_t effects, uint8_t *wire, size_t *length)
asciichat_error_t frame_render_contract_decode (const void *wire, size_t available, acip_render_settings_t *settings, uint32_t *effects, size_t *length)

Macro Definition Documentation

◆ FRAME_RENDER_CONTRACT_GRID

#define FRAME_RENDER_CONTRACT_GRID   2u

Definition at line 14 of file render_contract.h.

Referenced by frame_render_contract_decode().

◆ FRAME_RENDER_CONTRACT_HEADER

#define FRAME_RENDER_CONTRACT_HEADER   20u

Definition at line 11 of file render_contract.h.

Referenced by frame_render_contract_decode().

◆ FRAME_RENDER_CONTRACT_MAX

#define FRAME_RENDER_CONTRACT_MAX   (FRAME_RENDER_CONTRACT_HEADER + 255u)

Definition at line 12 of file render_contract.h.

Referenced by acip_send_ascii_frame_contract().

◆ FRAME_RENDER_CONTRACT_RAIN

#define FRAME_RENDER_CONTRACT_RAIN   1u

◆ FRAME_RENDER_CONTRACT_SCHEMA

#define FRAME_RENDER_CONTRACT_SCHEMA   1u

Definition at line 10 of file render_contract.h.

Referenced by frame_render_contract_decode(), and frame_render_contract_encode().

◆ FRAME_RENDER_MAX_BYTES

#define FRAME_RENDER_MAX_BYTES   (16u * 1024u * 1024u)

Definition at line 9 of file render_contract.h.

Referenced by client_decode_frame_data(), and client_validate_frame().

Function Documentation

◆ frame_render_contract_decode()

asciichat_error_t frame_render_contract_decode ( const void * wire,
size_t available,
acip_render_settings_t * settings,
uint32_t * effects,
size_t * length )

Definition at line 209 of file frame_validation.c.

210 {
211 if (!wire || !settings || !effects || !length || available < FRAME_RENDER_CONTRACT_HEADER)
212 return SET_ERRNO(ERROR_INVALID_FRAME, "Truncated rendered frame contract");
213 uint32_t fields[5];
214 memcpy(fields, wire, sizeof(fields));
215 for (size_t i = 0; i < 5; ++i)
216 fields[i] = NET_TO_HOST_U32(fields[i]);
217 if (fields[0] != FRAME_RENDER_CONTRACT_SCHEMA || fields[2] > RENDER_MODE_HALF_BLOCK ||
218 (fields[3] & ~(FRAME_RENDER_CONTRACT_RAIN | FRAME_RENDER_CONTRACT_GRID)) || !fields[4] || fields[4] > 255 ||
219 fields[4] > available - FRAME_RENDER_CONTRACT_HEADER)
220 return SET_ERRNO(ERROR_INVALID_FRAME, "Invalid rendered frame contract schema/mode/effects/palette length");
221 memset(settings, 0, sizeof(*settings));
222 settings->revision = fields[1];
223 settings->caps.render_mode = (terminal_render_mode_t)fields[2];
224 settings->palette_length = fields[4];
225 memcpy(settings->palette, (const uint8_t *)wire + FRAME_RENDER_CONTRACT_HEADER, fields[4]);
226 if (memchr(settings->palette, 0, fields[4]))
227 return SET_ERRNO(ERROR_INVALID_FRAME, "Embedded NUL in rendered frame contract palette");
228 *effects = fields[3];
229 *length = FRAME_RENDER_CONTRACT_HEADER + fields[4];
230 return ASCIICHAT_OK;
231}
#define SET_ERRNO(code,...)
#define NET_TO_HOST_U32(val)
Definition endian.h:81
unsigned int uint32_t
Definition common.h:62
unsigned char uint8_t
Definition common.h:60
@ ASCIICHAT_OK
Definition error_codes.h:46
@ ERROR_INVALID_FRAME
#define FRAME_RENDER_CONTRACT_RAIN
#define FRAME_RENDER_CONTRACT_HEADER
#define FRAME_RENDER_CONTRACT_GRID
#define FRAME_RENDER_CONTRACT_SCHEMA

References ASCIICHAT_OK, acip_render_settings_t::caps, ERROR_INVALID_FRAME, FRAME_RENDER_CONTRACT_GRID, FRAME_RENDER_CONTRACT_HEADER, FRAME_RENDER_CONTRACT_RAIN, FRAME_RENDER_CONTRACT_SCHEMA, NET_TO_HOST_U32, acip_render_settings_t::palette, acip_render_settings_t::palette_length, acip_render_settings_t::revision, and SET_ERRNO.

Referenced by client_validate_frame().

◆ frame_render_contract_encode()

asciichat_error_t frame_render_contract_encode ( const acip_render_settings_t * settings,
uint32_t effects,
uint8_t * wire,
size_t * length )

Definition at line 233 of file frame_validation.c.

234 {
235 if (!settings || !wire || !length)
236 return SET_ERRNO(ERROR_INVALID_PARAM, "Missing rendered frame contract");
237 size_t n = strnlen(settings->palette, sizeof(settings->palette));
238 if (!n || n > 255)
239 return SET_ERRNO(ERROR_INVALID_PARAM, "Invalid rendered frame contract palette");
241 HOST_TO_NET_U32(settings->caps.render_mode), HOST_TO_NET_U32(effects), HOST_TO_NET_U32(n)};
242 memcpy(wire, fields, sizeof(fields));
243 memcpy(wire + sizeof(fields), settings->palette, n);
244 *length = sizeof(fields) + n;
245 return ASCIICHAT_OK;
246}
#define HOST_TO_NET_U32(val)
Definition endian.h:66
@ ERROR_INVALID_PARAM

References ASCIICHAT_OK, acip_render_settings_t::caps, ERROR_INVALID_PARAM, FRAME_RENDER_CONTRACT_SCHEMA, HOST_TO_NET_U32, acip_render_settings_t::palette, acip_render_settings_t::revision, and SET_ERRNO.

Referenced by acip_send_ascii_frame_contract().