#include "CExecutor.h" #include "CEngine.h" #include "CLogger.h" #include "U_String.h" #include "CCommandProcessor.h" #include "CStartupArgsManager.h" #include "CConVarManager.h" #include "U_Files.h" #include #include #include bool CExecutor::V_Init() { bool NoAutoExec = false; COMPONENT_CALL_GET(NoAutoExec, CStartupArgsManager, IsArgumentSet("-noautoexec")); ExecuteFile((FileUtils::get_executable_path() / "resources" / "cfg" / "e_aliases.cfg").string()); //as in "early_config" ExecuteFile((FileUtils::get_executable_path() / "resources" / "cfg" / "e_config.cfg").string()); //as in "early_config" if(!NoAutoExec) { ExecuteFile((FileUtils::get_executable_path() / "resources" / "cfg" / "init.cfg").string()); //ExecuteFile(".\\resources\\cfg\\init.cfg"); //TODO not the right way (hardcoded) } return true; } void CExecutor::V_PostInit() { bool NoAutoExec = false; COMPONENT_CALL_GET(NoAutoExec, CStartupArgsManager, IsArgumentSet("-noautoexec")); ExecuteFile((FileUtils::get_executable_path() / "resources" / "cfg" / "aliases.cfg").string()); ExecuteFile((FileUtils::get_executable_path() / "resources" / "cfg" / "config.cfg").string()); if(!NoAutoExec) { ExecuteFile((FileUtils::get_executable_path() / "resources" / "cfg" / "postinit.cfg").string()); //ExecuteFile(".\\resources\\cfg\\postinit.cfg"); //TODO not the right way (hardcoded) } } void CExecutor::ExecuteFile(const std::string& file) { if(!FileUtils::is_within_root(FileUtils::get_executable_path() / "resources" / "cfg", file)) { Log::ErrInstance() << "Can't execute config \"" << file << "\". Unacceptable path\n"; return; } std::wifstream filestream; filestream.open(file); if(!filestream.is_open()) { COMPONENT_CALL(CLogger, Err(L"Can't open file \"" + StringUtils::StrToWstr(file) + L"\"\n")); return; } std::wstringstream wss; wss << std::noskipws << filestream.rdbuf(); std::wstring m_cfg = wss.str(); filestream.close(); StringUtils::replace(m_cfg, L"\r\n", L"\n"); if (StringUtils::IsEmpty(m_cfg)) { return; } std::vector cmds; StringUtils::split_str(m_cfg, L'\n', cmds); if (cmds.empty()) { return; } for (std::wstring& cmd : cmds) { COMPONENT_CALL(CCommandProcessor, ProcessCommandLine(cmd, CCommandSender::Self)); } } void CExecutor::V_DeInit() { WriteAliases((FileUtils::get_executable_path() / "resources" / "cfg" / "aliases.cfg").string()); WriteConfig((FileUtils::get_executable_path() / "resources" / "cfg" / "config.cfg").string()); } void CExecutor::WriteConfig(const std::string& file) { auto cvarmgr = CEngine::GetInstance()->Components.GetComponentTyped(); if(!cvarmgr) { return; } std::wofstream f(file); if(!f.is_open()) { return; } std::wstringstream buf; cvarmgr->Root.Trace([&buf](const CConVarManager::CVarNode* nod) { if(nod->Value.Wrapable) { buf << L"\"" << StringUtils::StrToWstr(nod->GetPath()) << L"\" \"" << nod->Value.Wrapable->GetValueStr() << L"\"\n"; } }); f << std::noskipws << buf.str(); f.close(); } void CExecutor::WriteAliases(const std::string& file) { auto cmdproc = CEngine::GetInstance()->Components.GetComponentTyped(); if(!cmdproc) { return; } std::wofstream f(file); if(!f.is_open()) { return; } std::wstringstream buf; for(auto& kv : cmdproc->Aliases) { std::wstring cmd = StringUtils::StrToWstr(kv.first); cmd = CCommandProcessor::ProcessSpecialChars(cmd); std::wstring cmdarg = kv.second; cmdarg = CCommandProcessor::ProcessSpecialChars(cmdarg); buf << L"alias \"" << cmd << L"\" \"" << cmdarg << L"\"\n"; } f << std::noskipws << buf.str(); f.close(); } LINK_COMPONENT_TO_CLASS(CExecutor, executor);