diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/fullpipe/messagequeue.cpp | 136 | ||||
-rw-r--r-- | engines/fullpipe/messagequeue.h | 8 |
2 files changed, 144 insertions, 0 deletions
diff --git a/engines/fullpipe/messagequeue.cpp b/engines/fullpipe/messagequeue.cpp index 7688a6a129..9d2ec383fb 100644 --- a/engines/fullpipe/messagequeue.cpp +++ b/engines/fullpipe/messagequeue.cpp @@ -119,4 +119,140 @@ void updateMessageHandlerIndex(MessageHandler *msg, int offset) { msg->index += offset; } +void addMessageHandler(int (*callback)(ExCommand *), int16 id) { + if (getMessageHandlerById(id)) + return; + + MessageHandler *curItem = g_fullpipe->_messageHandlers; + + if (!curItem) + return; + + int index = 0; + for (MessageHandler *i = g_fullpipe->_messageHandlers->nextItem; i; i = i->nextItem) { + curItem = i; + index++; + } + + allocMessageHandler(curItem, id, callback, index); + + if (curItem) + updateMessageHandlerIndex(curItem->nextItem->nextItem, 1); + +} + +MessageHandler *getMessageHandlerById(int16 id) { + MessageHandler *curItem = g_fullpipe->_messageHandlers; + + if (!curItem) + return 0; + + while (id != curItem->id) { + curItem = curItem->nextItem; + + if (!curItem) + return 0; + } + + return curItem; +} + +bool allocMessageHandler(MessageHandler *where, int16 id, int (*callback)(ExCommand *), int index) { + MessageHandler *msg = new MessageHandler; + + if (where) { + msg->nextItem = where->nextItem; + where->nextItem = msg; + msg->id = id; + msg->callback = callback; + msg->index = index; + } else { + msg->nextItem = 0; + msg->id = id; + msg->callback = callback; + msg->index = 0; + + g_fullpipe->_messageHandlers = msg; + } + + return true; +} + +int getMessageHandlersCount() { + int result; + MessageHandler *curItem = g_fullpipe->_messageHandlers; + + for (result = 0; curItem; result++) + curItem = curItem->nextItem; + + return result; +} + +bool addMessageHandlerByIndex(int (*callback)(ExCommand *), int index, int16 id) { + if (getMessageHandlerById(id)) + return false; + + if (index) { + MessageHandler *curItem = g_fullpipe->_messageHandlers; + + for (int i = index - 1; i > 0; i--) + if (curItem) + curItem = curItem->nextItem; + + bool res = allocMessageHandler(curItem, id, callback, index); + + if (res) + updateMessageHandlerIndex(curItem->nextItem->nextItem, 1); + + return res; + } else { + MessageHandler *newItem = new MessageHandler; + + newItem->nextItem = g_fullpipe->_messageHandlers; + newItem->id = id; + newItem->callback = callback; + newItem->index = 0; + + updateMessageHandlerIndex(g_fullpipe->_messageHandlers, 1); + g_fullpipe->_messageHandlers = newItem; + + return true; + } +} + +bool insertMessageHandler(int (*callback)(ExCommand *), int index, int16 id) { + if (getMessageHandlerById(id)) + return false; + + MessageHandler *curItem = g_fullpipe->_messageHandlers; + + for (int i = index; i > 0; i--) + if (curItem) + curItem = curItem->nextItem; + + bool res = allocMessageHandler(curItem, id, callback, index + 1); + if (curItem) + updateMessageHandlerIndex(curItem->nextItem->nextItem, 1); + + return res; +} + +void clearMessageHandlers() { + MessageHandler *curItem; + MessageHandler *nextItem; + + curItem = g_fullpipe->_messageHandlers; + if (curItem) { + do { + nextItem = curItem->nextItem; + + delete curItem; + + curItem = nextItem; + } while (nextItem); + + g_fullpipe->_messageHandlers = 0; + } +} + } // End of namespace Fullpipe diff --git a/engines/fullpipe/messagequeue.h b/engines/fullpipe/messagequeue.h index bb8d4108e3..b47bf49049 100644 --- a/engines/fullpipe/messagequeue.h +++ b/engines/fullpipe/messagequeue.h @@ -72,6 +72,14 @@ struct MessageHandler { bool removeMessageHandler(int16 id, int pos); void updateMessageHandlerIndex(MessageHandler *msg, int offset); +void addMessageHandler(int (*callback)(ExCommand *), int16 id); +MessageHandler *getMessageHandlerById(int16 id); +bool allocMessageHandler(MessageHandler *where, int16 id, int (*callback)(ExCommand *), int index); +int getMessageHandlersCount(); +bool addMessageHandlerByIndex(int (*callback)(ExCommand *), int index, int16 id); +bool insertMessageHandler(int (*callback)(ExCommand *), int index, int16 id); +void clearMessageHandlers(); + } // End of namespace Fullpipe |