core/ConsoleDetours.cpp
changeset 4071 dbb9a3f48650
parent 4055 ed3aad0ec4cf
child 4139 de7d1cd00703
     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;