/* * Copyright 2019 Google LLC. All Rights Reserved. This file and proprietary * source code may only be used and distributed under the Widevine Master * License Agreement. */ #include "message.h" #include #include #include #include #include /* Round up address to the nearest 8 byte boundary */ #define align_8(addr) (((uintptr_t)(addr) + 7) & ~(uintptr_t)7) struct _Message { uint8_t* base; size_t capacity; size_t size; size_t read_offset; MessageStatus status; }; /* * The message structure, which is separate from the buffer, * is initialized to reference the buffer */ void InitMessage(Message* message, uint8_t* buffer, size_t capacity) { assert(message != NULL); assert(buffer != NULL); message->base = buffer; message->capacity = capacity; message->size = 0; message->read_offset = 0; message->status = MESSAGE_STATUS_OK; } /* * Cast pointer of Message from the input buffer. Since Message* is 8-byte * aligned on a 64-bit system, or 4-byte aligned on a 32-bit system, the input * buffer needs to be adjusted to 8-byte alignment before pointer casting, in * order to avoid misaligned pointer */ Message* CreateMessage(uint8_t* buffer, size_t buffer_size) { assert(buffer != NULL); uint8_t* const buffer_aligned = (uint8_t* const)align_8(buffer); assert(buffer_size >= sizeof(Message) + (size_t)(buffer_aligned - buffer)); Message* const message = (Message* const)buffer_aligned; message->base = buffer_aligned + sizeof(Message); message->capacity = buffer_size - sizeof(Message) - (size_t)(buffer_aligned - buffer); message->size = 0; message->read_offset = 0; message->status = MESSAGE_STATUS_OK; return message; } void ClearMessage(Message* message) { assert(message != NULL); message->size = 0; message->read_offset = 0; message->status = MESSAGE_STATUS_OK; } void ResetMessage(Message* message) { assert(message != NULL); message->read_offset = 0; message->status = MESSAGE_STATUS_OK; } uint8_t* GetBase(Message* message) { assert(message != NULL); return message->base; } size_t GetCapacity(Message* message) { assert(message != NULL); return message->capacity; } size_t GetSize(Message* message) { assert(message != NULL); return message->size; } MessageStatus GetStatus(Message* message) { assert(message != NULL); return message->status; } void SetStatus(Message* message, MessageStatus status) { assert(message != NULL); message->status = status; } void SetSize(Message* message, size_t size) { assert(message != NULL); message->size = size; }