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 +}