about summary refs log tree commit diff
path: root/src/engine/shared/config.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/shared/config.cpp')
-rw-r--r--src/engine/shared/config.cpp111
1 files changed, 111 insertions, 0 deletions
diff --git a/src/engine/shared/config.cpp b/src/engine/shared/config.cpp
new file mode 100644
index 00000000..ca12e8b7
--- /dev/null
+++ b/src/engine/shared/config.cpp
@@ -0,0 +1,111 @@
+#include <engine/config.h>
+#include <engine/storage.h>
+#include <engine/shared/config.h>
+
+CConfiguration g_Config;
+
+class CConfig : public IConfig
+{
+	IStorage *m_pStorage;
+	IOHANDLE m_ConfigFile;
+	
+	struct CCallback
+	{
+		SAVECALLBACKFUNC m_pfnFunc;
+		void *m_pUserData;
+	};
+	
+	enum
+	{
+		MAX_CALLBACKS = 16
+	};
+	
+	CCallback m_aCallbacks[MAX_CALLBACKS];
+	int m_NumCallbacks;
+	
+	void EscapeParam(char *pDst, const char *pSrc, int size)
+	{
+		for(int i = 0; *pSrc && i < size - 1; ++i)
+		{
+			if(*pSrc == '"' || *pSrc == '\\') // escape \ and "
+				*pDst++ = '\\';
+			*pDst++ = *pSrc++;
+		}
+		*pDst = 0;
+	}
+
+public:
+
+	CConfig()
+	{
+		m_ConfigFile = 0;
+		m_NumCallbacks = 0;
+	}
+	
+	virtual void Init()
+	{
+		m_pStorage = Kernel()->RequestInterface<IStorage>();
+		Reset();
+	}
+	
+	virtual void Reset()
+	{
+		#define MACRO_CONFIG_INT(Name,ScriptName,def,min,max,flags,desc) g_Config.m_##Name = def;
+		#define MACRO_CONFIG_STR(Name,ScriptName,len,def,flags,desc) str_copy(g_Config.m_##Name, def, len);
+
+		#include "config_variables.h" 
+
+		#undef MACRO_CONFIG_INT 
+		#undef MACRO_CONFIG_STR 		
+	}
+	
+	virtual void Save()
+	{
+		if(!m_pStorage)
+			return;
+		m_ConfigFile = m_pStorage->OpenFile("settings.cfg", IOFLAG_WRITE);
+		
+		if(!m_ConfigFile)
+			return;
+		
+		char aLineBuf[1024*2];
+		char aEscapeBuf[1024*2];
+
+		#define MACRO_CONFIG_INT(Name,ScriptName,def,min,max,flags,desc) if((flags)&CFGFLAG_SAVE){ str_format(aLineBuf, sizeof(aLineBuf), "%s %i", #ScriptName, g_Config.m_##Name); WriteLine(aLineBuf); }
+		#define MACRO_CONFIG_STR(Name,ScriptName,len,def,flags,desc) if((flags)&CFGFLAG_SAVE){ EscapeParam(aEscapeBuf, g_Config.m_##Name, sizeof(aEscapeBuf)); str_format(aLineBuf, sizeof(aLineBuf), "%s \"%s\"", #ScriptName, aEscapeBuf); WriteLine(aLineBuf); }
+
+		#include "config_variables.h" 
+
+		#undef MACRO_CONFIG_INT 
+		#undef MACRO_CONFIG_STR 				
+		
+		for(int i = 0; i < m_NumCallbacks; i++)
+			m_aCallbacks[i].m_pfnFunc(this, m_aCallbacks[i].m_pUserData);
+		
+		io_close(m_ConfigFile);
+		m_ConfigFile = 0;
+	}
+	
+	virtual void RegisterCallback(SAVECALLBACKFUNC pfnFunc, void *pUserData)
+	{
+		dbg_assert(m_NumCallbacks < MAX_CALLBACKS, "too many config callbacks");
+		m_aCallbacks[m_NumCallbacks].m_pfnFunc = pfnFunc;
+		m_aCallbacks[m_NumCallbacks].m_pUserData = pUserData;
+		m_NumCallbacks++;
+	}
+	
+	virtual void WriteLine(const char *pLine)
+	{
+		if(!m_ConfigFile)
+			return;
+#if defined(CONF_FAMILY_WINDOWS)
+		static const char Newline[] = "\r\n";
+#else
+		static const char Newline[] = "\n";
+#endif
+		io_write(m_ConfigFile, pLine, str_length(pLine));
+		io_write(m_ConfigFile, Newline, sizeof(Newline)-1);			
+	}
+};
+
+IConfig *CreateConfig() { return new CConfig; }