50 lines
1.3 KiB
C
50 lines
1.3 KiB
C
|
#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);
|
||
|
|
||
|
htobe64(identifier);
|
||
|
htobe64(saveLen);
|
||
|
|
||
|
memcpy(&result[currentCursor], &identifier, sizeof identifier); // NOLINT
|
||
|
currentCursor += sizeof identifier;
|
||
|
|
||
|
memcpy(&result[currentCursor], &saveLen, sizeof saveLen); // NOLINT
|
||
|
currentCursor += sizeof saveLen;
|
||
|
|
||
|
memcpy(&result[currentCursor], self->save, sizeof *result * saveLen); // NOLINT
|
||
|
|
||
|
return_ms_packet_save_response_serialize:
|
||
|
return result;
|
||
|
}
|