std::string getHomePath() { std::string homePath; // this should give you something like "/home/YOUR_USERNAME" on Linux and "C:\Users\YOUR_USERNAME\" on Windows const char * envHome = getenv("HOME"); if(envHome != nullptr) { homePath = envHome; } #ifdef WIN32 // but does not seem to work for Windows XP or Vista, so try something else if (homePath.empty()) { const char * envDir = getenv("HOMEDRIVE"); const char * envPath = getenv("HOMEPATH"); if (envDir != nullptr && envPath != nullptr) { homePath = envDir; homePath += envPath; for(unsigned int i = 0; i < homePath.length(); i++) if(homePath[i] == '\\') homePath[i] = '/'; } } #endif // convert path to generic directory seperators boost::filesystem::path genericPath(homePath); return genericPath.generic_string(); }
std::string NativePathToGeneric(const std::string& nativePath) { if (GENERIC_PATH_SEPARATOR == NATIVE_PATH_SEPARATOR) { return nativePath; } std::string genericPath(nativePath); std::replace(genericPath.begin(), genericPath.end(), NATIVE_PATH_SEPARATOR, GENERIC_PATH_SEPARATOR); return genericPath; }
//creates systems from information located in a config file bool SystemData::loadConfig() { deleteSystems(); std::string path = getConfigPath(false); LOG(LogInfo) << "Loading system config file " << path << "..."; if(!fs::exists(path)) { LOG(LogError) << "es_systems.cfg file does not exist!"; writeExampleConfig(getConfigPath(true)); return false; } pugi::xml_document doc; pugi::xml_parse_result res = doc.load_file(path.c_str()); if(!res) { LOG(LogError) << "Could not parse es_systems.cfg file!"; LOG(LogError) << res.description(); return false; } //actually read the file pugi::xml_node systemList = doc.child("systemList"); if(!systemList) { LOG(LogError) << "es_systems.cfg is missing the <systemList> tag!"; return false; } for(pugi::xml_node system = systemList.child("system"); system; system = system.next_sibling("system")) { std::string name, fullname, path, cmd, themeFolder; PlatformIds::PlatformId platformId = PlatformIds::PLATFORM_UNKNOWN; name = system.child("name").text().get(); fullname = system.child("fullname").text().get(); path = system.child("path").text().get(); // convert extensions list from a string into a vector of strings std::vector<std::string> extensions = readList(system.child("extension").text().get()); cmd = system.child("command").text().get(); // platform id list const char* platformList = system.child("platform").text().get(); std::vector<std::string> platformStrs = readList(platformList); std::vector<PlatformIds::PlatformId> platformIds; for(auto it = platformStrs.begin(); it != platformStrs.end(); it++) { const char* str = it->c_str(); PlatformIds::PlatformId platformId = PlatformIds::getPlatformId(str); if(platformId == PlatformIds::PLATFORM_IGNORE) { // when platform is ignore, do not allow other platforms platformIds.clear(); platformIds.push_back(platformId); break; } // if there appears to be an actual platform ID supplied but it didn't match the list, warn if(str != NULL && str[0] != '\0' && platformId == PlatformIds::PLATFORM_UNKNOWN) LOG(LogWarning) << " Unknown platform for system \"" << name << "\" (platform \"" << str << "\" from list \"" << platformList << "\")"; else if(platformId != PlatformIds::PLATFORM_UNKNOWN) platformIds.push_back(platformId); } // theme folder themeFolder = system.child("theme").text().as_string(name.c_str()); //validate if(name.empty() || path.empty() || extensions.empty() || cmd.empty()) { LOG(LogError) << "System \"" << name << "\" is missing name, path, extension, or command!"; continue; } //convert path to generic directory seperators boost::filesystem::path genericPath(path); path = genericPath.generic_string(); SystemData* newSys = new SystemData(name, fullname, path, extensions, cmd, platformIds, themeFolder); if(newSys->getRootFolder()->getChildren().size() == 0) { LOG(LogWarning) << "System \"" << name << "\" has no games! Ignoring it."; delete newSys; }else{ sSystemVector.push_back(newSys); } } return true; }