102 lines
2.6 KiB
C
102 lines
2.6 KiB
C
/*
|
|
* 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 <assert.h>
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
/* 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;
|
|
}
|