msgba/src/packet/save_response.c

52 lines
1.4 KiB
C

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <msgba/packet/save_response.h>
void
msPacketSaveResponseDestroy(struct msPacketSaveResponse **selfPtr) {
free(*selfPtr);
*selfPtr = NULL;
}
struct msPacketSaveResponse *
msPacketSaveResponseNew(uint64_t identifier, size_t saveLen, unsigned char *save) {
struct msPacketSaveResponse *self = NULL;
self = malloc(sizeof *self);
self->identifier = identifier;
self->saveLen = saveLen;
self->save = save;
return self;
}
unsigned char *
msPacketSaveResponseSerialize(struct msPacketSaveResponse *const self, size_t *len) {
unsigned char *result = NULL;
size_t identifier = self->identifier;
size_t saveLen = self->saveLen;
size_t currentCursor = 0;
if (!len) {
goto return_ms_packet_save_response_serialize;
}
*len = sizeof identifier + sizeof saveLen + sizeof *result * saveLen;
result = malloc(*len);
identifier = htobe64(identifier);
saveLen = htobe64(saveLen);
memcpy(&result[currentCursor], &identifier, sizeof identifier); // NOLINT
currentCursor += sizeof identifier;
memcpy(&result[currentCursor], &saveLen, sizeof saveLen); // NOLINT
currentCursor += sizeof saveLen;
saveLen = be64toh(saveLen);
memcpy(&result[currentCursor], self->save, sizeof *result * saveLen); // NOLINT
return_ms_packet_save_response_serialize:
return result;
}