Files
odkitee/serialization/message.c
2020-07-24 12:03:58 -07:00

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