mirror of
https://github.com/isledecomp/isle-portable.git
synced 2025-09-24 04:26:55 -04:00
MxDSBuffer::FUN_100c67b0 100% (#1250)
This commit is contained in:
parent
5a61cf6566
commit
fc93b84655
@ -63,13 +63,24 @@ public:
|
|||||||
static MxCore* ReadChunk(MxDSBuffer* p_buffer, MxU32* p_chunkData, MxU16 p_flags);
|
static MxCore* ReadChunk(MxDSBuffer* p_buffer, MxU32* p_chunkData, MxU16 p_flags);
|
||||||
static MxResult Append(MxU8* p_buffer1, MxU8* p_buffer2);
|
static MxResult Append(MxU8* p_buffer1, MxU8* p_buffer2);
|
||||||
|
|
||||||
|
// FUNCTION: BETA10 0x10148c60
|
||||||
MxU8* GetBuffer() { return m_pBuffer; }
|
MxU8* GetBuffer() { return m_pBuffer; }
|
||||||
|
|
||||||
MxU8** GetBufferRef() { return &m_pBuffer; }
|
MxU8** GetBufferRef() { return &m_pBuffer; }
|
||||||
undefined4 GetUnknown14() { return m_unk0x14; }
|
undefined4 GetUnknown14() { return m_unk0x14; }
|
||||||
|
|
||||||
|
// FUNCTION: BETA10 0x10156420
|
||||||
|
MxBool HasRef() { return m_referenceCount != 0; }
|
||||||
|
|
||||||
MxU16 GetRefCount() { return m_referenceCount; }
|
MxU16 GetRefCount() { return m_referenceCount; }
|
||||||
Type GetMode() { return m_mode; }
|
Type GetMode() { return m_mode; }
|
||||||
|
|
||||||
|
// FUNCTION: BETA10 0x10148c40
|
||||||
MxU32 GetWriteOffset() { return m_writeOffset; }
|
MxU32 GetWriteOffset() { return m_writeOffset; }
|
||||||
|
|
||||||
|
// FUNCTION: BETA10 0x101590d0
|
||||||
MxU32 GetBytesRemaining() { return m_bytesRemaining; }
|
MxU32 GetBytesRemaining() { return m_bytesRemaining; }
|
||||||
|
|
||||||
void SetUnknown14(undefined4 p_unk0x14) { m_unk0x14 = p_unk0x14; }
|
void SetUnknown14(undefined4 p_unk0x14) { m_unk0x14 = p_unk0x14; }
|
||||||
void SetUnknown1c(undefined4 p_unk0x1c) { m_unk0x1c = p_unk0x1c; }
|
void SetUnknown1c(undefined4 p_unk0x1c) { m_unk0x1c = p_unk0x1c; }
|
||||||
void SetMode(Type p_mode) { m_mode = p_mode; }
|
void SetMode(Type p_mode) { m_mode = p_mode; }
|
||||||
|
@ -44,6 +44,9 @@ public:
|
|||||||
void SetUnknowna4(MxDSBuffer* p_unk0xa4) { m_unk0xa4 = p_unk0xa4; }
|
void SetUnknowna4(MxDSBuffer* p_unk0xa4) { m_unk0xa4 = p_unk0xa4; }
|
||||||
void SetBufferOffset(MxU32 p_bufferOffset) { m_bufferOffset = p_bufferOffset; }
|
void SetBufferOffset(MxU32 p_bufferOffset) { m_bufferOffset = p_bufferOffset; }
|
||||||
|
|
||||||
|
// FUNCTION: BETA10 0x10156650
|
||||||
|
void ClearUnknowna0() { m_unk0xa0 = NULL; }
|
||||||
|
|
||||||
// SYNTHETIC: LEGO1 0x100cd0b0
|
// SYNTHETIC: LEGO1 0x100cd0b0
|
||||||
// MxDSStreamingAction::`scalar deleting destructor'
|
// MxDSStreamingAction::`scalar deleting destructor'
|
||||||
|
|
||||||
|
@ -95,6 +95,7 @@ MxResult MxDSBuffer::SetBufferPointer(MxU8* p_buffer, MxU32 p_size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x100c67b0
|
// FUNCTION: LEGO1 0x100c67b0
|
||||||
|
// FUNCTION: BETA10 0x10157295
|
||||||
MxResult MxDSBuffer::FUN_100c67b0(
|
MxResult MxDSBuffer::FUN_100c67b0(
|
||||||
MxStreamController* p_controller,
|
MxStreamController* p_controller,
|
||||||
MxDSAction* p_action,
|
MxDSAction* p_action,
|
||||||
@ -102,56 +103,60 @@ MxResult MxDSBuffer::FUN_100c67b0(
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
MxResult result = FAILURE;
|
MxResult result = FAILURE;
|
||||||
|
MxU8* data = m_pBuffer;
|
||||||
|
|
||||||
m_unk0x30 = (MxDSStreamingAction*) p_controller->GetUnk0x3c().Find(p_action);
|
m_unk0x30 = (MxDSStreamingAction*) p_controller->GetUnk0x3c().Find(p_action);
|
||||||
if (m_unk0x30 == NULL) {
|
if (m_unk0x30 == NULL) {
|
||||||
return FAILURE;
|
return FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
MxU8* data;
|
|
||||||
while ((data = (MxU8*) SkipToData())) {
|
while ((data = (MxU8*) SkipToData())) {
|
||||||
if (*p_streamingAction == NULL) {
|
if (*p_streamingAction != NULL) {
|
||||||
result = CreateObject(p_controller, (MxU32*) data, p_action, p_streamingAction);
|
|
||||||
|
|
||||||
if (result == FAILURE) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
// TODO: Not a MxResult value?
|
|
||||||
if (result == 1) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
MxDSBuffer* buffer = (*p_streamingAction)->GetUnknowna0();
|
MxDSBuffer* buffer = (*p_streamingAction)->GetUnknowna0();
|
||||||
|
|
||||||
if (buffer->CalcBytesRemaining(data) != SUCCESS) {
|
if (buffer->CalcBytesRemaining(data)) {
|
||||||
return result;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (buffer->GetBytesRemaining() == 0) {
|
if (buffer->GetBytesRemaining() == 0) {
|
||||||
buffer->SetUnk30(m_unk0x30);
|
buffer->m_unk0x30 = m_unk0x30;
|
||||||
|
|
||||||
result = buffer->CreateObject(p_controller, (MxU32*) buffer->GetBuffer(), p_action, p_streamingAction);
|
result = buffer->CreateObject(p_controller, (MxU32*) buffer->GetBuffer(), p_action, p_streamingAction);
|
||||||
if (result != SUCCESS) {
|
if (result == SUCCESS) {
|
||||||
return result;
|
if (buffer->HasRef()) {
|
||||||
}
|
// Note: *p_streamingAction is always null in MxRamStreamProvider
|
||||||
|
((MxDiskStreamController*) p_controller)->InsertToList74(buffer);
|
||||||
|
(*p_streamingAction)->ClearUnknowna0();
|
||||||
|
}
|
||||||
|
|
||||||
if (buffer->GetRefCount() != 0) {
|
((MxDiskStreamController*) p_controller)->FUN_100c7cb0(*p_streamingAction);
|
||||||
// Note: *p_streamingAction is always null in MxRamStreamProvider
|
*p_streamingAction = NULL;
|
||||||
((MxDiskStreamController*) p_controller)->InsertToList74(buffer);
|
|
||||||
(*p_streamingAction)->SetUnknowna0(NULL);
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
result = CreateObject(p_controller, (MxU32*) data, p_action, p_streamingAction);
|
||||||
|
|
||||||
((MxDiskStreamController*) p_controller)->FUN_100c7cb0(*p_streamingAction);
|
if (result == FAILURE) {
|
||||||
*p_streamingAction = NULL;
|
goto done;
|
||||||
|
}
|
||||||
|
else if (result == 1) {
|
||||||
|
// TODO: Not a MxResult value?
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return SUCCESS;
|
result = SUCCESS;
|
||||||
|
done:
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x100c68a0
|
// FUNCTION: LEGO1 0x100c68a0
|
||||||
|
// FUNCTION: BETA10 0x10157450
|
||||||
MxResult MxDSBuffer::CreateObject(
|
MxResult MxDSBuffer::CreateObject(
|
||||||
MxStreamController* p_controller,
|
MxStreamController* p_controller,
|
||||||
MxU32* p_data,
|
MxU32* p_data,
|
||||||
@ -170,7 +175,8 @@ MxResult MxDSBuffer::CreateObject(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (*p_data == FOURCC('M', 'x', 'O', 'b')) {
|
if (*p_data == FOURCC('M', 'x', 'O', 'b')) {
|
||||||
return StartPresenterFromAction(p_controller, p_action, (MxDSAction*) header);
|
MxDSAction* action = (MxDSAction*) header;
|
||||||
|
return StartPresenterFromAction(p_controller, p_action, action);
|
||||||
}
|
}
|
||||||
else if (*p_data == FOURCC('M', 'x', 'C', 'h')) {
|
else if (*p_data == FOURCC('M', 'x', 'C', 'h')) {
|
||||||
MxStreamChunk* chunk = (MxStreamChunk*) header;
|
MxStreamChunk* chunk = (MxStreamChunk*) header;
|
||||||
@ -181,8 +187,10 @@ MxResult MxDSBuffer::CreateObject(
|
|||||||
|
|
||||||
return ParseChunk(p_controller, p_data, p_action, p_streamingAction, chunk);
|
return ParseChunk(p_controller, p_data, p_action, p_streamingAction, chunk);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
delete header;
|
||||||
|
}
|
||||||
|
|
||||||
delete header;
|
|
||||||
return FAILURE;
|
return FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -314,6 +322,7 @@ done:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x100c6d00
|
// FUNCTION: LEGO1 0x100c6d00
|
||||||
|
// FUNCTION: BETA10 0x10157c94
|
||||||
MxCore* MxDSBuffer::ReadChunk(MxDSBuffer* p_buffer, MxU32* p_chunkData, MxU16 p_flags)
|
MxCore* MxDSBuffer::ReadChunk(MxDSBuffer* p_buffer, MxU32* p_chunkData, MxU16 p_flags)
|
||||||
{
|
{
|
||||||
// This function reads a chunk. If it is an object, this function returns an MxDSObject. If it is a chunk,
|
// This function reads a chunk. If it is an object, this function returns an MxDSObject. If it is a chunk,
|
||||||
@ -322,16 +331,21 @@ MxCore* MxDSBuffer::ReadChunk(MxDSBuffer* p_buffer, MxU32* p_chunkData, MxU16 p_
|
|||||||
MxU8* dataStart = (MxU8*) p_chunkData + 8;
|
MxU8* dataStart = (MxU8*) p_chunkData + 8;
|
||||||
|
|
||||||
switch (*p_chunkData) {
|
switch (*p_chunkData) {
|
||||||
case FOURCC('M', 'x', 'O', 'b'):
|
case FOURCC('M', 'x', 'O', 'b'): {
|
||||||
result = DeserializeDSObjectDispatch(dataStart, p_flags);
|
MxDSObject* obj = DeserializeDSObjectDispatch(dataStart, p_flags);
|
||||||
|
result = obj;
|
||||||
break;
|
break;
|
||||||
case FOURCC('M', 'x', 'C', 'h'):
|
}
|
||||||
result = new MxStreamChunk();
|
case FOURCC('M', 'x', 'C', 'h'): {
|
||||||
if (result != NULL && ((MxStreamChunk*) result)->ReadChunk(p_buffer, (MxU8*) p_chunkData) != SUCCESS) {
|
MxStreamChunk* chunk = new MxStreamChunk();
|
||||||
delete result;
|
if (chunk && chunk->ReadChunk(p_buffer, (MxU8*) p_chunkData) != SUCCESS) {
|
||||||
result = NULL;
|
delete chunk;
|
||||||
|
chunk = NULL;
|
||||||
}
|
}
|
||||||
return result;
|
|
||||||
|
result = chunk;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -403,6 +417,7 @@ void MxDSBuffer::AddRef(MxDSChunk* p_chunk)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// FUNCTION: LEGO1 0x100c6ef0
|
// FUNCTION: LEGO1 0x100c6ef0
|
||||||
|
// FUNCTION: BETA10 0x101580ad
|
||||||
MxResult MxDSBuffer::CalcBytesRemaining(MxU8* p_data)
|
MxResult MxDSBuffer::CalcBytesRemaining(MxU8* p_data)
|
||||||
{
|
{
|
||||||
MxResult result = FAILURE;
|
MxResult result = FAILURE;
|
||||||
@ -412,11 +427,11 @@ MxResult MxDSBuffer::CalcBytesRemaining(MxU8* p_data)
|
|||||||
MxU8* ptr;
|
MxU8* ptr;
|
||||||
|
|
||||||
if (m_writeOffset == m_bytesRemaining) {
|
if (m_writeOffset == m_bytesRemaining) {
|
||||||
bytesRead = *(MxU32*) (p_data + 4) + 8;
|
|
||||||
ptr = p_data;
|
ptr = p_data;
|
||||||
|
bytesRead = *(MxU32*) (p_data + 4) + 8;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ptr = &p_data[MxStreamChunk::GetHeaderSize() + 8];
|
ptr = p_data + MxStreamChunk::GetHeaderSize() + 8;
|
||||||
bytesRead = (*(MxU32*) (p_data + 4)) - MxStreamChunk::GetHeaderSize();
|
bytesRead = (*(MxU32*) (p_data + 4)) - MxStreamChunk::GetHeaderSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user