Add handling of env variables
parent
ad02b55541
commit
d4b2f23c4a
|
@ -220,6 +220,30 @@ CSoundInterface* CApplication::GetSound()
|
||||||
return m_sound.get();
|
return m_sound.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CApplication::LoadEnvironmentVariables()
|
||||||
|
{
|
||||||
|
auto dataDir = m_systemUtils->GetEnvVar("COLOBOT_DATA_DIR");
|
||||||
|
if (!dataDir.empty())
|
||||||
|
{
|
||||||
|
m_pathManager->SetDataPath(dataDir);
|
||||||
|
GetLogger()->Info("Using data dir (based on environment variable): '%s'\n", dataDir.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
auto langDir = m_systemUtils->GetEnvVar("COLOBOT_LANG_DIR");
|
||||||
|
if (!langDir.empty())
|
||||||
|
{
|
||||||
|
m_pathManager->SetLangPath(langDir);
|
||||||
|
GetLogger()->Info("Using lang dir (based on environment variable): '%s'\n", langDir.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
auto saveDir = m_systemUtils->GetEnvVar("COLOBOT_SAVE_DIR");
|
||||||
|
if (!saveDir.empty())
|
||||||
|
{
|
||||||
|
m_pathManager->SetSavePath(saveDir);
|
||||||
|
GetLogger()->Info("Using save dir (based on environment variable): '%s'\n", saveDir.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
|
ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
enum OptionType
|
enum OptionType
|
||||||
|
@ -286,15 +310,18 @@ ParseArgsStatus CApplication::ParseArguments(int argc, char *argv[])
|
||||||
GetLogger()->Message("\n");
|
GetLogger()->Message("\n");
|
||||||
GetLogger()->Message("%s\n", COLOBOT_FULLNAME);
|
GetLogger()->Message("%s\n", COLOBOT_FULLNAME);
|
||||||
GetLogger()->Message("\n");
|
GetLogger()->Message("\n");
|
||||||
GetLogger()->Message("List of available options:\n");
|
GetLogger()->Message("List of available options and environment variables:\n");
|
||||||
GetLogger()->Message(" -help this help\n");
|
GetLogger()->Message(" -help this help\n");
|
||||||
GetLogger()->Message(" -debug modes enable debug modes (more info printed in logs; see code for reference of modes)\n");
|
GetLogger()->Message(" -debug modes enable debug modes (more info printed in logs; see code for reference of modes)\n");
|
||||||
GetLogger()->Message(" -runscene sceneNNN run given scene on start\n");
|
GetLogger()->Message(" -runscene sceneNNN run given scene on start\n");
|
||||||
GetLogger()->Message(" -scenetest win every mission right after it's loaded\n");
|
GetLogger()->Message(" -scenetest win every mission right after it's loaded\n");
|
||||||
GetLogger()->Message(" -loglevel level set log level to level (one of: trace, debug, info, warn, error, none)\n");
|
GetLogger()->Message(" -loglevel level set log level to level (one of: trace, debug, info, warn, error, none)\n");
|
||||||
GetLogger()->Message(" -langdir path set custom language directory path\n");
|
GetLogger()->Message(" -langdir path set custom language directory path\n");
|
||||||
|
GetLogger()->Message(" environment variable: COLOBOT_LANG_DIR\n");
|
||||||
GetLogger()->Message(" -datadir path set custom data directory path\n");
|
GetLogger()->Message(" -datadir path set custom data directory path\n");
|
||||||
|
GetLogger()->Message(" environment variable: COLOBOT_DATA_DIR\n");
|
||||||
GetLogger()->Message(" -savedir path set custom save directory path (must be writable)\n");
|
GetLogger()->Message(" -savedir path set custom save directory path (must be writable)\n");
|
||||||
|
GetLogger()->Message(" environment variable: COLOBOT_SAVE_DIR\n");
|
||||||
GetLogger()->Message(" -mod path load datadir mod from given path\n");
|
GetLogger()->Message(" -mod path load datadir mod from given path\n");
|
||||||
GetLogger()->Message(" -resolution WxH set resolution\n");
|
GetLogger()->Message(" -resolution WxH set resolution\n");
|
||||||
GetLogger()->Message(" -headless headless mode - disables graphics, sound and user interaction\n");
|
GetLogger()->Message(" -headless headless mode - disables graphics, sound and user interaction\n");
|
||||||
|
|
|
@ -164,7 +164,9 @@ public:
|
||||||
CSoundInterface* GetSound();
|
CSoundInterface* GetSound();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
//! Parses commandline arguments
|
//! Loads some data from environment variables
|
||||||
|
void LoadEnvironmentVariables();
|
||||||
|
//! Parses commandline arguments (they take priority)
|
||||||
ParseArgsStatus ParseArguments(int argc, char *argv[]);
|
ParseArgsStatus ParseArguments(int argc, char *argv[]);
|
||||||
//! Initializes the application
|
//! Initializes the application
|
||||||
bool Create();
|
bool Create();
|
||||||
|
|
|
@ -172,6 +172,8 @@ int main(int argc, char *argv[])
|
||||||
int code = 0;
|
int code = 0;
|
||||||
CApplication app(systemUtils.get()); // single instance of the application
|
CApplication app(systemUtils.get()); // single instance of the application
|
||||||
|
|
||||||
|
app.LoadEnvironmentVariables();
|
||||||
|
|
||||||
ParseArgsStatus status = app.ParseArguments(argc, argv);
|
ParseArgsStatus status = app.ParseArguments(argc, argv);
|
||||||
if (status == PARSE_ARGS_FAIL)
|
if (status == PARSE_ARGS_FAIL)
|
||||||
{
|
{
|
||||||
|
|
|
@ -41,7 +41,7 @@ CPathManager::CPathManager(CSystemUtils* systemUtils)
|
||||||
: m_dataPath(systemUtils->GetDataPath())
|
: m_dataPath(systemUtils->GetDataPath())
|
||||||
, m_langPath(systemUtils->GetLangPath())
|
, m_langPath(systemUtils->GetLangPath())
|
||||||
, m_savePath(systemUtils->GetSaveDir())
|
, m_savePath(systemUtils->GetSaveDir())
|
||||||
, m_modAutoloadDir{ m_dataPath + "/mods", m_savePath + "/mods" }
|
, m_modAutoloadDir{}
|
||||||
, m_mods{}
|
, m_mods{}
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -130,6 +130,10 @@ void CPathManager::InitPaths()
|
||||||
{
|
{
|
||||||
GetLogger()->Info("Data path: %s\n", m_dataPath.c_str());
|
GetLogger()->Info("Data path: %s\n", m_dataPath.c_str());
|
||||||
GetLogger()->Info("Save path: %s\n", m_savePath.c_str());
|
GetLogger()->Info("Save path: %s\n", m_savePath.c_str());
|
||||||
|
|
||||||
|
m_modAutoloadDir.push_back(m_dataPath + "/mods");
|
||||||
|
m_modAutoloadDir.push_back(m_savePath + "/mods");
|
||||||
|
|
||||||
if (!m_modAutoloadDir.empty())
|
if (!m_modAutoloadDir.empty())
|
||||||
{
|
{
|
||||||
GetLogger()->Info("Mod autoload dirs:\n");
|
GetLogger()->Info("Mod autoload dirs:\n");
|
||||||
|
|
|
@ -210,3 +210,8 @@ std::string CSystemUtils::GetSaveDir()
|
||||||
{
|
{
|
||||||
return "./saves";
|
return "./saves";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string CSystemUtils::GetEnvVar(const std::string& str)
|
||||||
|
{
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
|
|
|
@ -139,6 +139,9 @@ public:
|
||||||
//! Returns the save dir location
|
//! Returns the save dir location
|
||||||
virtual std::string GetSaveDir();
|
virtual std::string GetSaveDir();
|
||||||
|
|
||||||
|
//! Returns environment variable
|
||||||
|
virtual std::string GetEnvVar(const std::string &str);
|
||||||
|
|
||||||
//! Sleep for given amount of microseconds
|
//! Sleep for given amount of microseconds
|
||||||
virtual void Usleep(int usecs) = 0;
|
virtual void Usleep(int usecs) = 0;
|
||||||
|
|
||||||
|
|
|
@ -126,6 +126,18 @@ std::string CSystemUtilsLinux::GetSaveDir()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string CSystemUtilsLinux::GetEnvVar(const std::string& name)
|
||||||
|
{
|
||||||
|
char* envVar = getenv(name.c_str());
|
||||||
|
if (envVar != nullptr)
|
||||||
|
{
|
||||||
|
|
||||||
|
GetLogger()->Trace("Detected environment variable %s = %s\n", name.c_str(), envVar);
|
||||||
|
return std::string(envVar);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
void CSystemUtilsLinux::Usleep(int usec)
|
void CSystemUtilsLinux::Usleep(int usec)
|
||||||
{
|
{
|
||||||
usleep(usec);
|
usleep(usec);
|
||||||
|
|
|
@ -45,6 +45,8 @@ public:
|
||||||
|
|
||||||
std::string GetSaveDir() override;
|
std::string GetSaveDir() override;
|
||||||
|
|
||||||
|
std::string GetEnvVar(const std::string& name) override;
|
||||||
|
|
||||||
void Usleep(int usec) override;
|
void Usleep(int usec) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -113,6 +113,12 @@ std::string CSystemUtilsMacOSX::GetSaveDir()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string CSystemUtilsMacOSX::GetEnvVar(const std::string& str)
|
||||||
|
{
|
||||||
|
// TODO: I have no Mac
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
|
|
||||||
void CSystemUtilsMacOSX::Usleep(int usec)
|
void CSystemUtilsMacOSX::Usleep(int usec)
|
||||||
{
|
{
|
||||||
usleep(usec);
|
usleep(usec);
|
||||||
|
|
|
@ -36,6 +36,8 @@ public:
|
||||||
std::string GetLangPath() override;
|
std::string GetLangPath() override;
|
||||||
std::string GetSaveDir() override;
|
std::string GetSaveDir() override;
|
||||||
|
|
||||||
|
std::string GetEnvVar(const std::string& str) override;
|
||||||
|
|
||||||
void Usleep(int usec) override;
|
void Usleep(int usec) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -131,6 +131,22 @@ std::string CSystemUtilsWindows::GetSaveDir()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string CSystemUtilsWindows::GetEnvVar(const std::string& name)
|
||||||
|
{
|
||||||
|
std::wstring wname(name.begin(), name.end());
|
||||||
|
wchar_t* envVar = _wgetenv(wname.c_str());
|
||||||
|
if (envVar == nullptr)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::string var = UTF8_Encode(std::wstring(envVar));
|
||||||
|
GetLogger()->Trace("Detected environment variable %s = %s\n", name.c_str(), var.c_str());
|
||||||
|
return var;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CSystemUtilsWindows::Usleep(int usec)
|
void CSystemUtilsWindows::Usleep(int usec)
|
||||||
{
|
{
|
||||||
LARGE_INTEGER ft;
|
LARGE_INTEGER ft;
|
||||||
|
|
|
@ -43,6 +43,8 @@ public:
|
||||||
|
|
||||||
std::string GetSaveDir() override;
|
std::string GetSaveDir() override;
|
||||||
|
|
||||||
|
std::string GetEnvVar(const std::string& name) override;
|
||||||
|
|
||||||
void Usleep(int usec) override;
|
void Usleep(int usec) override;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
Loading…
Reference in New Issue