core/CoreConfig.cpp
author David Anderson <dvander@alliedmods.net>
Thu Apr 05 05:25:11 2007 +0000 (2007-04-05)
changeset 663 b526b82e256e
parent 661 5c0988b9bf0c
child 665 74fa35a4c27c
permissions -rw-r--r--
changed the API around a bit to be more flexible
removed some ghastly unneeded stuff from the Translator
added Logger::LogFatal, experimental
ds@661
     1
/**
ds@661
     2
 * vim: set ts=4 :
ds@661
     3
 * ===============================================================
ds@661
     4
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
ds@661
     5
 * ===============================================================
ds@661
     6
 *
ds@661
     7
 * This file is not open source and may not be copied without explicit
ds@661
     8
 * written permission of AlliedModders LLC.  This file may not be redistributed 
ds@661
     9
 * in whole or significant part.
ds@661
    10
 * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
ds@661
    11
 *
ds@661
    12
 * Version: $Id$
ds@661
    13
 */
ds@661
    14
ds@661
    15
#include "CoreConfig.h"
ds@661
    16
#include "sourcemod.h"
ds@661
    17
#include "sourcemm_api.h"
ds@661
    18
#include "sm_srvcmds.h"
ds@661
    19
#include "LibrarySys.h"
ds@661
    20
#include "TextParsers.h"
ds@661
    21
#include "Logger.h"
ds@661
    22
ds@661
    23
#ifdef PLATFORM_WINDOWS
ds@661
    24
ConVar sm_corecfgfile("sm_corecfgfile", "addons\\sourcemod\\configs\\core.cfg", 0, "SourceMod core configuration file");
dvander@663
    25
#elif defined PLATFORM_LINUX
ds@661
    26
ConVar sm_corecfgfile("sm_corecfgfile", "addons/sourcemod/configs/core.cfg", 0, "SourceMod core configuration file");
ds@661
    27
#endif
ds@661
    28
ds@661
    29
CoreConfig g_CoreConfig;
ds@661
    30
ds@661
    31
void CoreConfig::OnSourceModAllInitialized()
ds@661
    32
{
ds@661
    33
	g_RootMenu.AddRootConsoleCommand("config", "Set core configuration options", this);
ds@661
    34
}
ds@661
    35
ds@661
    36
void CoreConfig::OnSourceModShutdown()
ds@661
    37
{
ds@661
    38
	g_RootMenu.RemoveRootConsoleCommand("config", this);
ds@661
    39
}
ds@661
    40
ds@661
    41
void CoreConfig::OnRootConsoleCommand(const char *command, unsigned int argcount)
ds@661
    42
{
ds@661
    43
	if (argcount >= 4)
ds@661
    44
	{
ds@661
    45
		const char *option = engine->Cmd_Argv(2);
ds@661
    46
		const char *value = engine->Cmd_Argv(3);
ds@661
    47
dvander@663
    48
		char error[255];
ds@661
    49
dvander@663
    50
		ConfigResult err = SetConfigOption(option, value, ConfigSource_Console, error, sizeof(error));
dvander@663
    51
dvander@663
    52
		if (err == ConfigResult_Reject)
ds@661
    53
		{
dvander@663
    54
			g_Logger.LogError("Could not set config option \"%s\" to \"%s\" (error: %s)", option, value, error);
ds@661
    55
		}
ds@661
    56
ds@661
    57
		return;
ds@661
    58
	}
ds@661
    59
ds@661
    60
	g_RootMenu.ConsolePrint("[SM] Usage: sm config <option> <value>");
ds@661
    61
}
ds@661
    62
ds@661
    63
void CoreConfig::Initialize()
ds@661
    64
{
ds@661
    65
	SMCParseError err;
ds@661
    66
	char filePath[PLATFORM_MAX_PATH];
ds@661
    67
ds@661
    68
	/* Try to get command line value of core config convar */
ds@661
    69
	const char *corecfg = icvar->GetCommandLineValue("sm_corecfgfile");
ds@661
    70
ds@661
    71
	/* If sm_corecfgfile not specified on command line, use default value */
ds@661
    72
	if (!corecfg)
ds@661
    73
	{
ds@661
    74
		corecfg = sm_corecfgfile.GetDefault();
ds@661
    75
	}
ds@661
    76
ds@661
    77
	/* Format path to config file */
ds@661
    78
	g_LibSys.PathFormat(filePath, sizeof(filePath), "%s/%s", g_SourceMod.GetModPath(), corecfg);
ds@661
    79
ds@661
    80
	/* Parse config file */
ds@661
    81
	if ((err=g_TextParser.ParseFile_SMC(filePath, this, NULL, NULL))
ds@661
    82
		!= SMCParse_Okay)
ds@661
    83
	{
ds@661
    84
		/* :TODO: This won't actually log or print anything :( - So fix that somehow */
dvander@663
    85
		const char *error = g_TextParser.GetSMCErrorString(err);
dvander@663
    86
		g_Logger.LogFatal("[SM] Error encountered parsing core config file: %s", error ? error : "");
ds@661
    87
	}
ds@661
    88
}
ds@661
    89
ds@661
    90
SMCParseResult CoreConfig::ReadSMC_KeyValue(const char *key, const char *value, bool key_quotes, bool value_quotes)
ds@661
    91
{
dvander@663
    92
	char error[255];
dvander@663
    93
	ConfigResult err = SetConfigOption(key, value, ConfigSource_File, error, sizeof(error));
ds@661
    94
dvander@663
    95
	if (err == ConfigResult_Reject)
ds@661
    96
	{
dvander@663
    97
		/* This is a fatal error */
dvander@663
    98
		g_Logger.LogFatal("%s", error);
ds@661
    99
	}
ds@661
   100
ds@661
   101
	return SMCParse_Continue;
ds@661
   102
}
ds@661
   103
dvander@663
   104
ConfigResult CoreConfig::SetConfigOption(const char *option, const char *value, ConfigSource source, char *error, size_t maxlength)
ds@661
   105
{
dvander@663
   106
	ConfigResult result;
ds@661
   107
ds@661
   108
	/* Notify! */
ds@661
   109
	SMGlobalClass *pBase = SMGlobalClass::head;
ds@661
   110
	while (pBase)
ds@661
   111
	{
dvander@663
   112
		if ((result = pBase->OnSourceModConfigChanged(option, value, source, error, maxlength)) != ConfigResult_Ignore)
ds@661
   113
		{
dvander@663
   114
			return result;
ds@661
   115
		}
ds@661
   116
		pBase = pBase->m_pGlobalClassNext;
ds@661
   117
	}
ds@661
   118
dvander@663
   119
	return ConfigResult_Ignore;
ds@661
   120
}