31#include "visir_utils.h"
47visir_stream_new(
char * block,
size_t size)
49 visir_stream * stream = cpl_malloc(
sizeof(visir_stream));
51 stream->base_buffer = block;
52 stream->pos = stream->base_buffer;
57visir_stream_get_size(visir_stream * stream)
59 return stream->pos - stream->base_buffer;
63visir_stream_ensure_space(visir_stream * stream,
size_t extra)
65 const size_t nused = visir_stream_get_size(stream);
67 if (stream->size < (nused + extra)) {
68 stream->base_buffer = cpl_realloc(stream->base_buffer,
71 stream->pos = stream->base_buffer + nused;
76serialize_uint32(visir_stream * stream, uint32_t v_)
78 uint32_t v = htonl(v_);
80 visir_stream_ensure_space(stream,
sizeof(v));
81 memcpy(stream->pos, &v,
sizeof(v));
82 stream->pos +=
sizeof(v);
86serialize_string(visir_stream * stream,
const char * s)
89 serialize_uint32(stream, n);
90 visir_stream_ensure_space(stream, n);
91 memcpy(stream->pos, s, n);
97deserialize_uint32(visir_stream * stream)
100 memcpy(&r, stream->pos,
sizeof(r));
101 stream->pos +=
sizeof(r);
106deserialize_string(visir_stream * stream)
108 uint32_t n = deserialize_uint32(stream);
109 char * s = cpl_malloc(n + 1);
110 memcpy(s, stream->pos, n);
117visir_frameset_serialize(
const cpl_frameset * frames,
size_t * size)
120 visir_stream * stream = NULL;
122 cpl_ensure(size != NULL, CPL_ERROR_NULL_INPUT, NULL);
123 cpl_ensure(frames != NULL, CPL_ERROR_NULL_INPUT, NULL);
125 block = cpl_malloc(1000);
126 stream = visir_stream_new(block, 1000);
128 serialize_uint32(stream, cpl_frameset_get_size(frames));
129 FOR_EACH_FRAMESET_C(frm, frames) {
130 serialize_uint32(stream, cpl_frame_get_type(frm));
131 serialize_uint32(stream, cpl_frame_get_group(frm));
132 serialize_uint32(stream, cpl_frame_get_level(frm));
133 serialize_string(stream, cpl_frame_get_tag(frm));
134 serialize_string(stream, cpl_frame_get_filename(frm));
137 *size = visir_stream_get_size(stream);
138 block = stream->base_buffer;
145visir_frameset_deserialize(
char * block,
size_t * size)
147 visir_stream * stream = visir_stream_new(block, 0);
148 uint32_t nframes = deserialize_uint32(stream);
149 cpl_frameset * frames = cpl_frameset_new();
151 for (uint32_t i = 0; i < nframes; i++) {
152 uint32_t type = deserialize_uint32(stream);
153 uint32_t group = deserialize_uint32(stream);
154 uint32_t level = deserialize_uint32(stream);
155 char * tag = deserialize_string(stream);
156 char * filename = deserialize_string(stream);
157 cpl_frame * frm = cpl_frame_new();
158 cpl_frame_set_type(frm, type);
159 cpl_frame_set_group(frm, group);
160 cpl_frame_set_level(frm, level);
161 cpl_frame_set_filename(frm, filename);
162 cpl_frame_set_tag(frm, tag);
165 cpl_frameset_insert(frames, frm);
169 *size = visir_stream_get_size(stream);
177visir_send_frameset(FILE * stream,
const cpl_frameset * frames)
180 char * block = visir_frameset_serialize(frames, &size);
181 cpl_error_code err = cpl_error_get_code();
183 skip_if(fwrite(&err,
sizeof(err), 1, stream) != 1);
184 skip_if(fwrite(&size,
sizeof(size), 1, stream) != 1);
185 skip_if(fwrite(block, size, 1, stream) != 1);
190 return cpl_error_get_code();