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_