31 memset(settings, 0,
sizeof(session_settings_t));
34 settings->version = 0;
35 settings->width = (int16_t)GET_OPTION(width);
36 settings->height = (int16_t)GET_OPTION(height);
37 settings->color_mode = (uint8_t)GET_OPTION(color_mode);
38 settings->render_mode = (uint8_t)GET_OPTION(render_mode);
39 settings->palette_type = (uint8_t)GET_OPTION(palette_type);
42 const char *palette = GET_OPTION(palette_custom);
43 if (palette && palette[0] !=
'\0') {
44 SAFE_STRNCPY(settings->palette_custom, palette,
sizeof(settings->palette_custom));
47 settings->audio_enabled = (uint8_t)GET_OPTION(audio_enabled);
48 settings->encryption_required = GET_OPTION(no_encrypt) ? 0 : 1;
52 if (!settings || !buffer || !len) {
53 return SET_ERRNO(ERROR_INVALID_PARAM,
"session_settings_serialize: NULL parameter");
60 uint32_t version_net = htonl(settings->version);
61 memcpy(buffer + offset, &version_net,
sizeof(version_net));
62 offset +=
sizeof(version_net);
65 uint16_t width_net = htons((uint16_t)(settings->width & 0xFFFF));
66 memcpy(buffer + offset, &width_net,
sizeof(width_net));
67 offset +=
sizeof(width_net);
70 uint16_t height_net = htons((uint16_t)(settings->height & 0xFFFF));
71 memcpy(buffer + offset, &height_net,
sizeof(height_net));
72 offset +=
sizeof(height_net);
75 buffer[offset++] = settings->color_mode;
78 buffer[offset++] = settings->render_mode;
81 buffer[offset++] = settings->palette_type;
84 memcpy(buffer + offset, settings->palette_custom, 32);
88 buffer[offset++] = settings->audio_enabled;
91 buffer[offset++] = settings->encryption_required;
94 memcpy(buffer + offset, settings->reserved, 16);
102 if (!buffer || !settings) {
103 return SET_ERRNO(ERROR_INVALID_PARAM,
"session_settings_deserialize: NULL parameter");
107 if (len < SESSION_SETTINGS_SERIALIZED_SIZE) {
108 return SET_ERRNO(ERROR_INVALID_PARAM,
"session_settings_deserialize: buffer too small (%zu < %d)", len,
109 SESSION_SETTINGS_SERIALIZED_SIZE);
112 memset(settings, 0,
sizeof(session_settings_t));
116 uint32_t version_net;
117 memcpy(&version_net, buffer + offset,
sizeof(version_net));
118 settings->version = ntohl(version_net);
119 offset +=
sizeof(version_net);
123 memcpy(&width_net, buffer + offset,
sizeof(width_net));
124 settings->width = (int16_t)ntohs(width_net);
125 offset +=
sizeof(width_net);
129 memcpy(&height_net, buffer + offset,
sizeof(height_net));
130 settings->height = (int16_t)ntohs(height_net);
131 offset +=
sizeof(height_net);
134 settings->color_mode = buffer[offset++];
137 settings->render_mode = buffer[offset++];
140 settings->palette_type = buffer[offset++];
143 memcpy(settings->palette_custom, buffer + offset, 32);
144 settings->palette_custom[31] =
'\0';
148 settings->audio_enabled = buffer[offset++];
151 settings->encryption_required = buffer[offset++];
154 memcpy(settings->reserved, buffer + offset, 16);
162 return SET_ERRNO(ERROR_INVALID_PARAM,
"session_settings_from_options: NULL settings");
171 return SET_ERRNO(ERROR_CONFIG,
"Options not initialized");
175 settings->version = (uint32_t)time(NULL);
178 settings->width = (int16_t)opts->width;
179 settings->height = (int16_t)opts->height;
182 settings->color_mode = (uint8_t)opts->color_mode;
183 settings->render_mode = (uint8_t)opts->render_mode;
184 settings->palette_type = (uint8_t)opts->palette_type;
187 if (opts->palette_custom_set && opts->palette_custom[0] !=
'\0') {
188 SAFE_STRNCPY(settings->palette_custom, opts->palette_custom,
sizeof(settings->palette_custom));
192 settings->audio_enabled = (uint8_t)opts->audio_enabled;
193 settings->encryption_required = opts->no_encrypt ? 0 : 1;
200 return SET_ERRNO(ERROR_INVALID_PARAM,
"session_settings_apply_to_options: NULL settings");
204 if (settings->width > 0 && settings->height > 0) {
205 asciichat_error_t width_result =
options_set_int(
"width", (
int)settings->width);
206 asciichat_error_t height_result =
options_set_int(
"height", (
int)settings->height);
207 if (width_result != ASCIICHAT_OK || height_result != ASCIICHAT_OK) {
208 log_warn(
"Failed to apply dimension settings: width=%d, height=%d", width_result, height_result);
230 return a->width == b->width && a->height == b->height && a->color_mode == b->color_mode &&
231 a->render_mode == b->render_mode && a->palette_type == b->palette_type &&
232 strncmp(a->palette_custom, b->palette_custom,
sizeof(a->palette_custom)) == 0 &&
233 a->audio_enabled == b->audio_enabled && a->encryption_required == b->encryption_required;