1.1 --- a/core/ConsoleDetours.cpp Sun Aug 25 12:13:30 2013 -0700
1.2 +++ b/core/ConsoleDetours.cpp Sun Aug 25 12:15:26 2013 -0700
1.3 @@ -50,6 +50,7 @@
1.4 #include "HalfLife2.h"
1.5 #include "ConCommandBaseIterator.h"
1.6 #include "logic_bridge.h"
1.7 +#include <am-utility.h>
1.8
1.9 #if defined PLATFORM_POSIX
1.10 # include <dlfcn.h>
1.11 @@ -585,13 +586,11 @@
1.12
1.13 void ConsoleDetours::OnSourceModShutdown()
1.14 {
1.15 - List<Listener*>::iterator iter = m_Listeners.begin();
1.16 - while (iter != m_Listeners.end())
1.17 + for (StringHashMap<IChangeableForward *>::iterator iter = m_Listeners.iter();
1.18 + !iter.empty();
1.19 + iter.next())
1.20 {
1.21 - Listener *listener = (*iter);
1.22 - g_Forwards.ReleaseForward(listener->forward);
1.23 - delete listener;
1.24 - iter = m_Listeners.erase(iter);
1.25 + g_Forwards.ReleaseForward(iter->value);
1.26 }
1.27
1.28 g_Forwards.ReleaseForward(m_pForward);
1.29 @@ -623,22 +622,15 @@
1.30 }
1.31 else
1.32 {
1.33 - const char *str = UTIL_ToLowerCase(command);
1.34 - Listener *listener;
1.35 - Listener **plistener = m_CmdLookup.retrieve(str);
1.36 - if (plistener == NULL)
1.37 + ke::AutoArray<char> str(UTIL_ToLowerCase(command));
1.38 + IChangeableForward *forward;
1.39 + if (!m_Listeners.retrieve(str, &forward))
1.40 {
1.41 - listener = new Listener;
1.42 - listener->forward = g_Forwards.CreateForwardEx(NULL, ET_Hook, 3, NULL, Param_Cell,
1.43 - Param_String, Param_Cell);
1.44 - m_CmdLookup.insert(str, listener);
1.45 + forward = g_Forwards.CreateForwardEx(NULL, ET_Hook, 3, NULL, Param_Cell,
1.46 + Param_String, Param_Cell);
1.47 + m_Listeners.insert(str, forward);
1.48 }
1.49 - else
1.50 - {
1.51 - listener = *plistener;
1.52 - }
1.53 - listener->forward->AddFunction(fun);
1.54 - delete [] str;
1.55 + forward->AddFunction(fun);
1.56 }
1.57
1.58 return true;
1.59 @@ -652,14 +644,11 @@
1.60 }
1.61 else
1.62 {
1.63 - const char *str = UTIL_ToLowerCase(command);
1.64 - Listener *listener;
1.65 - Listener **plistener = m_CmdLookup.retrieve(str);
1.66 - delete [] str;
1.67 - if (plistener == NULL)
1.68 + ke::AutoArray<char> str(UTIL_ToLowerCase(command));
1.69 + IChangeableForward *forward;
1.70 + if (!m_Listeners.retrieve(str, &forward))
1.71 return false;
1.72 - listener = *plistener;
1.73 - return listener->forward->RemoveFunction(fun);
1.74 + return forward->RemoveFunction(fun);
1.75 }
1.76 }
1.77
1.78 @@ -695,18 +684,17 @@
1.79 if (result >= Pl_Handled)
1.80 return result;
1.81
1.82 - Listener **plistener = m_CmdLookup.retrieve(name);
1.83 - if (plistener == NULL)
1.84 + IChangeableForward *forward;
1.85 + if (!m_Listeners.retrieve(name, &forward))
1.86 return result;
1.87 - Listener *listener = *plistener;
1.88 - if (listener->forward->GetFunctionCount() == 0)
1.89 + if (forward->GetFunctionCount() == 0)
1.90 return result;
1.91
1.92 cell_t result2 = Pl_Continue;
1.93 - listener->forward->PushCell(client);
1.94 - listener->forward->PushString(name);
1.95 - listener->forward->PushCell(args.ArgC() - 1);
1.96 - listener->forward->Execute(&result2, NULL);
1.97 + forward->PushCell(client);
1.98 + forward->PushString(name);
1.99 + forward->PushCell(args.ArgC() - 1);
1.100 + forward->Execute(&result2, NULL);
1.101
1.102 if (result2 > result)
1.103 result = result2;