msgba/src/packet/send_frame.c

53 lines
1.8 KiB
C

#include <endian.h>
#include <stdlib.h>
#include <msgba/packet/send_frame.h>
void
msPacketSendFrameDestroy(struct msPacketSendFrame **send_frame) {
free ((*send_frame)->outputBuffer);
(*send_frame)->outputBuffer = NULL;
free (*send_frame);
*send_frame = NULL;
}
struct msPacketSendFrame *
msPacketSendFrameNew(unsigned int stride, size_t outputBufferSize, color_t *const outputBuffer) {
struct msPacketSendFrame *self = malloc(sizeof *self);
color_t *outputBufferClone = malloc (sizeof *outputBufferClone * outputBufferSize);
for (size_t i = 0; i < outputBufferSize; i++) {
outputBufferClone[i] = outputBuffer[i];
}
self->outputBufferSize = outputBufferSize;
self->stride = stride;
self->outputBuffer = outputBufferClone;
return self;
}
unsigned char *
msPacketSendFrameSerialize(struct msPacketSendFrame *const self, size_t *len) {
unsigned char *bytes;
unsigned int stride = self->stride;
size_t outputBufferSizeBytes = self->outputBufferSize * sizeof *self->outputBuffer;
stride = htobe32(stride);
*len = (sizeof self->stride) + (sizeof self->outputBufferSize) + (outputBufferSizeBytes);
outputBufferSizeBytes = htobe64(outputBufferSizeBytes);
bytes = malloc(*len);
#define GOTO_END_SERIALIZE_FAIL() \
free(bytes); \
bytes = NULL;
goto return_ms_packet_send_frame_serialize;
FILE *fp = fmemopen(bytes, sizeof *bytes * *len, "w");
if (fwrite(&self->stride, sizeof self->stride, 1, fp) == -1) {
GOTO_END_SERIALIZE_FAIL();
}
if (fwrite(&outputBufferSizeBytes, sizeof outputBufferSizeBytes, 1, fp) == -1) {
GOTO_END_SERIALIZE_FAIL();
}
if (fwrite(self->outputBuffer, sizeof *self->outputBuffer, self->outputBufferSize, fp) == -1) {
GOTO_END_SERIALIZE_FAIL();
}
fclose(fp);
return_ms_packet_send_frame_serialize:
return bytes;
}