mirror of
https://github.com/isledecomp/isle.git
synced 2026-02-03 05:31:17 +00:00
merge
This commit is contained in:
parent
d3e09b9cdf
commit
104a509c13
@ -2,19 +2,49 @@
|
|||||||
#include "mxautolocker.h"
|
#include "mxautolocker.h"
|
||||||
#include "mxcore.h"
|
#include "mxcore.h"
|
||||||
#include "mxnotificationmanager.h"
|
#include "mxnotificationmanager.h"
|
||||||
|
#include "mxparam.h"
|
||||||
|
#include "mxtypes.h"
|
||||||
|
|
||||||
|
#include "compat.h"
|
||||||
|
#include "decomp.h"
|
||||||
|
|
||||||
// OFFSET: LEGO1 0x100ac320 TEMPLATE
|
// OFFSET: LEGO1 0x100ac320 TEMPLATE
|
||||||
// list<unsigned int,allocator<unsigned int> >::~list<unsigned int,allocator<unsigned int> >
|
// list<unsigned int,allocator<unsigned int> >::~list<unsigned int,allocator<unsigned int> >
|
||||||
|
|
||||||
// FIXME: Example of template compare functionality, remove before merging.
|
// FIXME: Example of template compare functionality, remove before merging.
|
||||||
#include <stl.h>
|
#include "mxstl.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
void make_a_list() {
|
void make_a_list() {
|
||||||
List<unsigned int> l;
|
List<unsigned int> l;
|
||||||
cout << l.size();
|
cout << l.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
// OFFSET: LEGO1 0x100ac450 STUB
|
DECOMP_SIZE_ASSERT(MxNotification, 0x8);
|
||||||
|
DECOMP_SIZE_ASSERT(MxNotificationManager, 0x40);
|
||||||
|
|
||||||
|
// OFFSET: LEGO1 0x100ac220
|
||||||
|
MxNotification::MxNotification(MxCore *p_target, MxParam *p_param)
|
||||||
|
{
|
||||||
|
m_target = p_target;
|
||||||
|
m_param = p_param->Clone();
|
||||||
|
}
|
||||||
|
|
||||||
|
// OFFSET: LEGO1 0x100ac240
|
||||||
|
MxNotification::~MxNotification()
|
||||||
|
{
|
||||||
|
delete m_param;
|
||||||
|
}
|
||||||
|
|
||||||
|
// OFFSET: LEGO1 0x100ac250
|
||||||
|
MxNotificationManager::MxNotificationManager() : MxCore(), m_lock(), m_listenerIds()
|
||||||
|
{
|
||||||
|
m_unk2c = 0;
|
||||||
|
m_queue = NULL;
|
||||||
|
m_active = TRUE;
|
||||||
|
m_sendList = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// OFFSET: LEGO1 0x100ac450
|
||||||
MxNotificationManager::~MxNotificationManager()
|
MxNotificationManager::~MxNotificationManager()
|
||||||
{
|
{
|
||||||
MxAutoLocker lock(&m_lock);
|
MxAutoLocker lock(&m_lock);
|
||||||
@ -51,10 +81,116 @@ MxResult MxNotificationManager::Tickle()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// OFFSET: LEGO1 0x100ac800 STUB
|
// OFFSET: LEGO1 0x100ac600
|
||||||
MxLong MxNotificationManager::Tickle()
|
MxResult MxNotificationManager::Create(MxS32 p_unk1, MxS32 p_unk2)
|
||||||
{
|
{
|
||||||
// TODO
|
MxResult result = SUCCESS;
|
||||||
|
m_queue = new MxNotificationPtrList();
|
||||||
|
|
||||||
return 0;
|
if (m_queue == NULL) {
|
||||||
|
result = FAILURE;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
TickleManager()->RegisterClient(this, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// OFFSET: LEGO1 0x100acd20
|
||||||
|
void MxNotificationManager::Register(MxCore *p_listener)
|
||||||
|
{
|
||||||
|
MxAutoLocker lock(&m_lock);
|
||||||
|
|
||||||
|
MxIdList::iterator it = find(m_listenerIds.begin(), m_listenerIds.end(), p_listener->GetId());
|
||||||
|
if (it != m_listenerIds.end())
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_listenerIds.push_back(p_listener->GetId());
|
||||||
|
}
|
||||||
|
|
||||||
|
// OFFSET: LEGO1 0x100acdf0
|
||||||
|
void MxNotificationManager::Unregister(MxCore *p_listener)
|
||||||
|
{
|
||||||
|
MxAutoLocker lock(&m_lock);
|
||||||
|
|
||||||
|
MxIdList::iterator it = find(m_listenerIds.begin(), m_listenerIds.end(), p_listener->GetId());
|
||||||
|
|
||||||
|
if (it != m_listenerIds.end()) {
|
||||||
|
m_listenerIds.erase(it);
|
||||||
|
FlushPending(p_listener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// OFFSET: LEGO1 0x100ac990
|
||||||
|
void MxNotificationManager::FlushPending(MxCore *p_listener)
|
||||||
|
{
|
||||||
|
MxNotificationPtrList pending;
|
||||||
|
MxNotification *notif;
|
||||||
|
|
||||||
|
{
|
||||||
|
MxAutoLocker lock(&m_lock);
|
||||||
|
|
||||||
|
// Find all notifications from, and addressed to, p_listener.
|
||||||
|
if (m_sendList != NULL) {
|
||||||
|
MxNotificationPtrList::iterator it = m_sendList->begin();
|
||||||
|
while (it != m_sendList->end()) {
|
||||||
|
notif = *it;
|
||||||
|
if ((notif->GetTarget()->GetId() == p_listener->GetId()) ||
|
||||||
|
(notif->GetParam()->GetSender()) && (notif->GetParam()->GetSender()->GetId() == p_listener->GetId())) {
|
||||||
|
m_sendList->erase(it++);
|
||||||
|
pending.push_back(notif);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
it++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MxNotificationPtrList::iterator it = m_queue->begin();
|
||||||
|
while (it != m_queue->end()) {
|
||||||
|
notif = *it;
|
||||||
|
if ((notif->GetTarget()->GetId() == p_listener->GetId()) ||
|
||||||
|
(notif->GetParam()->GetSender()) && (notif->GetParam()->GetSender()->GetId() == p_listener->GetId())) {
|
||||||
|
m_queue->erase(it++);
|
||||||
|
pending.push_back(notif);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
it++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deliver those notifications.
|
||||||
|
while (pending.size() != 0) {
|
||||||
|
notif = pending.front();
|
||||||
|
pending.pop_front();
|
||||||
|
notif->GetTarget()->Notify(*notif->GetParam());
|
||||||
|
delete notif;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// OFFSET: LEGO1 0x100ac6c0
|
||||||
|
MxResult MxNotificationManager::Send(MxCore *p_listener, MxParam *p_param)
|
||||||
|
{
|
||||||
|
MxAutoLocker lock(&m_lock);
|
||||||
|
|
||||||
|
if (m_active == FALSE) {
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
MxIdList::iterator it = find(m_listenerIds.begin(), m_listenerIds.end(), p_listener->GetId());
|
||||||
|
if (it == m_listenerIds.end()) {
|
||||||
|
return FAILURE;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
MxNotification *notif = new MxNotification(p_listener, p_param);
|
||||||
|
if (notif != NULL) {
|
||||||
|
m_queue->push_back(notif);
|
||||||
|
return SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return FAILURE;
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue
Block a user