diff options
| author | oy <Tom_Adams@web.de> | 2010-08-07 20:22:25 +0200 |
|---|---|---|
| committer | oy <Tom_Adams@web.de> | 2010-08-07 20:22:25 +0200 |
| commit | ad9b32b7417d0837c485b6c9b802cc90aa51c521 (patch) | |
| tree | fb2c0cd8d68f58bbbd1e0d895cb82086ea824fe7 /src/engine/shared | |
| parent | 3f0ff1fb1404efcb312a6bfcef0beb4b6a0d92ef (diff) | |
| download | zcatch-ad9b32b7417d0837c485b6c9b802cc90aa51c521.tar.gz zcatch-ad9b32b7417d0837c485b6c9b802cc90aa51c521.zip | |
added the possibility to store commands within the console and execute them later on when everything is initialised correctly - fixes several possible startup crashes and the "Support bans in server configuration"-ticket
Diffstat (limited to 'src/engine/shared')
| -rw-r--r-- | src/engine/shared/config.h | 3 | ||||
| -rw-r--r-- | src/engine/shared/console.cpp | 42 | ||||
| -rw-r--r-- | src/engine/shared/console.h | 32 |
3 files changed, 64 insertions, 13 deletions
diff --git a/src/engine/shared/config.h b/src/engine/shared/config.h index 10a54004..ccece08c 100644 --- a/src/engine/shared/config.h +++ b/src/engine/shared/config.h @@ -16,7 +16,8 @@ enum { CFGFLAG_SAVE=1, CFGFLAG_CLIENT=2, - CFGFLAG_SERVER=4 + CFGFLAG_SERVER=4, + CFGFLAG_STORE=8 }; #endif diff --git a/src/engine/shared/console.cpp b/src/engine/shared/console.cpp index b7850bea..a6cf4d0b 100644 --- a/src/engine/shared/console.cpp +++ b/src/engine/shared/console.cpp @@ -1,3 +1,4 @@ +#include <new> #include <base/system.h> #include <engine/shared/protocol.h> #include <engine/storage.h> @@ -172,12 +173,8 @@ void CConsole::Print(const char *pStr) void CConsole::ExecuteLineStroked(int Stroke, const char *pStr) { - CResult Result; + CResult *pResult = new(&m_ExecutionQueue.m_pLast->m_Result) CResult; - char aStrokeStr[2] = {'0', 0}; - if(Stroke) - aStrokeStr[0] = '1'; - while(pStr && *pStr) { const char *pEnd = pStr; @@ -207,37 +204,43 @@ void CConsole::ExecuteLineStroked(int Stroke, const char *pStr) pEnd++; } - if(ParseStart(&Result, pStr, (pEnd-pStr) + 1) != 0) + if(ParseStart(pResult, pStr, (pEnd-pStr) + 1) != 0) return; - CCommand *pCommand = FindCommand(Result.m_pCommand, m_FlagMask); + CCommand *pCommand = FindCommand(pResult->m_pCommand, m_FlagMask); if(pCommand) { int IsStrokeCommand = 0; - if(Result.m_pCommand[0] == '+') + if(pResult->m_pCommand[0] == '+') { // insert the stroke direction token - Result.AddArgument(aStrokeStr); + pResult->AddArgument(m_paStrokeStr[Stroke]); IsStrokeCommand = 1; } if(Stroke || IsStrokeCommand) { - if(ParseArgs(&Result, pCommand->m_pParams)) + if(ParseArgs(pResult, pCommand->m_pParams)) { char aBuf[256]; str_format(aBuf, sizeof(aBuf), "Invalid arguments... Usage: %s %s", pCommand->m_pName, pCommand->m_pParams); Print(aBuf); } + else if(m_StoreCommands && pCommand->m_Flags&CFGFLAG_STORE) + { + m_ExecutionQueue.m_pLast->m_pfnCommandCallback = pCommand->m_pfnCallback; + m_ExecutionQueue.m_pLast->m_pCommandUserData = pCommand->m_pUserData; + m_ExecutionQueue.AddEntry(); + } else - pCommand->m_pfnCallback(&Result, pCommand->m_pUserData); + pCommand->m_pfnCallback(pResult, pCommand->m_pUserData); } } else if(Stroke) { char aBuf[256]; - str_format(aBuf, sizeof(aBuf), "No such command: %s.", Result.m_pCommand); + str_format(aBuf, sizeof(aBuf), "No such command: %s.", pResult->m_pCommand); Print(aBuf); } @@ -390,6 +393,10 @@ static void StrVariableCommand(IConsole::IResult *pResult, void *pUserData) CConsole::CConsole(int FlagMask) { m_FlagMask = FlagMask; + m_StoreCommands = true; + m_paStrokeStr[0] = "0"; + m_paStrokeStr[1] = "1"; + m_ExecutionQueue.Reset(); m_pFirstCommand = 0; m_pFirstExec = 0; m_pPrintCallbackUserdata = 0; @@ -483,6 +490,17 @@ void CConsole::Chain(const char *pName, FChainCommandCallback pfnChainFunc, void pCommand->m_pUserData = pChainInfo; } +void CConsole::StoreCommands(bool Store) +{ + if(!Store) + { + for(CExecutionQueue::CQueueEntry *pEntry = m_ExecutionQueue.m_pFirst; pEntry != m_ExecutionQueue.m_pLast; pEntry = pEntry->m_pNext) + pEntry->m_pfnCommandCallback(&pEntry->m_Result, pEntry->m_pCommandUserData); + m_ExecutionQueue.Reset(); + } + m_StoreCommands = Store; +} + IConsole::CCommandInfo *CConsole::GetCommandInfo(const char *pName, int FlagMask) { diff --git a/src/engine/shared/console.h b/src/engine/shared/console.h index 9064fa86..9c127ae0 100644 --- a/src/engine/shared/console.h +++ b/src/engine/shared/console.h @@ -2,6 +2,7 @@ #define ENGINE_SHARED_CONSOLE_H #include <engine/console.h> +#include "memheap.h" class CConsole : public IConsole { @@ -25,6 +26,8 @@ class CConsole : public IConsole }; int m_FlagMask; + bool m_StoreCommands; + const char *m_paStrokeStr[2]; CCommand *m_pFirstCommand; class CExecFile @@ -75,6 +78,34 @@ class CConsole : public IConsole int ParseStart(CResult *pResult, const char *pString, int Length); int ParseArgs(CResult *pResult, const char *pFormat); + class CExecutionQueue + { + CHeap m_Queue; + + public: + struct CQueueEntry + { + CQueueEntry *m_pNext; + FCommandCallback m_pfnCommandCallback; + void *m_pCommandUserData; + CResult m_Result; + } *m_pFirst, *m_pLast; + + void AddEntry() + { + CQueueEntry *pEntry = static_cast<CQueueEntry *>(m_Queue.Allocate(sizeof(CQueueEntry))); + pEntry->m_pNext = 0; + m_pLast->m_pNext = pEntry; + m_pLast = pEntry; + } + void Reset() + { + m_Queue.Reset(); + m_pFirst = m_pLast = static_cast<CQueueEntry *>(m_Queue.Allocate(sizeof(CQueueEntry))); + m_pLast->m_pNext = 0; + } + } m_ExecutionQueue; + CCommand *FindCommand(const char *pName, int FlagMask); public: @@ -86,6 +117,7 @@ public: virtual void ParseArguments(int NumArgs, const char **ppArguments); virtual void Register(const char *pName, const char *pParams, int Flags, FCommandCallback pfnFunc, void *pUser, const char *pHelp); virtual void Chain(const char *pName, FChainCommandCallback pfnChainFunc, void *pUser); + virtual void StoreCommands(bool Store); virtual void ExecuteLine(const char *pStr); virtual void ExecuteFile(const char *pFilename); |