#include #include #include #include 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; }