11#include "../nyx_node_internal.h"
19 if(label == NULL || label[0] ==
'\0')
28 snprintf(hash,
sizeof(hash),
"%08X",
nyx_hash(
40 nyx_dict_set_string_unref(result,
"<>",
"defStream",
false);
44 nyx_dict_set_string_unref(result,
"@name",
nyx_string_dup(name),
true);
45 nyx_dict_set_string_unref(result,
"@hash",
nyx_string_dup(hash),
true);
46 nyx_dict_set_string_unref(result,
"@label",
nyx_string_dup(label),
true);
70 nyx_dict_set_string_unref(result,
"<>",
"defStreamVector",
false);
74 nyx_dict_set_string_unref(result,
"@client",
"unknown",
false);
75 nyx_dict_set_string_unref(result,
"@device",
nyx_string_dup(device),
true);
76 nyx_dict_set_string_unref(result,
"@name",
nyx_string_dup(name),
true);
78 nyx_dict_set_string_unref(result,
"@state", nyx_state_to_str(state),
false);
82 internal_set_opts(result, opts);
86 nyx_dict_set(result,
"children", children);
88 if(props)
for(; *props != NULL; props++)
90 nyx_list_push(children, *props);
92 nyx_object_unref(*props);
95 nyx_object_unref(children);
108 return internal_prop_to_set_vector(vector,
"setStreamVector",
"oneStream");
115bool nyx_stream_pub(
const nyx_dict_t *vector,
size_t n_fields,
const size_t field_sizes[],
const buff_t field_buffs[])
121 if((vector->base.flags & NYX_FLAGS_STREAM_MASK) == 0 || n_fields == 0)
132 STR_t device = nyx_dict_get_string(vector,
"@device");
133 STR_t stream = nyx_dict_get_string(vector,
"@name" );
135 if(node == NULL || device == NULL || stream == NULL)
150 uint32_t prepd_hashes[n_fields];
152 size_t prepd_sizes[n_fields];
153 BUFF_t prepd_buffs[n_fields];
175 size_t field_name_len = strlen(field_name_buf);
177 size_t field_size = field_sizes[idx];
178 BUFF_t field_buff = field_buffs[idx];
184 prepd_hashes[idx] =
nyx_hash(field_name_len, field_name_buf, NYX_STREAM_MAGIC);
190 if(field_name_len > 2 && field_name_buf[field_name_len - 2] ==
'.' && field_name_buf[field_name_len - 1] ==
'b')
199 else if(field_name_len > 2 && field_name_buf[field_name_len - 2] ==
'.' && field_name_buf[field_name_len - 1] ==
'z')
201 prepd_buffs[idx] =
nyx_zlib_deflate(&prepd_sizes[idx], field_size, field_buff);
210 prepd_sizes[idx] = (size_t) field_size;
211 prepd_buffs[idx] = (
buff_t) field_buff;
242 if(n_fields != idx + 1)
244 NYX_LOG_ERROR(
"Missing fields, %d expected, %d provided", (
int) n_fields, (
int) idx + 1);
253 nyx_nss_pub(node, device, stream, n_fields, prepd_hashes, prepd_sizes, prepd_buffs);
257 for(
size_t i = 0; i < n_fields; i++)
259 if(prepd_buffs[i] != field_buffs[i])
Struct describing a JSON dict object.
#define NYX_LIST_ITER(list)
Initializes a JSON list iterator.
Struct describing a JSON list iterator.
Struct describing a JSON list object.
#define NYX_LOG_ERROR(fmt,...)
Logs an error message.
#define STR_t
Alias for const char *.
__NYX_ZEROABLE__ size_t nyx_memory_free(__NYX_NULLABLE__ buff_t buff)
Similar to libc free except that it returns the amount of memory freed.
#define buff_t
Alias for void *.
#define BUFF_t
Alias for const void *.
__NYX_NULLABLE__ str_t nyx_string_dup(__NYX_NULLABLE__ STR_t s)
Similar to libc strdup.
Opaque struct describing a Nyx node.
nyx_state_t
Vector state hint.
Struct describing the options for INDI / Nyx vectors.
@ NYX_TYPE_DICT
Dict object.
@ NYX_TYPE_LIST
List object.
@ NYX_TYPE_STRING
String object.
Struct describing a JSON object.
Struct describing a JSON string object.
uint32_t nyx_hash(__NYX_ZEROABLE__ size_t size, __NYX_NULLABLE__ BUFF_t buff, uint32_t seed)
Hashes a buffer using the MurmurHash2 algorithm.
__NYX_NULLABLE__ buff_t nyx_zlib_deflate(__NYX_NULLABLE__ size_t *result_size, __NYX_ZEROABLE__ size_t size, __NYX_NULLABLE__ BUFF_t buff)
Compresses a buffer using the ZLib algorithm.
__NYX_NULLABLE__ str_t nyx_base64_encode(__NYX_NULLABLE__ size_t *result_len, __NYX_ZEROABLE__ size_t size, __NYX_NULLABLE__ BUFF_t buff)
Encodes a buffer using the Base64 algorithm.