diff --git a/components/files/configurationmanager.cpp b/components/files/configurationmanager.cpp index 28d49a50c2..46cd0e053b 100644 --- a/components/files/configurationmanager.cpp +++ b/components/files/configurationmanager.cpp @@ -89,27 +89,37 @@ void ConfigurationManager::processPaths(Files::PathContainer& dataDirs) const std::string& path = it->string(); // Check if path contains a token - if (!path.empty() && *path.begin() == '?' && *path.rbegin() == '?') + if (!path.empty() && *path.begin() == '?') { - TokensMappingContainer::iterator tokenIt = mTokensMapping.find(path); - if (tokenIt != mTokensMapping.end()) + std::string::size_type pos = path.find('?', 1); + if (pos != std::string::npos && pos != 0) { - boost::filesystem::path tempPath(((mFixedPath).*(tokenIt->second))()); - - if (boost::filesystem::is_directory(tempPath)) + TokensMappingContainer::iterator tokenIt = mTokensMapping.find(path.substr(0, pos + 1)); + if (tokenIt != mTokensMapping.end()) { - (*it) = tempPath; + boost::filesystem::path tempPath(((mFixedPath).*(tokenIt->second))()); + if (pos < path.length() - 1) + { + // There is something after the token, so we should + // append it to the path + tempPath /= path.substr(pos + 1, path.length() - pos); + } + + if (boost::filesystem::is_directory(tempPath)) + { + (*it) = tempPath; + } + else + { + (*it).clear(); + } } else { + // Clean invalid / unknown token, it will be removed outside the loop (*it).clear(); } } - else - { - // Clean invalid / unknown token, it will be removed outside the loop - (*it).clear(); - } } } diff --git a/components/files/fixedpath.hpp b/components/files/fixedpath.hpp index 1bf582ab9c..0e052fd248 100644 --- a/components/files/fixedpath.hpp +++ b/components/files/fixedpath.hpp @@ -86,6 +86,7 @@ struct FixedPath mGlobalPath /= suffix; mLocalDataPath /= suffix; + mUserDataPath /= suffix; mGlobalDataPath /= suffix; } }