mirror of
https://github.com/isledecomp/isle-portable.git
synced 2024-11-22 15:37:55 -05:00
Implement AddPresenter, RemovePresenter, StopPresenters (#124)
* Add MxList, MxPresenterList, add to MxMediaManager * Match ~MxList<T> * Implement AddPresenter, RemovePresenter, StopPresenters * Initial implementation of RemovePresenter/Find/Detach * Implement/match MxMediaManager::StopPresenters * Move definitions out of class body * Match RemovePresenter/Detach * Fix style * Fix merge error * Fix merge error * Fix merge error * Remove space
This commit is contained in:
parent
253538feed
commit
b819657bd8
5 changed files with 165 additions and 20 deletions
|
@ -67,7 +67,7 @@ class MxHashTable : protected HashTableParent<T>
|
|||
virtual ~MxHashTable();
|
||||
|
||||
void Resize();
|
||||
void MxHashTable::Add(T* );
|
||||
void Add(T* );
|
||||
|
||||
virtual MxS8 Compare(T*, T*) = 0;
|
||||
|
||||
|
|
118
LEGO1/mxlist.h
118
LEGO1/mxlist.h
|
@ -5,13 +5,14 @@
|
|||
#include "mxcore.h"
|
||||
|
||||
template <class T>
|
||||
// SIZE 0xc
|
||||
class MxListEntry
|
||||
{
|
||||
public:
|
||||
MxListEntry<T>() {}
|
||||
MxListEntry<T>(T *p_obj) {
|
||||
MxListEntry() {}
|
||||
MxListEntry(T *p_obj, MxListEntry *p_prev) {
|
||||
m_obj = p_obj;
|
||||
m_prev = NULL;
|
||||
m_prev = p_prev;
|
||||
m_next = NULL;
|
||||
}
|
||||
|
||||
|
@ -56,9 +57,54 @@ class MxList : protected MxListParent<T>
|
|||
}
|
||||
|
||||
virtual ~MxList();
|
||||
|
||||
void Append(T*);
|
||||
|
||||
friend class MxListCursor<T>;
|
||||
|
||||
protected:
|
||||
MxListEntry<T> *m_first; // +0x10
|
||||
MxListEntry<T> *m_last; // +0x14
|
||||
|
||||
private:
|
||||
void _DeleteEntry(MxListEntry<T> *match);
|
||||
};
|
||||
|
||||
// VTABLE 0x100d6488
|
||||
template <class T>
|
||||
class MxListCursor : public MxCore
|
||||
{
|
||||
public:
|
||||
MxListCursor(MxList<T> *p_list) {
|
||||
m_list = p_list;
|
||||
m_match = NULL;
|
||||
}
|
||||
|
||||
MxBool Find(T *p_obj);
|
||||
void Detach();
|
||||
MxBool Next(T*& p_obj);
|
||||
|
||||
private:
|
||||
MxList<T> *m_list;
|
||||
MxListEntry<T> *m_match;
|
||||
};
|
||||
|
||||
// Unclear purpose
|
||||
// VTABLE 0x100d6530
|
||||
template <class T>
|
||||
class MxListCursorChild : public MxListCursor<T>
|
||||
{
|
||||
public:
|
||||
MxListCursorChild(MxList<T> *p_list) : MxListCursor<T>(p_list) {}
|
||||
};
|
||||
|
||||
// Unclear purpose
|
||||
// VTABLE 0x100d6470
|
||||
template <class T>
|
||||
class MxListCursorChildChild : public MxListCursorChild<T>
|
||||
{
|
||||
public:
|
||||
MxListCursorChildChild(MxList<T> *p_list) : MxListCursorChild<T>(p_list) {}
|
||||
};
|
||||
|
||||
template <class T>
|
||||
|
@ -80,4 +126,70 @@ MxList<T>::~MxList()
|
|||
m_first = NULL;
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline void MxList<T>::Append(T *p_newobj)
|
||||
{
|
||||
MxListEntry<T> *currentLast = this->m_last;
|
||||
MxListEntry<T> *newEntry = new MxListEntry<T>(p_newobj, currentLast);
|
||||
|
||||
if (currentLast)
|
||||
currentLast->m_next = newEntry;
|
||||
else
|
||||
this->m_first = newEntry;
|
||||
|
||||
this->m_last = newEntry;
|
||||
this->m_count++;
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline void MxList<T>::_DeleteEntry(MxListEntry<T> *match)
|
||||
{
|
||||
MxListEntry<T> **pPrev = &match->m_prev;
|
||||
MxListEntry<T> **pNext = &match->m_next;
|
||||
|
||||
if (match->m_prev)
|
||||
match->m_prev->m_next = *pNext;
|
||||
else
|
||||
m_first = *pNext;
|
||||
|
||||
if (*pNext)
|
||||
(*pNext)->m_prev = *pPrev;
|
||||
else
|
||||
m_last = *pPrev;
|
||||
|
||||
delete match;
|
||||
m_count--;
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline MxBool MxListCursor<T>::Find(T *p_obj)
|
||||
{
|
||||
for (m_match = m_list->m_first;
|
||||
m_match && m_list->Compare(m_match->m_obj, p_obj);
|
||||
m_match = m_match->m_next);
|
||||
|
||||
return m_match != NULL;
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline void MxListCursor<T>::Detach()
|
||||
{
|
||||
m_list->_DeleteEntry(m_match);
|
||||
m_match = NULL;
|
||||
}
|
||||
|
||||
template <class T>
|
||||
inline MxBool MxListCursor<T>::Next(T*& p_obj)
|
||||
{
|
||||
if (!m_match)
|
||||
m_match = m_list->m_first;
|
||||
else
|
||||
m_match = m_match->m_next;
|
||||
|
||||
if (m_match)
|
||||
p_obj = m_match->m_obj;
|
||||
|
||||
return m_match != NULL;
|
||||
}
|
||||
|
||||
#endif // MXLIST_H
|
|
@ -1,9 +1,12 @@
|
|||
#include "mxmediamanager.h"
|
||||
#include "mxautolocker.h"
|
||||
#include "mxpresenter.h"
|
||||
#include "decomp.h"
|
||||
|
||||
DECOMP_SIZE_ASSERT(MxMediaManager, 0x2c);
|
||||
|
||||
typedef MxListCursorChildChild<MxPresenter> MxPresenterListCursor;
|
||||
|
||||
// OFFSET: LEGO1 0x100b84c0
|
||||
MxMediaManager::MxMediaManager()
|
||||
{
|
||||
|
@ -24,17 +27,6 @@ MxResult MxMediaManager::Init()
|
|||
return SUCCESS;
|
||||
}
|
||||
|
||||
// OFFSET: LEGO1 0x100b8710
|
||||
void MxMediaManager::Destroy()
|
||||
{
|
||||
MxAutoLocker lock(&this->m_criticalSection);
|
||||
|
||||
if (this->m_presenters)
|
||||
delete this->m_presenters;
|
||||
|
||||
Init();
|
||||
}
|
||||
|
||||
// OFFSET: LEGO1 0x100b8790 STUB
|
||||
MxResult MxMediaManager::Tickle()
|
||||
{
|
||||
|
@ -55,3 +47,43 @@ MxResult MxMediaManager::InitPresenters()
|
|||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
// OFFSET: LEGO1 0x100b8710
|
||||
void MxMediaManager::Destroy()
|
||||
{
|
||||
MxAutoLocker lock(&this->m_criticalSection);
|
||||
|
||||
if (this->m_presenters)
|
||||
delete this->m_presenters;
|
||||
|
||||
Init();
|
||||
}
|
||||
|
||||
// OFFSET: LEGO1 0x100b88c0
|
||||
void MxMediaManager::AddPresenter(MxPresenter &p_presenter)
|
||||
{
|
||||
MxAutoLocker lock(&this->m_criticalSection);
|
||||
|
||||
this->m_presenters->Append(&p_presenter);
|
||||
}
|
||||
|
||||
// OFFSET: LEGO1 0x100b8980
|
||||
void MxMediaManager::RemovePresenter(MxPresenter &p_presenter)
|
||||
{
|
||||
MxAutoLocker lock(&this->m_criticalSection);
|
||||
MxPresenterListCursor cursor(this->m_presenters);
|
||||
|
||||
if (cursor.Find(&p_presenter))
|
||||
cursor.Detach();
|
||||
}
|
||||
|
||||
// OFFSET: LEGO1 0x100b8ac0
|
||||
void MxMediaManager::StopPresenters()
|
||||
{
|
||||
MxAutoLocker lock(&this->m_criticalSection);
|
||||
MxPresenter *presenter;
|
||||
MxPresenterListCursor cursor(this->m_presenters);
|
||||
|
||||
while (cursor.Next(presenter))
|
||||
presenter->EndAction();
|
||||
}
|
||||
|
|
|
@ -18,14 +18,15 @@ class MxMediaManager : public MxCore
|
|||
virtual MxResult Tickle(); // vtable+08
|
||||
virtual MxResult InitPresenters(); // vtable+14
|
||||
virtual void Destroy(); // vtable+18
|
||||
// vtable+1c
|
||||
// vtable+20
|
||||
// vtable+24
|
||||
virtual void AddPresenter(MxPresenter &p_presenter); // vtable+1c
|
||||
virtual void RemovePresenter(MxPresenter &p_presenter); // vtable+20
|
||||
virtual void StopPresenters(); // vtable+24
|
||||
|
||||
MxResult Init();
|
||||
|
||||
private:
|
||||
MxPresenterList *m_presenters;
|
||||
MxThread* m_thread; // 0xc
|
||||
MxThread *m_thread; // 0xc
|
||||
|
||||
protected:
|
||||
MxCriticalSection m_criticalSection; // 0x10
|
||||
|
|
|
@ -77,7 +77,7 @@ class MxPresenter : public MxCore
|
|||
undefined4 m_unk0x10;
|
||||
undefined4 m_unk0x14;
|
||||
undefined4 m_unk0x18;
|
||||
MxDSAction* m_action; // 0
|
||||
MxDSAction *m_action; // 0
|
||||
MxCriticalSection m_criticalSection;
|
||||
MxPresenter *m_unkPresenter; // 0x3c
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue