From 33c4688991bcaf4880b50b5593836af1e6e208e1 Mon Sep 17 00:00:00 2001 From: Pk11 Date: Sat, 13 Mar 2021 16:16:33 -0600 Subject: [PATCH] Say "failed", not "succeeded" if extract fails --- include/utils/scriptUtils.hpp | 5 +- romfs/lang/en/app.json | 1 + source/utils/queueSystem.cpp | 451 +++++++++++++++++----------------- source/utils/scriptUtils.cpp | 12 +- 4 files changed, 235 insertions(+), 234 deletions(-) diff --git a/include/utils/scriptUtils.hpp b/include/utils/scriptUtils.hpp index cbe7782..1102b15 100644 --- a/include/utils/scriptUtils.hpp +++ b/include/utils/scriptUtils.hpp @@ -38,7 +38,8 @@ enum ScriptState { SYNTAX_ERROR, COPY_ERROR, MOVE_ERROR, - DELETE_ERROR + DELETE_ERROR, + EXTRACT_ERROR }; namespace ScriptUtils { @@ -52,7 +53,7 @@ namespace ScriptUtils { Result downloadRelease(const std::string &repo, const std::string &file, const std::string &output, bool includePrereleases, const std::string &message, bool isARG = false); Result downloadFile(const std::string &file, const std::string &output, const std::string &message, bool isARG = false); void installFile(const std::string &file, bool updatingSelf, const std::string &message, bool isARG = false); - void extractFile(const std::string &file, const std::string &input, const std::string &output, const std::string &message, bool isARG = false); + Result extractFile(const std::string &file, const std::string &input, const std::string &output, const std::string &message, bool isARG = false); Result runFunctions(nlohmann::json storeJson, int selection, const std::string &entry); }; diff --git a/romfs/lang/en/app.json b/romfs/lang/en/app.json index 1dce972..0b0f326 100644 --- a/romfs/lang/en/app.json +++ b/romfs/lang/en/app.json @@ -65,6 +65,7 @@ "EXECUTE_ENTRY": "Would you like to execute this entry?", "EXIT_APP": "Exit Universal-Updater", "EXTRACTING": "Extracting... %s / %s (%.2f%%)", + "EXTRACT_ERROR": "Extract error!", "FEATURE_SIDE_EFFECTS": "This Feature may have side effects while the Queue is running.\nAre you sure you want to continue?", "FETCHING_METADATA": "Fetching old metadata...", "FETCHING_RECOMMENDED_UNISTORES": "Fetching recommended UniStores...", diff --git a/source/utils/queueSystem.cpp b/source/utils/queueSystem.cpp index 73d7cbf..459595a 100644 --- a/source/utils/queueSystem.cpp +++ b/source/utils/queueSystem.cpp @@ -108,241 +108,234 @@ void QueueSystem::QueueHandle() { queueEntries[0]->total = queueEntries[0]->obj.size(); queueEntries[0]->current = QueueSystem::LastElement; - for(int i = QueueSystem::LastElement; (ret != PROMPT_RET) && i < queueEntries[0]->total; i++) { + for(int i = QueueSystem::LastElement; ret == NONE && i < queueEntries[0]->total && !QueueSystem::CancelCallback; i++) { queueEntries[0]->current++; - if (ret == NONE && !QueueSystem::CancelCallback) { - std::string type = ""; + std::string type = ""; - if (queueEntries[0]->obj[i].contains("type") && queueEntries[0]->obj[i]["type"].is_string()) { - type = queueEntries[0]->obj[i]["type"]; - - } else { - ret = SYNTAX_ERROR; - } - - /* Deleting a file. */ - if (type == "deleteFile") { - bool missing = false; - std::string file = ""; - queueEntries[0]->status = QueueStatus::Deleting; - - if (queueEntries[0]->obj[i].contains("file") && queueEntries[0]->obj[i]["file"].is_string()) { - file = queueEntries[0]->obj[i]["file"]; - } else missing = true; - - if (!missing) ret = ScriptUtils::removeFile(file, ""); - else ret = SYNTAX_ERROR; - - /* Downloading from a URL. */ - } else if (type == "downloadFile") { - bool missing = false; - std::string file = "", output = ""; - - queueEntries[0]->status = QueueStatus::Downloading; - - if (queueEntries[0]->obj[i].contains("file") && queueEntries[0]->obj[i]["file"].is_string()) { - file = queueEntries[0]->obj[i]["file"]; - } else missing = true; - - if (queueEntries[0]->obj[i].contains("output") && queueEntries[0]->obj[i]["output"].is_string()) { - output = queueEntries[0]->obj[i]["output"]; - } else missing = true; - - if (!missing) ret = ScriptUtils::downloadFile(file, output, "", false); - else ret = SYNTAX_ERROR; - - /* Download from a GitHub Release. */ - } else if (type == "downloadRelease") { - bool missing = false, includePrereleases = false; - std::string repo = "", file = "", output = ""; - - queueEntries[0]->status = QueueStatus::Downloading; - - if (queueEntries[0]->obj[i].contains("repo") && queueEntries[0]->obj[i]["repo"].is_string()) { - repo = queueEntries[0]->obj[i]["repo"]; - } else missing = true; - - if (queueEntries[0]->obj[i].contains("file") && queueEntries[0]->obj[i]["file"].is_string()) { - file = queueEntries[0]->obj[i]["file"]; - } else missing = true; - - if (queueEntries[0]->obj[i].contains("output") && queueEntries[0]->obj[i]["output"].is_string()) { - output = queueEntries[0]->obj[i]["output"]; - } else missing = true; - - if (queueEntries[0]->obj[i].contains("includePrereleases") && queueEntries[0]->obj[i]["includePrereleases"].is_boolean()) - includePrereleases = queueEntries[0]->obj[i]["includePrereleases"]; - - if (!missing) ret = ScriptUtils::downloadRelease(repo, file, output, includePrereleases, "", false); - else ret = SYNTAX_ERROR; - - /* Extracting files. */ - } else if (type == "extractFile") { - bool missing = false; - std::string file = "", input = "", output = ""; - queueEntries[0]->status = QueueStatus::Extracting; - - if (queueEntries[0]->obj[i].contains("file") && queueEntries[0]->obj[i]["file"].is_string()) { - file = queueEntries[0]->obj[i]["file"]; - } else missing = true; - - if (queueEntries[0]->obj[i].contains("input") && queueEntries[0]->obj[i]["input"].is_string()) { - input = queueEntries[0]->obj[i]["input"]; - } else missing = true; - - if (queueEntries[0]->obj[i].contains("output") && queueEntries[0]->obj[i]["output"].is_string()) { - output = queueEntries[0]->obj[i]["output"]; - } else missing = true; - - if (!missing) ScriptUtils::extractFile(file, input, output, "", false); - else ret = SYNTAX_ERROR; - - /* Installing CIAs. */ - } else if (type == "installCia") { - bool missing = false, updateSelf = false; - std::string file = ""; - queueEntries[0]->status = QueueStatus::Installing; - - if (queueEntries[0]->obj[i].contains("file") && queueEntries[0]->obj[i]["file"].is_string()) { - file = queueEntries[0]->obj[i]["file"]; - } else missing = true; - - if (queueEntries[0]->obj[i].contains("updateSelf") && queueEntries[0]->obj[i]["updateSelf"].is_boolean()) { - updateSelf = queueEntries[0]->obj[i]["updateSelf"]; - } - - if (!missing) ScriptUtils::installFile(file, updateSelf, ""); - else ret = SYNTAX_ERROR; - - } else if (type == "mkdir") { - bool missing = false; - std::string directory = ""; - - if (queueEntries[0]->obj[i].contains("directory") && queueEntries[0]->obj[i]["directory"].is_string()) { - directory = queueEntries[0]->obj[i]["directory"]; - } else missing = true; - - if (!missing) makeDirs(directory.c_str()); - else ret = SYNTAX_ERROR; - - /* Request Type 1. */ - } else if (type == "rmdir") { - bool missing = false; - std::string directory = "", message = "", promptmsg = ""; - queueEntries[0]->status = QueueStatus::Request; - - if (queueEntries[0]->obj[i].contains("directory") && queueEntries[0]->obj[i]["directory"].is_string()) { - directory = queueEntries[0]->obj[i]["directory"]; - } else missing = true; - - promptmsg = Lang::get("DELETE_PROMPT") + "\n" + directory; - - if (!missing && directory != "") { - if (access(directory.c_str(), F_OK) != 0) ret = DELETE_ERROR; - else { - if (QueueSystem::RequestNeeded == RMDIR_REQUEST) { - /* There we already did it. :) */ - queueEntries[0]->status = QueueStatus::Deleting; - if (QueueSystem::RequestAnswer == 1) removeDirRecursive(directory.c_str()); - /* Reset. */ - QueueSystem::RequestNeeded = NO_REQUEST; - QueueSystem::RequestAnswer = NO_REQUEST; - QueueSystem::RequestMsg = ""; - - } else { - /* We are in the process of the need of an answer. */ - QueueSystem::RequestNeeded = RMDIR_REQUEST; // Type 1. - QueueSystem::RequestMsg = promptmsg; - QueueSystem::LastElement = i; // So we know, where we go again after the Request. - ret = PROMPT_RET; - } - } - } - - else ret = SYNTAX_ERROR; - - /* Request Type 2. */ - } else if (type == "promptMessage" || type == "promptMsg") { - std::string Message = ""; - int skipCount = -1; - queueEntries[0]->status = QueueStatus::Request; - - if (queueEntries[0]->obj[i].contains("message") && queueEntries[0]->obj[i]["message"].is_string()) { - Message = queueEntries[0]->obj[i]["message"]; - } - - if (queueEntries[0]->obj[i].contains("count") && queueEntries[0]->obj[i]["count"].is_number()) { - skipCount = queueEntries[0]->obj[i]["count"]; - } - - if (QueueSystem::RequestNeeded == PROMPT_REQUEST) { - if ((skipCount > -1) && (QueueSystem::RequestAnswer == SCRIPT_CANCELED)) { - i += skipCount; // Skip. - queueEntries[0]->current += skipCount; - } - - /* Reset. */ - QueueSystem::RequestAnswer = NO_REQUEST; - QueueSystem::RequestNeeded = NO_REQUEST; - QueueSystem::RequestMsg = ""; - - } else { - QueueSystem::RequestNeeded = PROMPT_REQUEST; // Type 2. - QueueSystem::RequestMsg = Message; - QueueSystem::LastElement = i; // So we know, where we go again after the Request. - ret = PROMPT_RET; - } - - } else if (type == "exit") { - ret = SCRIPT_CANCELED; - - } else if (type == "copy") { - std::string source = "", destination = ""; - bool missing = false; - queueEntries[0]->status = QueueStatus::Copying; - - if (queueEntries[0]->obj[i].contains("source") && queueEntries[0]->obj[i]["source"].is_string()) { - source = queueEntries[0]->obj[i]["source"]; - } else missing = true; - - if (queueEntries[0]->obj[i].contains("destination") && queueEntries[0]->obj[i]["destination"].is_string()) { - destination = queueEntries[0]->obj[i]["destination"]; - } else missing = true; - - if (!missing) ret = ScriptUtils::copyFile(source, destination, ""); - else ret = SYNTAX_ERROR; - - } else if (type == "move") { - std::string oldFile = "", newFile = ""; - bool missing = false; - queueEntries[0]->status = QueueStatus::Moving; - - if (queueEntries[0]->obj[i].contains("old") && queueEntries[0]->obj[i]["old"].is_string()) { - oldFile = queueEntries[0]->obj[i]["old"]; - } else missing = true; - - if (queueEntries[0]->obj[i].contains("new") && queueEntries[0]->obj[i]["new"].is_string()) { - newFile = queueEntries[0]->obj[i]["new"]; - } else missing = true; - - if (!missing) ret = ScriptUtils::renameFile(oldFile, newFile, ""); - else ret = SYNTAX_ERROR; - - } else if (type == "skip") { - int skipCount = -1; - - if (queueEntries[0]->obj[i].contains("count") && queueEntries[0]->obj[i]["count"].is_number()) { - skipCount = queueEntries[0]->obj[i]["count"]; - } - - if (skipCount > 0) i += skipCount; // Skip. - } + if (queueEntries[0]->obj[i].contains("type") && queueEntries[0]->obj[i]["type"].is_string()) { + type = queueEntries[0]->obj[i]["type"]; } else { - queueEntries[0]->current = queueEntries[0]->total; // Set to total. + ret = SYNTAX_ERROR; + } + + /* Deleting a file. */ + if (type == "deleteFile") { + bool missing = false; + std::string file = ""; + queueEntries[0]->status = QueueStatus::Deleting; + + if (queueEntries[0]->obj[i].contains("file") && queueEntries[0]->obj[i]["file"].is_string()) { + file = queueEntries[0]->obj[i]["file"]; + } else missing = true; + + if (!missing) ret = ScriptUtils::removeFile(file, ""); + else ret = SYNTAX_ERROR; + + /* Downloading from a URL. */ + } else if (type == "downloadFile") { + bool missing = false; + std::string file = "", output = ""; + + queueEntries[0]->status = QueueStatus::Downloading; + + if (queueEntries[0]->obj[i].contains("file") && queueEntries[0]->obj[i]["file"].is_string()) { + file = queueEntries[0]->obj[i]["file"]; + } else missing = true; + + if (queueEntries[0]->obj[i].contains("output") && queueEntries[0]->obj[i]["output"].is_string()) { + output = queueEntries[0]->obj[i]["output"]; + } else missing = true; + + if (!missing) ret = ScriptUtils::downloadFile(file, output, "", false); + else ret = SYNTAX_ERROR; + + /* Download from a GitHub Release. */ + } else if (type == "downloadRelease") { + bool missing = false, includePrereleases = false; + std::string repo = "", file = "", output = ""; + + queueEntries[0]->status = QueueStatus::Downloading; + + if (queueEntries[0]->obj[i].contains("repo") && queueEntries[0]->obj[i]["repo"].is_string()) { + repo = queueEntries[0]->obj[i]["repo"]; + } else missing = true; + + if (queueEntries[0]->obj[i].contains("file") && queueEntries[0]->obj[i]["file"].is_string()) { + file = queueEntries[0]->obj[i]["file"]; + } else missing = true; + + if (queueEntries[0]->obj[i].contains("output") && queueEntries[0]->obj[i]["output"].is_string()) { + output = queueEntries[0]->obj[i]["output"]; + } else missing = true; + + if (queueEntries[0]->obj[i].contains("includePrereleases") && queueEntries[0]->obj[i]["includePrereleases"].is_boolean()) + includePrereleases = queueEntries[0]->obj[i]["includePrereleases"]; + + if (!missing) ret = ScriptUtils::downloadRelease(repo, file, output, includePrereleases, "", false); + else ret = SYNTAX_ERROR; + + /* Extracting files. */ + } else if (type == "extractFile") { + bool missing = false; + std::string file = "", input = "", output = ""; + queueEntries[0]->status = QueueStatus::Extracting; + + if (queueEntries[0]->obj[i].contains("file") && queueEntries[0]->obj[i]["file"].is_string()) { + file = queueEntries[0]->obj[i]["file"]; + } else missing = true; + + if (queueEntries[0]->obj[i].contains("input") && queueEntries[0]->obj[i]["input"].is_string()) { + input = queueEntries[0]->obj[i]["input"]; + } else missing = true; + + if (queueEntries[0]->obj[i].contains("output") && queueEntries[0]->obj[i]["output"].is_string()) { + output = queueEntries[0]->obj[i]["output"]; + } else missing = true; + + if (!missing) ret = ScriptUtils::extractFile(file, input, output, "", false); + else ret = SYNTAX_ERROR; + + /* Installing CIAs. */ + } else if (type == "installCia") { + bool missing = false, updateSelf = false; + std::string file = ""; + queueEntries[0]->status = QueueStatus::Installing; + + if (queueEntries[0]->obj[i].contains("file") && queueEntries[0]->obj[i]["file"].is_string()) { + file = queueEntries[0]->obj[i]["file"]; + } else missing = true; + + if (queueEntries[0]->obj[i].contains("updateSelf") && queueEntries[0]->obj[i]["updateSelf"].is_boolean()) { + updateSelf = queueEntries[0]->obj[i]["updateSelf"]; + } + + if (!missing) ScriptUtils::installFile(file, updateSelf, ""); + else ret = SYNTAX_ERROR; + + } else if (type == "mkdir") { + bool missing = false; + std::string directory = ""; + + if (queueEntries[0]->obj[i].contains("directory") && queueEntries[0]->obj[i]["directory"].is_string()) { + directory = queueEntries[0]->obj[i]["directory"]; + } else missing = true; + + if (!missing) makeDirs(directory.c_str()); + else ret = SYNTAX_ERROR; + + /* Request Type 1. */ + } else if (type == "rmdir") { + bool missing = false; + std::string directory = "", message = "", promptmsg = ""; + queueEntries[0]->status = QueueStatus::Request; + + if (queueEntries[0]->obj[i].contains("directory") && queueEntries[0]->obj[i]["directory"].is_string()) { + directory = queueEntries[0]->obj[i]["directory"]; + } else missing = true; + + promptmsg = Lang::get("DELETE_PROMPT") + "\n" + directory; + + if (!missing && directory != "") { + if (access(directory.c_str(), F_OK) != 0) ret = DELETE_ERROR; + else { + if (QueueSystem::RequestNeeded == RMDIR_REQUEST) { + /* There we already did it. :) */ + queueEntries[0]->status = QueueStatus::Deleting; + if (QueueSystem::RequestAnswer == 1) removeDirRecursive(directory.c_str()); + /* Reset. */ + QueueSystem::RequestNeeded = NO_REQUEST; + QueueSystem::RequestAnswer = NO_REQUEST; + QueueSystem::RequestMsg = ""; + + } else { + /* We are in the process of the need of an answer. */ + QueueSystem::RequestNeeded = RMDIR_REQUEST; // Type 1. + QueueSystem::RequestMsg = promptmsg; + QueueSystem::LastElement = i; // So we know, where we go again after the Request. + ret = PROMPT_RET; + } + } + } + + else ret = SYNTAX_ERROR; + + /* Request Type 2. */ + } else if (type == "promptMessage" || type == "promptMsg") { + std::string Message = ""; + int skipCount = -1; + queueEntries[0]->status = QueueStatus::Request; + + if (queueEntries[0]->obj[i].contains("message") && queueEntries[0]->obj[i]["message"].is_string()) { + Message = queueEntries[0]->obj[i]["message"]; + } + + if (queueEntries[0]->obj[i].contains("count") && queueEntries[0]->obj[i]["count"].is_number()) { + skipCount = queueEntries[0]->obj[i]["count"]; + } + + if (QueueSystem::RequestNeeded == PROMPT_REQUEST) { + if ((skipCount > -1) && (QueueSystem::RequestAnswer == SCRIPT_CANCELED)) { + i += skipCount; // Skip. + queueEntries[0]->current += skipCount; + } + + /* Reset. */ + QueueSystem::RequestAnswer = NO_REQUEST; + QueueSystem::RequestNeeded = NO_REQUEST; + QueueSystem::RequestMsg = ""; + + } else { + QueueSystem::RequestNeeded = PROMPT_REQUEST; // Type 2. + QueueSystem::RequestMsg = Message; + QueueSystem::LastElement = i; // So we know, where we go again after the Request. + ret = PROMPT_RET; + } + + } else if (type == "exit") { ret = SCRIPT_CANCELED; - break; + + } else if (type == "copy") { + std::string source = "", destination = ""; + bool missing = false; + queueEntries[0]->status = QueueStatus::Copying; + + if (queueEntries[0]->obj[i].contains("source") && queueEntries[0]->obj[i]["source"].is_string()) { + source = queueEntries[0]->obj[i]["source"]; + } else missing = true; + + if (queueEntries[0]->obj[i].contains("destination") && queueEntries[0]->obj[i]["destination"].is_string()) { + destination = queueEntries[0]->obj[i]["destination"]; + } else missing = true; + + if (!missing) ret = ScriptUtils::copyFile(source, destination, ""); + else ret = SYNTAX_ERROR; + + } else if (type == "move") { + std::string oldFile = "", newFile = ""; + bool missing = false; + queueEntries[0]->status = QueueStatus::Moving; + + if (queueEntries[0]->obj[i].contains("old") && queueEntries[0]->obj[i]["old"].is_string()) { + oldFile = queueEntries[0]->obj[i]["old"]; + } else missing = true; + + if (queueEntries[0]->obj[i].contains("new") && queueEntries[0]->obj[i]["new"].is_string()) { + newFile = queueEntries[0]->obj[i]["new"]; + } else missing = true; + + if (!missing) ret = ScriptUtils::renameFile(oldFile, newFile, ""); + else ret = SYNTAX_ERROR; + + } else if (type == "skip") { + int skipCount = -1; + + if (queueEntries[0]->obj[i].contains("count") && queueEntries[0]->obj[i]["count"].is_number()) { + skipCount = queueEntries[0]->obj[i]["count"]; + } + + if (skipCount > 0) i += skipCount; // Skip. } } diff --git a/source/utils/scriptUtils.cpp b/source/utils/scriptUtils.cpp index 4aeec02..cc4f3a6 100644 --- a/source/utils/scriptUtils.cpp +++ b/source/utils/scriptUtils.cpp @@ -276,8 +276,9 @@ void ScriptUtils::installFile(const std::string &file, bool updatingSelf, const } /* Extract files. */ -void ScriptUtils::extractFile(const std::string &file, const std::string &input, const std::string &output, const std::string &message, bool isARG) { +Result ScriptUtils::extractFile(const std::string &file, const std::string &input, const std::string &output, const std::string &message, bool isARG) { extractFilesCount = 0; + Result ret = NONE; std::string out, in; in = std::regex_replace(file, std::regex("%ARCHIVE_DEFAULT%"), config->archPath()); @@ -305,13 +306,17 @@ void ScriptUtils::extractFile(const std::string &file, const std::string &input, filesExtracted = 0; getExtractedSize(in, input); - extractArchive(in, input, out); + if(extractArchive(in, input, out) != EXTRACT_ERROR_NONE) { + ret = EXTRACT_ERROR; + } if (isARG) { showProgressBar = false; threadJoin(thread, U64_MAX); threadFree(thread); } + + return ret; } /* @@ -442,7 +447,7 @@ Result ScriptUtils::runFunctions(nlohmann::json storeJson, int selection, const message = Script[i]["message"]; } - if (!missing) ScriptUtils::extractFile(file, input, output, message, true); + if (!missing) ret = ScriptUtils::extractFile(file, input, output, message, true); else ret = SYNTAX_ERROR; } else if (type == "installCia") { @@ -580,5 +585,6 @@ Result ScriptUtils::runFunctions(nlohmann::json storeJson, int selection, const else if (ret == COPY_ERROR) Msg::waitMsg(Lang::get("COPY_ERROR")); else if (ret == MOVE_ERROR) Msg::waitMsg(Lang::get("MOVE_ERROR")); else if (ret == DELETE_ERROR) Msg::waitMsg(Lang::get("DELETE_ERROR")); + else if (ret == EXTRACT_ERROR) Msg::waitMsg(Lang::get("EXTRACT_ERROR")); return ret; } \ No newline at end of file