diff options
Diffstat (limited to 'indra/newview/llexternaleditor.cpp')
-rwxr-xr-x[-rw-r--r--] | indra/newview/llexternaleditor.cpp | 109 |
1 files changed, 60 insertions, 49 deletions
diff --git a/indra/newview/llexternaleditor.cpp b/indra/newview/llexternaleditor.cpp index 54968841ab..df9c848cb8 100644..100755 --- a/indra/newview/llexternaleditor.cpp +++ b/indra/newview/llexternaleditor.cpp @@ -27,7 +27,11 @@ #include "llviewerprecompiledheaders.h" #include "llexternaleditor.h" +#include "lltrans.h" #include "llui.h" +#include "llprocess.h" +#include "llsdutil.h" +#include <boost/foreach.hpp> // static const std::string LLExternalEditor::sFilenameMarker = "%s"; @@ -35,85 +39,92 @@ const std::string LLExternalEditor::sFilenameMarker = "%s"; // static const std::string LLExternalEditor::sSetting = "ExternalEditor"; -bool LLExternalEditor::setCommand(const std::string& env_var, const std::string& override) +LLExternalEditor::EErrorCode LLExternalEditor::setCommand(const std::string& env_var, const std::string& override) { std::string cmd = findCommand(env_var, override); if (cmd.empty()) { - llwarns << "Empty editor command" << llendl; - return false; - } - - // Add the filename marker if missing. - if (cmd.find(sFilenameMarker) == std::string::npos) - { - cmd += " \"" + sFilenameMarker + "\""; - llinfos << "Adding the filename marker (" << sFilenameMarker << ")" << llendl; + LL_WARNS() << "Editor command is empty or not set" << LL_ENDL; + return EC_NOT_SPECIFIED; } string_vec_t tokens; - if (tokenize(tokens, cmd) < 2) // 2 = bin + at least one arg (%s) - { - llwarns << "Error parsing editor command" << llendl; - return false; - } + tokenize(tokens, cmd); // Check executable for existence. std::string bin_path = tokens[0]; if (!LLFile::isfile(bin_path)) { - llwarns << "Editor binary [" << bin_path << "] not found" << llendl; - return false; + LL_WARNS() << "Editor binary [" << bin_path << "] not found" << LL_ENDL; + return EC_BINARY_NOT_FOUND; } // Save command. - mProcess.setExecutable(bin_path); - mArgs.clear(); + mProcessParams = LLProcess::Params(); + mProcessParams.executable = bin_path; for (size_t i = 1; i < tokens.size(); ++i) { - if (i > 1) mArgs += " "; - mArgs += "\"" + tokens[i] + "\""; + mProcessParams.args.add(tokens[i]); + } + + // Add the filename marker if missing. + if (cmd.find(sFilenameMarker) == std::string::npos) + { + mProcessParams.args.add(sFilenameMarker); + LL_INFOS() << "Adding the filename marker (" << sFilenameMarker << ")" << LL_ENDL; } - llinfos << "Setting command [" << bin_path << " " << mArgs << "]" << llendl; - return true; + LL_INFOS() << "Setting command [" << mProcessParams << "]" << LL_ENDL; + + return EC_SUCCESS; } -bool LLExternalEditor::run(const std::string& file_path) +LLExternalEditor::EErrorCode LLExternalEditor::run(const std::string& file_path) { - std::string args = mArgs; - if (mProcess.getExecutable().empty() || args.empty()) + if (std::string(mProcessParams.executable).empty() || mProcessParams.args.empty()) { - llwarns << "Editor command not set" << llendl; - return false; + LL_WARNS() << "Editor command not set" << LL_ENDL; + return EC_NOT_SPECIFIED; } - // Substitute the filename marker in the command with the actual passed file name. - LLStringUtil::replaceString(args, sFilenameMarker, file_path); - - // Split command into separate tokens. - string_vec_t tokens; - tokenize(tokens, args); + // Copy params block so we can replace sFilenameMarker + LLProcess::Params params; + params.executable = mProcessParams.executable; - // Set process arguments taken from the command. - mProcess.clearArguments(); - for (string_vec_t::const_iterator arg_it = tokens.begin(); arg_it != tokens.end(); ++arg_it) + // Substitute the filename marker in the command with the actual passed file name. + BOOST_FOREACH(const std::string& arg, mProcessParams.args) { - mProcess.addArgument(*arg_it); + std::string fixed(arg); + LLStringUtil::replaceString(fixed, sFilenameMarker, file_path); + params.args.add(fixed); } - // Run the editor. - llinfos << "Running editor command [" << mProcess.getExecutable() + " " + args << "]" << llendl; - int result = mProcess.launch(); - if (result == 0) + // Run the editor. Prevent killing the process in destructor. + params.autokill = false; + return LLProcess::create(params) ? EC_SUCCESS : EC_FAILED_TO_RUN; +} + +// static +std::string LLExternalEditor::getErrorMessage(EErrorCode code) +{ + switch (code) { - // Prevent killing the process in destructor (will add it to the zombies list). - mProcess.orphan(); + case EC_SUCCESS: return LLTrans::getString("ok"); + case EC_NOT_SPECIFIED: return LLTrans::getString("ExternalEditorNotSet"); + case EC_PARSE_ERROR: return LLTrans::getString("ExternalEditorCommandParseError"); + case EC_BINARY_NOT_FOUND: return LLTrans::getString("ExternalEditorNotFound"); + case EC_FAILED_TO_RUN: return LLTrans::getString("ExternalEditorFailedToRun"); } - return result == 0; + return LLTrans::getString("Unknown"); } +// TODO: +// - Unit-test this with tests like LLStringUtil::getTokens() (the +// command-line overload that supports quoted tokens) +// - Unless there are significant semantic differences, eliminate this method +// and use LLStringUtil::getTokens() instead. + // static size_t LLExternalEditor::tokenize(string_vec_t& tokens, const std::string& str) { @@ -170,12 +181,12 @@ std::string LLExternalEditor::findCommand( if (!override.empty()) // try the supplied override first { cmd = override; - llinfos << "Using override" << llendl; + LL_INFOS() << "Using override" << LL_ENDL; } else if (!LLUI::sSettingGroups["config"]->getString(sSetting).empty()) { cmd = LLUI::sSettingGroups["config"]->getString(sSetting); - llinfos << "Using setting" << llendl; + LL_INFOS() << "Using setting" << LL_ENDL; } else // otherwise use the path specified by the environment variable { @@ -183,10 +194,10 @@ std::string LLExternalEditor::findCommand( if (env_var_val) { cmd = env_var_val; - llinfos << "Using env var " << env_var << llendl; + LL_INFOS() << "Using env var " << env_var << LL_ENDL; } } - llinfos << "Found command [" << cmd << "]" << llendl; + LL_INFOS() << "Found command [" << cmd << "]" << LL_ENDL; return cmd; } |