Improved some logging as well as handling of a missing es_systems.cfg file.

This commit is contained in:
Leon Styhre 2020-10-19 17:28:20 +02:00
parent c9cc8494c9
commit 0b6d0bfcd6
10 changed files with 96 additions and 79 deletions

View file

@ -163,7 +163,7 @@ void CollectionSystemManager::saveCustomCollection(SystemData* sys)
}
}
else {
LOG(LogError) << "Couldn't find collection to save! " << name;
LOG(LogError) << "Couldn't find collection to save: " << name;
}
}
@ -888,10 +888,10 @@ void CollectionSystemManager::populateCustomCollection(CollectionSystemData* sys
std::string path = getCustomCollectionConfigPath(newSys->getName());
if (!Utils::FileSystem::exists(path)) {
LOG(LogInfo) << "Couldn't find custom collection config file at " << path;
LOG(LogInfo) << "Couldn't find custom collection config file \"" << path << "\"";
return;
}
LOG(LogInfo) << "Loading custom collection config file at " << path;
LOG(LogInfo) << "Parsing custom collection file \"" << path << "\"...";
FileData* rootFolder = newSys->getRootFolder();
FileFilterIndex* index = newSys->getIndex();
@ -928,8 +928,7 @@ void CollectionSystemManager::populateCustomCollection(CollectionSystemData* sys
index->addToIndex(newGame);
}
else {
LOG(LogInfo) << "Couldn't find game referenced at '" << gameKey <<
"' for system config '" << path << "'";
LOG(LogWarning) << "File \"" << gameKey << "\" does not exist, ignoring entry";
}
}

View file

@ -27,7 +27,7 @@ FileData* findOrCreateFile(SystemData* system, const std::string& path, FileType
std::string relative = Utils::FileSystem::removeCommonPath(path, root->getPath(), contains);
if (!contains) {
LOG(LogError) << "File path \"" << path << "\" is outside system path \"" <<
LOG(LogError) << "Path \"" << path << "\" is outside system path \"" <<
system->getStartPath() << "\"";
return nullptr;
}
@ -52,7 +52,7 @@ FileData* findOrCreateFile(SystemData* system, const std::string& path, FileType
return treeNode;
if (type == FOLDER) {
LOG(LogWarning) << "Gamelist: folder doesn't exist, won't create";
LOG(LogWarning) << "Gamelist: folder doesn't exist, won't create it";
return nullptr;
}
@ -68,7 +68,7 @@ FileData* findOrCreateFile(SystemData* system, const std::string& path, FileType
// Don't create folders unless they're including any games.
// If the type is FOLDER it's going to be empty, so don't bother.
if (type == FOLDER) {
LOG(LogWarning) << "Gamelist: folder doesn't exist, won't create";
LOG(LogWarning) << "Gamelist: folder doesn't exist, won't create it";
return nullptr;
}
@ -93,7 +93,7 @@ void parseGamelist(SystemData* system)
if (!Utils::FileSystem::exists(xmlpath))
return;
LOG(LogInfo) << "Parsing XML file \"" << xmlpath << "\"...";
LOG(LogInfo) << "Parsing gamelist file \"" << xmlpath << "\"...";
pugi::xml_document doc;
#if defined(_WIN64)
@ -104,14 +104,14 @@ void parseGamelist(SystemData* system)
#endif
if (!result) {
LOG(LogError) << "Error parsing XML file \"" << xmlpath <<
"\"!\n " <<result.description();
LOG(LogError) << "Error parsing gamelist file \"" << xmlpath <<
"\": " << result.description();
return;
}
pugi::xml_node root = doc.child("gameList");
if (!root) {
LOG(LogError) << "Could not find <gameList> node in gamelist \"" << xmlpath << "\"!";
LOG(LogError) << "Could not find <gameList> node in gamelist \"" << xmlpath << "\"";
return;
}
@ -130,7 +130,8 @@ void parseGamelist(SystemData* system)
relativeTo, false);
if (!trustGamelist && !Utils::FileSystem::exists(path)) {
LOG(LogWarning) << "File \"" << path << "\" does not exist, ignoring.";
LOG(LogWarning) << (type == GAME ? "File \"" : "Folder \"") << path <<
"\" does not exist, ignoring entry";
continue;
}
@ -138,14 +139,15 @@ void parseGamelist(SystemData* system)
// it is located.
if (!showHiddenFiles && (Utils::FileSystem::isHidden(path) ||
Utils::FileSystem::isHidden(Utils::FileSystem::getParent(path)))) {
LOG(LogDebug) << "Gamelist::parseGamelist(): Skipping hidden file " << path;
LOG(LogDebug) << "Gamelist::parseGamelist(): Skipping hidden file \"" <<
path << "\"";
continue;
}
FileData* file = findOrCreateFile(system, path, type);
if (!file) {
LOG(LogError) << "Error finding/creating FileData for \"" <<
path << "\", skipping.";
path << "\", skipping entry";
continue;
}
else if (!file->isArcadeAsset()) {
@ -163,8 +165,9 @@ void parseGamelist(SystemData* system)
// but that is fine as the option to show hidden files is defined as requiring an
// application restart.
if (!Settings::getInstance()->getBool("ShowHiddenGames") && file->getHidden()) {
LOG(LogDebug) << "Gamelist::parseGamelist(): Skipping hidden entry '" <<
file->getName() << "'" << " (" << file->getPath() << ").";
LOG(LogDebug) << "Gamelist::parseGamelist(): Skipping hidden " <<
(type == GAME ? "file" : "folder") << " entry \"" <<
file->getName() << "\"" << " (\"" << file->getPath() << "\")";
delete file;
}
}
@ -223,7 +226,7 @@ void updateGamelist(SystemData* system)
#endif
if (!result) {
LOG(LogError) << "Error parsing XML file \"" << xmlReadPath << "\"!\n " <<
LOG(LogError) << "Error parsing gamelist file \"" << xmlReadPath << "\": " <<
result.description();
return;
}
@ -231,7 +234,7 @@ void updateGamelist(SystemData* system)
root = doc.child("gameList");
if (!root) {
LOG(LogError) << "Could not find <gameList> node in gamelist \"" <<
xmlReadPath << "\"!";
xmlReadPath << "\"";
return;
}
}
@ -263,7 +266,7 @@ void updateGamelist(SystemData* system)
fileNode = fileNode.next_sibling(tag)) {
pugi::xml_node pathNode = fileNode.child("path");
if (!pathNode) {
LOG(LogError) << "<" << tag << "> node contains no <path> child!";
LOG(LogError) << "<" << tag << "> node contains no <path> child";
continue;
}
@ -296,7 +299,7 @@ void updateGamelist(SystemData* system)
Utils::FileSystem::createDirectory(Utils::FileSystem::getParent(xmlWritePath));
LOG(LogDebug) << "Gamelist::updateGamelist(): Added/updated " << numUpdated <<
(numUpdated == 1 ? " entity in '" : " entities in '") << xmlReadPath << "'";
(numUpdated == 1 ? " entity in '" : " entities in \"") << xmlReadPath << "\"";
#if defined(_WIN64)
if (!doc.save_file(Utils::String::stringToWideString(xmlWritePath).c_str())) {
@ -304,11 +307,11 @@ void updateGamelist(SystemData* system)
if (!doc.save_file(xmlWritePath.c_str())) {
#endif
LOG(LogError) << "Error saving gamelist.xml to \"" <<
xmlWritePath << "\" (for system " << system->getName() << ")!";
xmlWritePath << "\" (for system " << system->getName() << ")";
}
}
}
else {
LOG(LogError) << "Found no root folder for system \"" << system->getName() << "\"!";
LOG(LogError) << "Found no root folder for system \"" << system->getName() << "\"";
}
}

View file

@ -104,12 +104,12 @@ bool SystemData::populateFolder(FileData* folder)
const std::string& folderPath = folder->getPath();
if (!Utils::FileSystem::exists(folderPath)) {
LOG(LogDebug) << "SystemData::populateFolder(): Folder with path \"" <<
folderPath << "\" does not exist.";
folderPath << "\" does not exist";
return false;
}
if (!Utils::FileSystem::isDirectory(folderPath)) {
LOG(LogWarning) << "Folder with path \"" <<
folderPath << "\" is not a directory.";
folderPath << "\" is not a directory";
return false;
}
@ -139,8 +139,12 @@ bool SystemData::populateFolder(FileData* folder)
filePath = *it;
// Skip hidden files and folders.
if (!showHiddenFiles && Utils::FileSystem::isHidden(filePath))
if (!showHiddenFiles && Utils::FileSystem::isHidden(filePath)) {
LOG(LogDebug) << "SystemData::populateFolder(): Skipping hidden " <<
(Utils::FileSystem::isDirectory(filePath) ? "directory \"" : "file \"") <<
filePath << "\"";
continue;
}
// This is a little complicated because we allow a list
// of extensions to be defined (delimited with a space).
@ -223,15 +227,15 @@ bool SystemData::loadConfig()
std::string path = getConfigPath(false);
const std::string rompath = FileData::getROMDirectory();
LOG(LogInfo) << "Loading system configuration file " << path << "...";
if (!Utils::FileSystem::exists(path)) {
LOG(LogWarning) << "es_systems.cfg does not exist.";
LOG(LogWarning) << "Systems configuration file does not exist";
if (copyConfigTemplate(getConfigPath(true)))
return false;
path = getConfigPath(false);
}
LOG(LogInfo) << "Parsing systems configuration file \"" << path << "\"...";
pugi::xml_document doc;
#if defined(_WIN64)
pugi::xml_parse_result res = doc.load_file(Utils::String::stringToWideString(path).c_str());
@ -249,7 +253,7 @@ bool SystemData::loadConfig()
pugi::xml_node systemList = doc.child("systemList");
if (!systemList) {
LOG(LogError) << "es_systems.cfg is missing the <systemList> tag.";
LOG(LogError) << "es_systems.cfg is missing the <systemList> tag";
return false;
}
@ -307,7 +311,7 @@ bool SystemData::loadConfig()
// Validate.
if (name.empty() || path.empty() || extensions.empty() || cmd.empty()) {
LOG(LogError) << "System \"" << name <<
"\" is missing name, path, extension, or command.";
"\" is missing name, path, extension, or command";
continue;
}
@ -349,7 +353,7 @@ bool SystemData::loadConfig()
if (newSys->getRootFolder()->getChildrenByFilename().size() == 0 || onlyHidden) {
LOG(LogDebug) << "SystemData::loadConfig(): System \"" << name <<
"\" has no games, ignoring it.";
"\" has no games, ignoring it";
delete newSys;
delete envData;
}
@ -374,25 +378,30 @@ bool SystemData::copyConfigTemplate(const std::string& path)
{
std::string systemsTemplateFile;;
LOG(LogInfo) << "Attempting to copy template es_systems.cfg file from the resources directory.";
LOG(LogInfo) <<
"Attempting to copy template es_systems.cfg file from the resources directory...";
#if defined(_WIN64)
systemsTemplateFile = ResourceManager::getInstance()->
getResourcePath(":/templates/es_systems.cfg_windows");
getResourcePath(":/templates/es_systems.cfg_windows", false);
#elif defined(__APPLE__)
systemsTemplateFile = ResourceManager::getInstance()->
getResourcePath(":/templates/es_systems.cfg_macos");
getResourcePath(":/templates/es_systems.cfg_macos", false);
#elif defined(__unix__)
systemsTemplateFile = ResourceManager::getInstance()->
getResourcePath(":/templates/es_systems.cfg_unix");
getResourcePath(":/templates/es_systems.cfg_unix", false);
#endif
if (Utils::FileSystem::copyFile(systemsTemplateFile, path, false)) {
LOG(LogError) << "Copying of es_systems.cfg template file failed.";
if (systemsTemplateFile == "") {
LOG(LogError) << "Can't find the es_systems.cfg template file";
return true;
}
else if (Utils::FileSystem::copyFile(systemsTemplateFile, path, false)) {
LOG(LogError) << "Copying of es_systems.cfg template file failed";
return true;
}
LOG(LogInfo) << "Template es_systems.cfg file copied successfully.";
LOG(LogInfo) << "Template es_systems.cfg file copied successfully";
return false;
}

View file

@ -361,7 +361,7 @@ bool verifyHomeFolderExists()
returnCode loadSystemConfigFile(std::string& errorMsg)
{
if (!SystemData::loadConfig()) {
LOG(LogError) << "Could not parse systems configuration file.";
LOG(LogError) << "Could not parse systems configuration file";
errorMsg = "COULDN'T FIND THE SYSTEMS CONFIGURATION FILE.\n"
"ATTEMPTED TO COPY A TEMPLATE ES_SYSTEMS.CFG FILE\n"
"FROM THE EMULATIONSTATION RESOURCES DIRECTORY,\n"
@ -373,7 +373,7 @@ returnCode loadSystemConfigFile(std::string& errorMsg)
if (SystemData::sSystemVector.size() == 0) {
LOG(LogError) << "No systems found, does at least one system have a game present? "
"(Check that the file extensions are supported.)";
"(Check that the file extensions are supported)";
errorMsg = "THE SYSTEMS CONFIGURATION FILE EXISTS, BUT NO\n"
"GAME FILES WERE FOUND. EITHER PLACE YOUR GAMES\n"
"IN THE CURRENTLY CONFIGURED ROM DIRECTORY OR\n"
@ -462,7 +462,6 @@ int main(int argc, char* argv[])
PowerSaver::init();
ViewController::init(&window);
CollectionSystemManager::init(&window);
MameNames::init();
window.pushGui(ViewController::get());
bool splashScreen = Settings::getInstance()->getBool("SplashScreen");
@ -470,7 +469,7 @@ int main(int argc, char* argv[])
SDL_Event event {};
if (!window.init()) {
LOG(LogError) << "Window failed to initialize.";
LOG(LogError) << "Window failed to initialize";
return 1;
}
@ -478,6 +477,7 @@ int main(int argc, char* argv[])
if (event.type == SDL_QUIT)
return 1;
MameNames::init();
if (splashScreen) {
std::string progressText = "Loading...";
@ -492,7 +492,7 @@ int main(int argc, char* argv[])
if (returnCodeValue) {
// Something went terribly wrong.
if (errorMsg == "") {
LOG(LogError) << "Unknown error occured while parsing system config file.";
LOG(LogError) << "Unknown error occured while parsing systems configuration file";
Renderer::deinit();
return 1;
}
@ -686,7 +686,7 @@ int main(int argc, char* argv[])
processQuitMode();
LOG(LogInfo) << "EmulationStation cleanly shutting down.";
LOG(LogInfo) << "EmulationStation cleanly shutting down";
#if defined(_WIN64)
closeConsole();

View file

@ -50,7 +50,7 @@ MameNames::MameNames()
if (!Utils::FileSystem::exists(xmlpath))
return;
LOG(LogInfo) << "Parsing XML file \"" << xmlpath << "\"...";
LOG(LogInfo) << "Parsing MAME names file \"" << xmlpath << "\"...";
pugi::xml_document doc;
#if defined(_WIN64)
@ -61,7 +61,7 @@ MameNames::MameNames()
#endif
if (!result) {
LOG(LogError) << "Error parsing XML file \"" << xmlpath << "\"!\n "
LOG(LogError) << "Error parsing MAME names file \"" << xmlpath << "\": "
<< result.description();
return;
}
@ -81,7 +81,7 @@ MameNames::MameNames()
if (!Utils::FileSystem::exists(xmlpath))
return;
LOG(LogInfo) << "Parsing XML file \"" << xmlpath << "\"...";
LOG(LogInfo) << "Parsing MAME BIOSes file \"" << xmlpath << "\"...";
#if defined(_WIN64)
result = doc.load_file(Utils::String::stringToWideString(xmlpath).c_str());
@ -90,7 +90,7 @@ MameNames::MameNames()
#endif
if (!result) {
LOG(LogError) << "Error parsing XML file \"" << xmlpath << "\"!\n "
LOG(LogError) << "Error parsing MAME BIOSes file \"" << xmlpath << "\": "
<< result.description();
return;
}
@ -107,7 +107,7 @@ MameNames::MameNames()
if (!Utils::FileSystem::exists(xmlpath))
return;
LOG(LogInfo) << "Parsing XML file \"" << xmlpath << "\"...";
LOG(LogInfo) << "Parsing MAME devices file \"" << xmlpath << "\"...";
#if defined(_WIN64)
result = doc.load_file(Utils::String::stringToWideString(xmlpath).c_str());
@ -116,7 +116,7 @@ MameNames::MameNames()
#endif
if (!result) {
LOG(LogError) << "Error parsing XML file \"" << xmlpath << "\"!\n "
LOG(LogError) << "Error parsing MAME devices file \"" << xmlpath << "\": "
<< result.description();
return;
}

View file

@ -35,16 +35,16 @@ std::shared_ptr<Sound> Sound::getFromTheme(const std::shared_ptr<ThemeData>& the
const std::string& view, const std::string& element)
{
LOG(LogDebug) << "Sound::getFromTheme(): Looking for navigation sound tag <sound name=\"" <<
element << "\">.";
element << "\">";
const ThemeData::ThemeElement* elem = theme->getElement(view, element, "sound");
if (!elem || !elem->has("path")) {
LOG(LogDebug) << "Sound::getFromTheme(): " << "Tag not found, using fallback sound file.";
LOG(LogDebug) << "Sound::getFromTheme(): " << "Tag not found, using fallback sound file";
return get(ResourceManager::getInstance()->
getResourcePath(":/sounds/" + element + ".wav"));
}
LOG(LogDebug) << "Sound::getFromTheme(): Tag found, ready to load theme sound file.";
LOG(LogDebug) << "Sound::getFromTheme(): Tag found, ready to load theme sound file";
return get(elem->get<std::string>("path"));
}
@ -133,7 +133,7 @@ void Sound::init()
// Convert buffer to stereo, 16bit, 44.1kHz.
if (SDL_ConvertAudio(&cvt) < 0) {
LOG(LogError) << "Error converting sound \"" << mPath <<
"\" to 44.1kHz, 16bit, stereo format!\n" << " " << SDL_GetError();
"\" to 44.1kHz, 16bit, stereo format: " << SDL_GetError();
delete[] cvt.buf;
}
else {

View file

@ -34,7 +34,8 @@ std::shared_ptr<ResourceManager>& ResourceManager::getInstance()
return sInstance;
}
std::string ResourceManager::getResourcePath(const std::string& path) const
std::string ResourceManager::getResourcePath(const std::string& path,
bool terminateOnFailure) const
{
// Check if this is a resource file.
if ((path[0] == ':') && (path[1] == '/')) {
@ -72,10 +73,11 @@ std::string ResourceManager::getResourcePath(const std::string& path) const
if (Utils::FileSystem::exists(testExePath)) {
return testExePath;
}
// For missing resources, log an error and terminate the application. This should
// indicate that we have a broken EmulationStation installation.
// indicate that we have a broken EmulationStation installation. If the argument
// terminateOnFailure is set to false though, then skip this step.
else {
if (terminateOnFailure) {
LOG(LogError) << "Program resource missing: " << path;
LOG(LogError) << "Tried to find the resource in the following locations:";
LOG(LogError) << testHome;
@ -89,6 +91,10 @@ std::string ResourceManager::getResourcePath(const std::string& path) const
Scripting::fireEvent("quit");
emergencyShutdown();
}
else {
return "";
}
}
}
// Not a resource, return unmodified path.

View file

@ -41,7 +41,7 @@ public:
void unloadAll();
void reloadAll();
std::string getResourcePath(const std::string& path) const;
std::string getResourcePath(const std::string& path, bool terminateOnFailure = true) const;
const ResourceData getFileData(const std::string& path) const;
bool fileExists(const std::string& path) const;

View file

@ -566,7 +566,7 @@ namespace Utils
if (!_overwrite && exists(_destination_path)) {
LOG(LogError) << "Destination file exists and the overwrite flag "
"has not been set.";
"has not been set";
return true;
}
@ -578,8 +578,8 @@ namespace Utils
#endif
if (sourceFile.fail()) {
LOG(LogError) << "Couldn't read from source file (" << _source_path <<
"), permission problems?";
LOG(LogError) << "Couldn't read from source file \"" << _source_path <<
"\", permission problems?";
sourceFile.close();
return true;
}
@ -592,8 +592,8 @@ namespace Utils
#endif
if (targetFile.fail()) {
LOG(LogError) << "Couldn't write to target file (" << _destination_path <<
"), permission problems?";
LOG(LogError) << "Couldn't write to target file \"" << _destination_path <<
"\", permission problems?";
targetFile.close();
return true;
}
@ -624,7 +624,7 @@ namespace Utils
if (!_overwrite && exists(_destination_path)) {
LOG(LogError) << "Destination file exists and the overwrite flag "
"has not been set.";
"has not been set";
return true;
}