core/GameConfigs.cpp
changeset 2217 eca7057167a0
parent 2142 d9d876e97a66
child 2219 5ddd93671335
     1.1 --- a/core/GameConfigs.cpp	Tue Jul 29 06:12:52 2008 +0000
     1.2 +++ b/core/GameConfigs.cpp	Wed Jul 30 00:03:10 2008 +0000
     1.3 @@ -65,6 +65,7 @@
     1.4  #define PSTATE_GAMEDEFS_SIGNATURES_SIG	8
     1.5  #define PSTATE_GAMEDEFS_CRC				9
     1.6  #define PSTATE_GAMEDEFS_CRC_BINARY		10
     1.7 +#define PSTATE_GAMEDEFS_CUSTOM			11
     1.8  
     1.9  #if defined PLATFORM_WINDOWS
    1.10  #define PLATFORM_NAME				"windows"
    1.11 @@ -96,6 +97,9 @@
    1.12  	m_pSigs = sm_trie_create();
    1.13  	m_pStrings = new BaseStringTable(512);
    1.14  	m_RefCount = 0;
    1.15 +
    1.16 +	m_CustomLevel = 0;
    1.17 +	m_CustomHandler = NULL;
    1.18  }
    1.19  
    1.20  CGameConfig::~CGameConfig()
    1.21 @@ -172,6 +176,17 @@
    1.22  			}
    1.23  			else
    1.24  			{
    1.25 +				ITextListener_SMC **pListen = g_GameConfigs.m_customHandlers.retrieve(name);
    1.26 +
    1.27 +				if (pListen != NULL)
    1.28 +				{
    1.29 +					m_CustomLevel = 0;
    1.30 +					m_ParseState = PSTATE_GAMEDEFS_CUSTOM;
    1.31 +					m_CustomHandler = *pListen;
    1.32 +					m_CustomHandler->ReadSMC_ParseStart();
    1.33 +					break;
    1.34 +				}
    1.35 +
    1.36  				m_IgnoreLevel++;
    1.37  			}
    1.38  			break;
    1.39 @@ -233,6 +248,12 @@
    1.40  			}
    1.41  			break;
    1.42  		}
    1.43 +	case PSTATE_GAMEDEFS_CUSTOM:
    1.44 +		{
    1.45 +			m_CustomLevel++;
    1.46 +			return m_CustomHandler->ReadSMC_NewSection(states, name);
    1.47 +			break;
    1.48 +		}
    1.49  	/* No sub-sections allowed:
    1.50  	 case PSTATE_GAMEDEFS_OFFSETS_OFFSET:
    1.51  	 case PSTATE_GAMEDEFS_KEYS:
    1.52 @@ -300,6 +321,8 @@
    1.53  				bShouldBeReadingDefault = true;
    1.54  			}
    1.55  		}
    1.56 +	} else if (m_ParseState == PSTATE_GAMEDEFS_CUSTOM) {
    1.57 +		return m_CustomHandler->ReadSMC_KeyValue(states, key, value);
    1.58  	}
    1.59  
    1.60  	return SMCResult_Continue;
    1.61 @@ -313,6 +336,13 @@
    1.62  		return SMCResult_Continue;
    1.63  	}
    1.64  
    1.65 +	if (m_CustomLevel)
    1.66 +	{
    1.67 +		m_CustomLevel--;
    1.68 +		m_CustomHandler->ReadSMC_LeavingSection(states);
    1.69 +		return SMCResult_Continue;
    1.70 +	}
    1.71 +
    1.72  	switch (m_ParseState)
    1.73  	{
    1.74  	case PSTATE_GAMES:
    1.75 @@ -325,6 +355,12 @@
    1.76  			m_ParseState = PSTATE_GAMES;
    1.77  			break;
    1.78  		}
    1.79 +	case PSTATE_GAMEDEFS_CUSTOM:
    1.80 +		{
    1.81 +			m_ParseState = PSTATE_GAMEDEFS;
    1.82 +			m_CustomHandler->ReadSMC_ParseEnd(false, false);
    1.83 +			break;
    1.84 +		}
    1.85  	case PSTATE_GAMEDEFS_KEYS:
    1.86  	case PSTATE_GAMEDEFS_OFFSETS:
    1.87  		{
    1.88 @@ -523,6 +559,15 @@
    1.89  			state.line,
    1.90  			state.col,
    1.91  			msg ? msg : "Unknown error");
    1.92 +
    1.93 +		if (m_ParseState == PSTATE_GAMEDEFS_CUSTOM)
    1.94 +		{
    1.95 +			//error occurred while parsing a custom section
    1.96 +			m_CustomHandler->ReadSMC_ParseEnd(true, true);
    1.97 +			m_CustomHandler = NULL;
    1.98 +			m_CustomLevel = 0;
    1.99 +		}
   1.100 +
   1.101  		return false;
   1.102  	}
   1.103  
   1.104 @@ -692,3 +737,27 @@
   1.105  
   1.106  	return conf;
   1.107  }
   1.108 +
   1.109 +void GameConfigManager::AddUserConfigHook( const char *sectionname, ITextListener_SMC *listener )
   1.110 +{
   1.111 +	m_customHandlers.insert(sectionname, listener);
   1.112 +}
   1.113 +
   1.114 +void GameConfigManager::RemoveUserConfigHook( const char *sectionname, ITextListener_SMC *listener )
   1.115 +{
   1.116 +	ITextListener_SMC **pListener = m_customHandlers.retrieve(sectionname);
   1.117 +
   1.118 +	if (pListener == NULL)
   1.119 +	{
   1.120 +		return;
   1.121 +	}
   1.122 +
   1.123 +	if (*pListener != listener)
   1.124 +	{
   1.125 +		return;
   1.126 +	}
   1.127 +
   1.128 +	m_customHandlers.remove(sectionname);
   1.129 +	
   1.130 +	return;
   1.131 +}