52 lines
1.4 KiB
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;
|
|
}
|