dvander@592: /** dvander@592: * vim: set ts=4 : ds@1330: * ============================================================================= dvander@1231: * SourceMod ds@1947: * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. ds@1330: * ============================================================================= dvander@592: * ds@1330: * This program is free software; you can redistribute it and/or modify it under ds@1330: * the terms of the GNU General Public License, version 3.0, as published by the ds@1330: * Free Software Foundation. dvander@1231: * ds@1330: * This program is distributed in the hope that it will be useful, but WITHOUT ds@1330: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS ds@1330: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more ds@1330: * details. dvander@1231: * ds@1330: * You should have received a copy of the GNU General Public License along with ds@1330: * this program. If not, see . dvander@1231: * ds@1330: * As a special exception, AlliedModders LLC gives you permission to link the ds@1330: * code of this program (as well as its derivative works) to "Half-Life 2," the ds@1330: * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software ds@1330: * by the Valve Corporation. You must obey the GNU General Public License in ds@1330: * all respects for all other code used. Additionally, AlliedModders LLC grants ds@1330: * this exception to all derivative works. AlliedModders LLC defines further ds@1330: * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), ds@1330: * or . dvander@592: * dvander@592: * Version: $Id$ dvander@592: */ dvander@592: dvander@592: #ifndef _INCLUDE_SOURCEMOD_CGAMECONFIGS_H_ dvander@592: #define _INCLUDE_SOURCEMOD_CGAMECONFIGS_H_ dvander@592: dvander@3010: #include "common_logic.h" dvander@592: #include dvander@592: #include dvander@592: #include dvander@592: #include "sm_memtable.h" dvander@3010: #include dvander@592: dvander@592: using namespace SourceMod; dvander@592: using namespace SourceHook; dvander@592: dvander@592: class SendProp; dvander@592: dvander@592: class CGameConfig : dvander@592: public ITextListener_SMC, dvander@592: public IGameConfig dvander@592: { dvander@971: friend class GameConfigManager; dvander@592: public: skamonkey@3961: CGameConfig(const char *file, const char *engine = NULL); dvander@592: ~CGameConfig(); dvander@592: public: dvander@592: bool Reparse(char *error, size_t maxlength); dvander@2524: bool EnterFile(const char *file, char *error, size_t maxlength); skamonkey@3961: void SetBaseEngine(const char *engine); skamonkey@3961: void SetParseEngine(const char *engine); dvander@592: public: //ITextListener_SMC dvander@1656: SMCResult ReadSMC_NewSection(const SMCStates *states, const char *name); dvander@1656: SMCResult ReadSMC_KeyValue(const SMCStates *states, const char *key, const char *value); dvander@1656: SMCResult ReadSMC_LeavingSection(const SMCStates *states); dvander@592: public: //IGameConfig dvander@592: const char *GetKeyValue(const char *key); dvander@592: bool GetOffset(const char *key, int *value); dvander@592: SendProp *GetSendProp(const char *key); dvander@947: bool GetMemSig(const char *key, void **addr); downtown1@2901: bool GetAddress(const char *key, void **addr); dvander@592: public: dvander@592: void IncRefCount(); dvander@592: unsigned int DecRefCount(); dvander@592: private: dvander@592: BaseStringTable *m_pStrings; dvander@2524: char m_File[PLATFORM_MAX_PATH]; dvander@2524: char m_CurFile[PLATFORM_MAX_PATH]; dvander@3010: KTrie m_Offsets; dvander@3010: KTrie m_Props; dvander@3010: KTrie m_Keys; dvander@3010: KTrie m_Sigs; dvander@592: unsigned int m_RefCount; dvander@592: /* Parse states */ dvander@592: int m_ParseState; dvander@592: unsigned int m_IgnoreLevel; ds@1064: char m_Class[64]; ds@1064: char m_Prop[64]; dvander@592: char m_offset[64]; ds@1064: char m_Game[256]; dvander@947: bool bShouldBeReadingDefault; dvander@2524: bool had_game; dvander@2524: bool matched_game; dvander@2524: bool had_engine; dvander@2524: bool matched_engine; pred@2217: pred@2217: /* Custom Sections */ pred@2217: unsigned int m_CustomLevel; pred@2217: ITextListener_SMC *m_CustomHandler; downtown1@2901: downtown1@2901: /* Support for reading Addresses */ downtown1@2901: struct AddressConf downtown1@2901: { downtown1@2901: char signatureName[64]; downtown1@2901: int readCount; downtown1@2901: int read[8]; downtown1@2901: downtown1@2901: AddressConf(char *sigName, unsigned sigLength, unsigned readCount, int *read); downtown1@2901: downtown1@2901: AddressConf() {} downtown1@2901: }; downtown1@2901: downtown1@2901: char m_Address[64]; downtown1@2901: char m_AddressSignature[64]; downtown1@2901: int m_AddressReadCount; downtown1@2901: int m_AddressRead[8]; downtown1@2901: KTrie *m_pAddresses; skamonkey@3961: const char *m_pEngine; skamonkey@3961: const char *m_pBaseEngine; dvander@592: }; dvander@592: dvander@616: class GameConfigManager : dvander@592: public IGameConfigManager, dvander@592: public SMGlobalClass dvander@592: { dvander@592: public: dvander@616: GameConfigManager(); dvander@616: ~GameConfigManager(); dvander@592: public: //IGameConfigManager dvander@592: bool LoadGameConfigFile(const char *file, IGameConfig **pConfig, char *error, size_t maxlength); dvander@592: void CloseGameConfigFile(IGameConfig *cfg); dvander@949: IGameConfig *ReadHandle(Handle_t hndl, dvander@949: IdentityToken_t *ident, dvander@949: HandleError *err); pred@2217: void AddUserConfigHook(const char *sectionname, ITextListener_SMC *listener); pred@2217: void RemoveUserConfigHook(const char *sectionname, ITextListener_SMC *listener); dvander@2562: void AcquireLock(); dvander@2562: void ReleaseLock(); dvander@592: public: //SMGlobalClass dvander@592: void OnSourceModStartup(bool late); dvander@592: void OnSourceModAllInitialized(); dvander@592: void OnSourceModAllShutdown(); dvander@592: private: dvander@592: List m_cfgs; dvander@3010: KTrie m_Lookup; pred@2217: public: pred@2217: KTrie m_customHandlers; dvander@592: }; dvander@592: dvander@616: extern GameConfigManager g_GameConfigs; dvander@592: extern IGameConfig *g_pGameConf; dvander@592: dvander@592: #endif //_INCLUDE_SOURCEMOD_CGAMECONFIGS_H_