diff --git a/LEGO1/mxdiskstreamcontroller.cpp b/LEGO1/mxdiskstreamcontroller.cpp index c9fa1ed1..a69e089a 100644 --- a/LEGO1/mxdiskstreamcontroller.cpp +++ b/LEGO1/mxdiskstreamcontroller.cpp @@ -88,11 +88,29 @@ void MxDiskStreamController::FUN_100c7980() } } -// STUB: LEGO1 0x100c7ac0 +// FUNCTION: LEGO1 0x100c7ac0 MxDSStreamingAction* MxDiskStreamController::VTable0x28() { - // TODO - return NULL; + MxAutoLocker lock(&this->m_criticalSection); + MxDSStreamingAction* result = NULL; + MxU32 filesize = m_provider->GetFileSize(); + + if(m_unk0x3c.size() != 0) + { + MxDSStreamingAction* oldAction = (MxDSStreamingAction*) m_unk0x3c.front(); + m_unk0x3c.pop_front(); + + MxDSStreamingAction* action = new MxDSStreamingAction(*oldAction); + result = action; + if(action) + { + oldAction->SetUnknown94(action->GetBufferOffset() + filesize); + oldAction->SetBufferOffset(action->GetBufferOffset() + filesize); + m_unk0x3c.push_back(action); + } + } + + return result; } // FUNCTION: LEGO1 0x100c7c00 @@ -102,21 +120,17 @@ MxResult MxDiskStreamController::VTable0x30(MxDSAction* p_action) MxResult result = MxStreamController::VTable0x30(p_action); MxDSStreamingAction* item; - while(TRUE) - { - item = (MxDSStreamingAction*)m_list0x90.Find(p_action, TRUE); - if (item == NULL) - { + while (TRUE) { + item = (MxDSStreamingAction*) m_list0x90.Find(p_action, TRUE); + if (item == NULL) { break; } FUN_100c7cb0(item); } - while(TRUE) - { - item = (MxDSStreamingAction*)m_list0x64.Find(p_action, TRUE); - if (item == NULL) - { + while (TRUE) { + item = (MxDSStreamingAction*) m_list0x64.Find(p_action, TRUE); + if (item == NULL) { break; } FUN_100c7cb0(item); diff --git a/LEGO1/mxdsstreamingaction.h b/LEGO1/mxdsstreamingaction.h index 49c2d74f..5b764c8f 100644 --- a/LEGO1/mxdsstreamingaction.h +++ b/LEGO1/mxdsstreamingaction.h @@ -35,7 +35,10 @@ class MxDSStreamingAction : public MxDSAction { inline MxDSBuffer* GetUnknowna0() { return m_unk0xa0; } inline MxDSBuffer* GetUnknowna4() { return m_unk0xa4; } inline MxDSAction* GetInternalAction() { return m_internalAction; } + inline MxU32 GetBufferOffset() { return m_bufferOffset; } + inline void SetUnknown94(MxU32 p_unk0x94) { m_unk0x94 = p_unk0x94; } inline void SetUnknowna0(MxDSBuffer* p_unk0xa0) { m_unk0xa0 = p_unk0xa0; } + inline void SetBufferOffset(MxU32 p_bufferOffset) { m_bufferOffset = p_bufferOffset; } private: MxU32 m_unk0x94;