core/CoreConfig.cpp
author Scott Ehlert <ds@alliedmods.net>
Wed Jun 06 20:42:46 2007 +0000 (2007-06-06)
changeset 891 30343d215489
parent 729 110c14c99545
child 978 54782a83a1ef
permissions -rw-r--r--
Changed a few natives/stocks that should have used IsClientInGame() rather than IsClientConnected()
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
ds@669
    50
		ConfigResult res = SetConfigOption(option, value, ConfigSource_Console, error, sizeof(error));
dvander@663
    51
ds@669
    52
		if (res == ConfigResult_Reject)
ds@661
    53
		{
ds@669
    54
			g_RootMenu.ConsolePrint("[SM] Could not set config option \"%s\" to \"%s\" (%s)", option, value, error);
ds@669
    55
		} else if (res == ConfigResult_Ignore) {
ds@669
    56
			g_RootMenu.ConsolePrint("[SM] No such config option \"%s\" exists.", option);
dvander@665
    57
		} else {
dvander@665
    58
			g_RootMenu.ConsolePrint("Config option \"%s\" successfully set to \"%s.\"", option, value);
ds@661
    59
		}
ds@661
    60
ds@661
    61
		return;
ds@661
    62
	}
ds@661
    63
ds@661
    64
	g_RootMenu.ConsolePrint("[SM] Usage: sm config <option> <value>");
ds@661
    65
}
ds@661
    66
ds@661
    67
void CoreConfig::Initialize()
ds@661
    68
{
ds@661
    69
	SMCParseError err;
ds@661
    70
	char filePath[PLATFORM_MAX_PATH];
ds@661
    71
ds@661
    72
	/* Try to get command line value of core config convar */
ds@661
    73
	const char *corecfg = icvar->GetCommandLineValue("sm_corecfgfile");
ds@661
    74
ds@661
    75
	/* If sm_corecfgfile not specified on command line, use default value */
ds@661
    76
	if (!corecfg)
ds@661
    77
	{
ds@661
    78
		corecfg = sm_corecfgfile.GetDefault();
ds@661
    79
	}
ds@661
    80
ds@661
    81
	/* Format path to config file */
ds@729
    82
	g_LibSys.PathFormat(filePath, sizeof(filePath), "%s/%s", g_SourceMod.GetGamePath(), corecfg);
ds@661
    83
ds@661
    84
	/* Parse config file */
ds@669
    85
	if ((err=g_TextParser.ParseFile_SMC(filePath, this, NULL, NULL)) != SMCParse_Okay)
ds@661
    86
	{
dvander@665
    87
 		/* :TODO: This won't actually log or print anything :( - So fix that somehow */
dvander@663
    88
		const char *error = g_TextParser.GetSMCErrorString(err);
dvander@663
    89
		g_Logger.LogFatal("[SM] Error encountered parsing core config file: %s", error ? error : "");
ds@661
    90
	}
ds@661
    91
}
ds@661
    92
ds@661
    93
SMCParseResult CoreConfig::ReadSMC_KeyValue(const char *key, const char *value, bool key_quotes, bool value_quotes)
ds@661
    94
{
dvander@663
    95
	char error[255];
dvander@663
    96
	ConfigResult err = SetConfigOption(key, value, ConfigSource_File, error, sizeof(error));
ds@661
    97
dvander@663
    98
	if (err == ConfigResult_Reject)
ds@661
    99
	{
dvander@663
   100
		/* This is a fatal error */
dvander@665
   101
		g_Logger.LogFatal("Config error (key: %s) (value: %s) %s", key, value, error);
ds@661
   102
	}
ds@661
   103
ds@661
   104
	return SMCParse_Continue;
ds@661
   105
}
ds@661
   106
dvander@663
   107
ConfigResult CoreConfig::SetConfigOption(const char *option, const char *value, ConfigSource source, char *error, size_t maxlength)
ds@661
   108
{
dvander@663
   109
	ConfigResult result;
ds@661
   110
ds@661
   111
	/* Notify! */
ds@661
   112
	SMGlobalClass *pBase = SMGlobalClass::head;
ds@661
   113
	while (pBase)
ds@661
   114
	{
dvander@663
   115
		if ((result = pBase->OnSourceModConfigChanged(option, value, source, error, maxlength)) != ConfigResult_Ignore)
ds@661
   116
		{
dvander@663
   117
			return result;
ds@661
   118
		}
ds@661
   119
		pBase = pBase->m_pGlobalClassNext;
ds@661
   120
	}
ds@661
   121
dvander@663
   122
	return ConfigResult_Ignore;
ds@661
   123
}