isle-portable/LEGO1/mxdssubscriber.cpp
Misha e824e321e8
Implement chunk parsing (#362)
* partial parsechunk implementation

* fix format

* param name fix

* rename functions

* match MxStreamController::RemoveSubscriber

* implement rest of MxDSBuffer

* Fixes and better matches

* Matche ParseChunk 100%

* Match MxDiskStreamProvider::VTable0x20

* Match MxDSBuffer::CalcBytesRemaining

* Minor stuff

* Minor improvements

* Refactor functions

---------

Co-authored-by: Christian Semmler <mail@csemmler.com>
2023-12-26 22:27:54 +01:00

125 lines
2.2 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_unk0x20 = NULL;
m_unk0x3c = NULL;
}
// FUNCTION: LEGO1 0x100b7e00
MxDSSubscriber::~MxDSSubscriber()
{
if (m_controller)
m_controller->RemoveSubscriber(this);
DeleteChunks();
if (m_unk0x20)
delete m_unk0x20;
m_unk0x20 = NULL;
if (m_unk0x3c)
delete m_unk0x3c;
m_unk0x3c = 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_unk0x20 = new MxStreamChunkListCursor(&m_unk0x08);
if (!m_unk0x20)
return FAILURE;
m_unk0x3c = new MxStreamChunkListCursor(&m_unk0x24);
if (!m_unk0x3c)
return FAILURE;
m_controller->AddSubscriber(this);
return SUCCESS;
}
// FUNCTION: LEGO1 0x100b8030
void MxDSSubscriber::DeleteChunks()
{
if (m_controller) {
MxStreamChunk* chunk = NULL;
while (m_unk0x20->First(chunk)) {
m_unk0x20->Detach();
delete chunk;
}
while (m_unk0x3c->First(chunk)) {
m_unk0x3c->Detach();
delete chunk;
}
}
}
// FUNCTION: LEGO1 0x100b8150
MxResult MxDSSubscriber::AddChunk(MxStreamChunk* p_chunk, MxBool p_append)
{
if (m_unk0x20) {
if (p_append)
m_unk0x08.Append(p_chunk);
else
m_unk0x08.Prepend(p_chunk);
}
return SUCCESS;
}
// FUNCTION: LEGO1 0x100b8250
MxStreamChunk* MxDSSubscriber::FUN_100b8250()
{
MxStreamChunk* chunk = NULL;
if (m_unk0x20)
m_unk0x20->First(chunk);
if (chunk) {
m_unk0x20->Detach();
m_unk0x24.Append(chunk);
}
return chunk;
}
// FUNCTION: LEGO1 0x100b8360
MxStreamChunk* MxDSSubscriber::FUN_100b8360()
{
MxStreamChunk* chunk = NULL;
if (m_unk0x20)
m_unk0x20->First(chunk);
return chunk;
}
// FUNCTION: LEGO1 0x100b8390
void MxDSSubscriber::FUN_100b8390(MxStreamChunk* p_chunk)
{
if (p_chunk) {
if (m_unk0x3c->Find(p_chunk)) {
m_unk0x3c->Detach();
if (p_chunk)
delete p_chunk;
}
else if ((p_chunk->GetFlags() & MxStreamChunk::Flag_Bit1) != 0 && p_chunk)
delete p_chunk;
}
}