mirror of
https://github.com/isledecomp/isle.git
synced 2025-10-25 17:34:05 +00:00
138 lines
2.5 KiB
C++
138 lines
2.5 KiB
C++
#include "mxdssubscriber.h"
|
|
|
|
#include "mxstreamcontroller.h"
|
|
|
|
DECOMP_SIZE_ASSERT(MxDSSubscriber, 0x4c);
|
|
|
|
// FUNCTION: LEGO1 0x100b7bb0
|
|
MxDSSubscriber::MxDSSubscriber()
|
|
{
|
|
m_unk0x48 = -1;
|
|
m_objectId = -1;
|
|
m_pendingChunkCursor = NULL;
|
|
m_consumedChunkCursor = NULL;
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x100b7e00
|
|
MxDSSubscriber::~MxDSSubscriber()
|
|
{
|
|
if (m_controller) {
|
|
m_controller->RemoveSubscriber(this);
|
|
}
|
|
|
|
DestroyData();
|
|
|
|
if (m_pendingChunkCursor) {
|
|
delete m_pendingChunkCursor;
|
|
}
|
|
m_pendingChunkCursor = NULL;
|
|
|
|
if (m_consumedChunkCursor) {
|
|
delete m_consumedChunkCursor;
|
|
}
|
|
m_consumedChunkCursor = NULL;
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x100b7ed0
|
|
MxResult MxDSSubscriber::Create(MxStreamController* p_controller, MxU32 p_objectId, MxS16 p_unk0x48)
|
|
{
|
|
m_objectId = p_objectId;
|
|
m_unk0x48 = p_unk0x48;
|
|
|
|
if (!p_controller) {
|
|
return FAILURE;
|
|
}
|
|
m_controller = p_controller;
|
|
|
|
m_pendingChunkCursor = new MxStreamChunkListCursor(&m_pendingChunks);
|
|
if (!m_pendingChunkCursor) {
|
|
return FAILURE;
|
|
}
|
|
|
|
m_consumedChunkCursor = new MxStreamChunkListCursor(&m_consumedChunks);
|
|
if (!m_consumedChunkCursor) {
|
|
return FAILURE;
|
|
}
|
|
|
|
m_controller->AddSubscriber(this);
|
|
return SUCCESS;
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x100b8030
|
|
void MxDSSubscriber::DestroyData()
|
|
{
|
|
if (m_controller) {
|
|
MxStreamChunk* chunk = NULL;
|
|
|
|
while (m_pendingChunkCursor->First(chunk)) {
|
|
m_pendingChunkCursor->Detach();
|
|
delete chunk;
|
|
}
|
|
|
|
while (m_consumedChunkCursor->First(chunk)) {
|
|
m_consumedChunkCursor->Detach();
|
|
delete chunk;
|
|
}
|
|
}
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x100b8150
|
|
MxResult MxDSSubscriber::AddData(MxStreamChunk* p_chunk, MxBool p_append)
|
|
{
|
|
if (m_pendingChunkCursor) {
|
|
if (p_append) {
|
|
m_pendingChunks.Append(p_chunk);
|
|
}
|
|
else {
|
|
m_pendingChunks.Prepend(p_chunk);
|
|
}
|
|
}
|
|
|
|
return SUCCESS;
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x100b8250
|
|
MxStreamChunk* MxDSSubscriber::PopData()
|
|
{
|
|
MxStreamChunk* chunk = NULL;
|
|
|
|
if (m_pendingChunkCursor) {
|
|
m_pendingChunkCursor->First(chunk);
|
|
}
|
|
|
|
if (chunk) {
|
|
m_pendingChunkCursor->Detach();
|
|
m_consumedChunks.Append(chunk);
|
|
}
|
|
|
|
return chunk;
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x100b8360
|
|
MxStreamChunk* MxDSSubscriber::PeekData()
|
|
{
|
|
MxStreamChunk* chunk = NULL;
|
|
|
|
if (m_pendingChunkCursor) {
|
|
m_pendingChunkCursor->First(chunk);
|
|
}
|
|
|
|
return chunk;
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x100b8390
|
|
void MxDSSubscriber::FreeDataChunk(MxStreamChunk* p_chunk)
|
|
{
|
|
if (p_chunk) {
|
|
if (m_consumedChunkCursor->Find(p_chunk)) {
|
|
m_consumedChunkCursor->Detach();
|
|
if (p_chunk) {
|
|
delete p_chunk;
|
|
}
|
|
}
|
|
else if (p_chunk->GetFlags() & MxDSChunk::c_bit1 && p_chunk) {
|
|
delete p_chunk;
|
|
}
|
|
}
|
|
}
|