2013-03-02 21:41:25 +03:00
|
|
|
#include "StdInc.h"
|
|
|
|
#include "VCMIDirs.h"
|
|
|
|
|
|
|
|
/*
|
|
|
|
* VCMIDirs.cpp, part of VCMI engine
|
|
|
|
*
|
|
|
|
* Authors: listed in file AUTHORS in main folder
|
|
|
|
*
|
|
|
|
* License: GNU General Public License v2.0 or later
|
|
|
|
* Full text of license available in license.txt file, in main folder
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
static VCMIDirs VCMIDirsGlobal;
|
|
|
|
|
|
|
|
VCMIDirs::VCMIDirs()
|
|
|
|
{
|
|
|
|
// initialize local directory and create folders to which VCMI needs write access
|
2013-07-08 23:55:22 +03:00
|
|
|
boost::filesystem::create_directory(userDataPath());
|
|
|
|
boost::filesystem::create_directory(userCachePath());
|
|
|
|
boost::filesystem::create_directory(userConfigPath());
|
|
|
|
boost::filesystem::create_directory(userSavePath());
|
2013-03-02 21:41:25 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
VCMIDirs & VCMIDirs::get()
|
|
|
|
{
|
|
|
|
return VCMIDirsGlobal;
|
|
|
|
}
|
|
|
|
|
2014-03-04 17:51:10 +03:00
|
|
|
//FIXME: find way to at least decrease size of this ifdef (along with cleanup in CMake)
|
|
|
|
#if defined(_WIN32)
|
|
|
|
|
2013-07-08 23:55:22 +03:00
|
|
|
std::string VCMIDirs::userCachePath() const
|
|
|
|
{
|
|
|
|
return userDataPath();
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string VCMIDirs::userConfigPath() const
|
|
|
|
{
|
|
|
|
return userDataPath() + "/config";
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string VCMIDirs::userSavePath() const
|
|
|
|
{
|
|
|
|
return userDataPath() + "/Games";
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string VCMIDirs::userDataPath() const
|
2013-03-02 21:41:25 +03:00
|
|
|
{
|
2014-02-27 23:44:20 +03:00
|
|
|
const std::string homeDir = std::getenv("userprofile");
|
|
|
|
return homeDir + "\\vcmi";
|
|
|
|
//return dataPaths()[0];
|
2013-03-02 21:41:25 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
std::string VCMIDirs::libraryPath() const
|
|
|
|
{
|
2014-02-27 23:44:20 +03:00
|
|
|
return ".";
|
2013-03-02 21:41:25 +03:00
|
|
|
}
|
|
|
|
|
2013-08-24 23:11:51 +03:00
|
|
|
std::string VCMIDirs::clientPath() const
|
|
|
|
{
|
2014-02-27 23:44:20 +03:00
|
|
|
return libraryPath() + "\\" + "VCMI_client.exe";
|
2013-08-24 23:11:51 +03:00
|
|
|
}
|
|
|
|
|
2013-03-02 21:41:25 +03:00
|
|
|
std::string VCMIDirs::serverPath() const
|
|
|
|
{
|
2014-02-27 23:44:20 +03:00
|
|
|
return libraryPath() + "\\" + "VCMI_server.exe";
|
2013-03-02 21:41:25 +03:00
|
|
|
}
|
|
|
|
|
2013-07-08 23:55:22 +03:00
|
|
|
std::vector<std::string> VCMIDirs::dataPaths() const
|
2013-03-02 21:41:25 +03:00
|
|
|
{
|
2013-07-08 23:55:22 +03:00
|
|
|
return std::vector<std::string>(1, ".");
|
2013-03-02 21:41:25 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
std::string VCMIDirs::libraryName(std::string basename) const
|
|
|
|
{
|
|
|
|
return basename + ".dll";
|
|
|
|
}
|
|
|
|
|
|
|
|
#elif defined(__APPLE__)
|
|
|
|
|
2014-03-04 17:51:10 +03:00
|
|
|
std::string VCMIDirs::userCachePath() const
|
|
|
|
{
|
|
|
|
return userDataPath();
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string VCMIDirs::userConfigPath() const
|
|
|
|
{
|
|
|
|
return userDataPath() + "/config";
|
|
|
|
}
|
|
|
|
|
|
|
|
std::string VCMIDirs::userSavePath() const
|
|
|
|
{
|
|
|
|
return userDataPath() + "/Games";
|
|
|
|
}
|
|
|
|
|
2013-07-08 23:55:22 +03:00
|
|
|
std::string VCMIDirs::userDataPath() const
|
2013-03-02 21:41:25 +03:00
|
|
|
{
|
|
|
|
// This is Cocoa code that should be normally used to get path to Application Support folder but can't use it here for now...
|
|
|
|
// NSArray* urls = [[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory inDomains:NSUserDomainMask];
|
|
|
|
// UserPath = path([urls[0] path] + "/vcmi").string();
|
|
|
|
|
|
|
|
// ...so here goes a bit of hardcode instead
|
|
|
|
std::string home_dir = ".";
|
2013-06-26 14:18:27 +03:00
|
|
|
if (getenv("HOME") != nullptr )
|
2013-03-02 21:41:25 +03:00
|
|
|
home_dir = getenv("HOME");
|
|
|
|
|
2013-03-07 01:03:57 +03:00
|
|
|
return boost::filesystem::path(home_dir + "/Library/Application Support/vcmi").string();
|
2013-03-02 21:41:25 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
std::string VCMIDirs::libraryPath() const
|
|
|
|
{
|
|
|
|
return ".";
|
|
|
|
}
|
|
|
|
|
2013-08-24 23:11:51 +03:00
|
|
|
std::string VCMIDirs::clientPath() const
|
|
|
|
{
|
2013-10-07 06:19:11 +03:00
|
|
|
return "./vcmiclient";
|
2013-08-24 23:11:51 +03:00
|
|
|
}
|
|
|
|
|
2013-03-02 21:41:25 +03:00
|
|
|
std::string VCMIDirs::serverPath() const
|
|
|
|
{
|
2013-10-07 06:19:11 +03:00
|
|
|
return "./vcmiserver";
|
2013-03-02 21:41:25 +03:00
|
|
|
}
|
|
|
|
|
2013-07-08 23:55:22 +03:00
|
|
|
std::vector<std::string> VCMIDirs::dataPaths() const
|
2013-03-02 21:41:25 +03:00
|
|
|
{
|
2013-07-08 23:55:22 +03:00
|
|
|
return std::vector<std::string>(1, "../Data");
|
2013-03-02 21:41:25 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
std::string VCMIDirs::libraryName(std::string basename) const
|
|
|
|
{
|
|
|
|
return "lib" + basename + ".dylib";
|
|
|
|
}
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
2014-03-04 17:51:10 +03:00
|
|
|
std::string VCMIDirs::libraryName(std::string basename) const
|
2013-03-02 21:41:25 +03:00
|
|
|
{
|
2014-03-04 17:51:10 +03:00
|
|
|
return "lib" + basename + ".so";
|
2013-03-02 21:41:25 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
std::string VCMIDirs::libraryPath() const
|
|
|
|
{
|
|
|
|
return M_LIB_DIR;
|
|
|
|
}
|
|
|
|
|
2013-08-24 23:11:51 +03:00
|
|
|
std::string VCMIDirs::clientPath() const
|
|
|
|
{
|
|
|
|
return std::string(M_BIN_DIR) + "/" + "vcmiclient";
|
|
|
|
}
|
|
|
|
|
2013-03-02 21:41:25 +03:00
|
|
|
std::string VCMIDirs::serverPath() const
|
|
|
|
{
|
|
|
|
return std::string(M_BIN_DIR) + "/" + "vcmiserver";
|
|
|
|
}
|
|
|
|
|
2014-03-04 17:51:10 +03:00
|
|
|
// $XDG_DATA_HOME, default: $HOME/.local/share
|
|
|
|
std::string VCMIDirs::userDataPath() const
|
2013-03-02 21:41:25 +03:00
|
|
|
{
|
2014-02-20 21:53:18 +03:00
|
|
|
#ifdef __ANDROID__
|
|
|
|
// on Android HOME will be set to something like /sdcard/data/Android/is.xyz.vcmi/files/
|
|
|
|
return std::string(getenv("HOME"));
|
|
|
|
#else
|
2014-03-04 17:51:10 +03:00
|
|
|
if (getenv("XDG_DATA_HOME") != nullptr )
|
|
|
|
return std::string(getenv("XDG_DATA_HOME")) + "/vcmi";
|
|
|
|
if (getenv("HOME") != nullptr )
|
|
|
|
return std::string(getenv("HOME")) + "/.local/share" + "/vcmi";
|
|
|
|
return ".";
|
2014-02-20 21:53:18 +03:00
|
|
|
#endif
|
2013-03-02 21:41:25 +03:00
|
|
|
}
|
|
|
|
|
2014-03-04 17:51:10 +03:00
|
|
|
std::string VCMIDirs::userSavePath() const
|
2013-03-02 21:41:25 +03:00
|
|
|
{
|
2014-03-04 17:51:10 +03:00
|
|
|
return userDataPath() + "/Saves";
|
|
|
|
}
|
|
|
|
|
|
|
|
// $XDG_CACHE_HOME, default: $HOME/.cache
|
|
|
|
std::string VCMIDirs::userCachePath() const
|
|
|
|
{
|
2014-02-20 21:53:18 +03:00
|
|
|
#ifdef __ANDROID__
|
|
|
|
return userDataPath() + "/cache";
|
|
|
|
#else
|
2014-03-04 17:51:10 +03:00
|
|
|
if (getenv("XDG_CACHE_HOME") != nullptr )
|
|
|
|
return std::string(getenv("XDG_CACHE_HOME")) + "/vcmi";
|
|
|
|
if (getenv("HOME") != nullptr )
|
|
|
|
return std::string(getenv("HOME")) + "/.cache" + "/vcmi";
|
|
|
|
return ".";
|
2014-02-20 21:53:18 +03:00
|
|
|
#endif
|
2014-03-04 17:51:10 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// $XDG_CONFIG_HOME, default: $HOME/.config
|
|
|
|
std::string VCMIDirs::userConfigPath() const
|
|
|
|
{
|
2014-02-20 21:53:18 +03:00
|
|
|
#ifdef __ANDROID__
|
|
|
|
return userDataPath() + "/config";
|
|
|
|
#else
|
2014-03-04 17:51:10 +03:00
|
|
|
if (getenv("XDG_CONFIG_HOME") != nullptr )
|
|
|
|
return std::string(getenv("XDG_CONFIG_HOME")) + "/vcmi";
|
|
|
|
if (getenv("HOME") != nullptr )
|
|
|
|
return std::string(getenv("HOME")) + "/.config" + "/vcmi";
|
|
|
|
return ".";
|
2014-02-20 21:53:18 +03:00
|
|
|
#endif
|
2014-03-04 17:51:10 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// $XDG_DATA_DIRS, default: /usr/local/share/:/usr/share/
|
|
|
|
std::vector<std::string> VCMIDirs::dataPaths() const
|
|
|
|
{
|
|
|
|
// construct list in reverse.
|
|
|
|
// in specification first directory has highest priority
|
|
|
|
// in vcmi fs last directory has highest priority
|
|
|
|
|
|
|
|
std::vector<std::string> ret;
|
2014-02-20 21:53:18 +03:00
|
|
|
#ifdef __ANDROID__
|
|
|
|
ret.push_back(userDataPath());
|
|
|
|
#else
|
2014-03-04 17:51:10 +03:00
|
|
|
if (getenv("HOME") != nullptr ) // compatibility, should be removed after 0.96
|
|
|
|
ret.push_back(std::string(getenv("HOME")) + "/.vcmi");
|
|
|
|
ret.push_back(M_DATA_DIR);
|
|
|
|
|
|
|
|
if (getenv("XDG_DATA_DIRS") != nullptr)
|
|
|
|
{
|
|
|
|
std::string dataDirsEnv = getenv("XDG_DATA_DIRS");
|
|
|
|
std::vector<std::string> dataDirs;
|
|
|
|
boost::split(dataDirs, dataDirsEnv, boost::is_any_of(":"));
|
|
|
|
for (auto & entry : boost::adaptors::reverse(dataDirs))
|
|
|
|
ret.push_back(entry + "/vcmi");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
ret.push_back("/usr/share/");
|
|
|
|
ret.push_back("/usr/local/share/");
|
|
|
|
}
|
2014-02-20 21:53:18 +03:00
|
|
|
#endif
|
2014-03-04 17:51:10 +03:00
|
|
|
return ret;
|
2013-03-02 21:41:25 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
2014-03-20 21:17:40 +03:00
|
|
|
|
|
|
|
std::string VCMIDirs::genHelpString() const
|
|
|
|
{
|
|
|
|
return
|
|
|
|
" game data: " + boost::algorithm::join(dataPaths(), ":") + "\n" +
|
|
|
|
" libraries: " + libraryPath() + "\n" +
|
|
|
|
" server: " + serverPath() + "\n" +
|
|
|
|
"\n" +
|
|
|
|
" user data: " + userDataPath() + "\n" +
|
|
|
|
" user cache: " + userCachePath() + "\n" +
|
|
|
|
" user config: " + userConfigPath() + "\n" +
|
|
|
|
" user saves: " + userSavePath() + "\n";
|
|
|
|
}
|