Qt/RPCConsole: Make it possible to parse a command without executing it

This commit is contained in:
Luke Dashjr 2016-11-16 10:56:32 +00:00
parent 1755c04576
commit e2d9213c32
2 changed files with 17 additions and 12 deletions

View file

@ -136,10 +136,10 @@ public:
#include "rpcconsole.moc" #include "rpcconsole.moc"
/** /**
* Split shell command line into a list of arguments and execute the command(s). * Split shell command line into a list of arguments and optionally execute the command(s).
* Aims to emulate \c bash and friends. * Aims to emulate \c bash and friends.
* *
* - Command nesting is possible with brackets [example: validateaddress(getnewaddress())] * - Command nesting is possible with parenthesis; for example: validateaddress(getnewaddress())
* - Arguments are delimited with whitespace or comma * - Arguments are delimited with whitespace or comma
* - Extra whitespace at the beginning and end and between arguments will be ignored * - Extra whitespace at the beginning and end and between arguments will be ignored
* - Text can be "double" or 'single' quoted * - Text can be "double" or 'single' quoted
@ -150,9 +150,10 @@ public:
* *
* @param[out] result stringified Result from the executed command(chain) * @param[out] result stringified Result from the executed command(chain)
* @param[in] strCommand Command line to split * @param[in] strCommand Command line to split
* @param[in] fExecute set true if you want the command to be executed
*/ */
bool RPCConsole::RPCExecuteCommandLine(std::string &strResult, const std::string &strCommand) bool RPCConsole::RPCParseCommandLine(std::string &strResult, const std::string &strCommand, const bool fExecute)
{ {
std::vector< std::vector<std::string> > stack; std::vector< std::vector<std::string> > stack;
stack.push_back(std::vector<std::string>()); stack.push_back(std::vector<std::string>());
@ -196,7 +197,7 @@ bool RPCConsole::RPCExecuteCommandLine(std::string &strResult, const std::string
curarg += ch; curarg += ch;
break; break;
} }
if (curarg.size()) if (curarg.size() && fExecute)
{ {
// if we have a value query, query arrays with index and objects with a string key // if we have a value query, query arrays with index and objects with a string key
UniValue subelement; UniValue subelement;
@ -271,13 +272,14 @@ bool RPCConsole::RPCExecuteCommandLine(std::string &strResult, const std::string
} }
if ((ch == ')' || ch == '\n') && stack.size() > 0) if ((ch == ')' || ch == '\n') && stack.size() > 0)
{ {
std::string strPrint; if (fExecute) {
// Convert argument list to JSON objects in method-dependent way, // Convert argument list to JSON objects in method-dependent way,
// and pass it along with the method name to the dispatcher. // and pass it along with the method name to the dispatcher.
JSONRPCRequest req; JSONRPCRequest req;
req.params = RPCConvertValues(stack.back()[0], std::vector<std::string>(stack.back().begin() + 1, stack.back().end())); req.params = RPCConvertValues(stack.back()[0], std::vector<std::string>(stack.back().begin() + 1, stack.back().end()));
req.strMethod = stack.back()[0]; req.strMethod = stack.back()[0];
lastResult = tableRPC.execute(req); lastResult = tableRPC.execute(req);
}
state = STATE_COMMAND_EXECUTED; state = STATE_COMMAND_EXECUTED;
curarg.clear(); curarg.clear();

View file

@ -36,7 +36,10 @@ public:
explicit RPCConsole(const PlatformStyle *platformStyle, QWidget *parent); explicit RPCConsole(const PlatformStyle *platformStyle, QWidget *parent);
~RPCConsole(); ~RPCConsole();
static bool RPCExecuteCommandLine(std::string &strResult, const std::string &strCommand); static bool RPCParseCommandLine(std::string &strResult, const std::string &strCommand, bool fExecute);
static bool RPCExecuteCommandLine(std::string &strResult, const std::string &strCommand) {
return RPCParseCommandLine(strResult, strCommand, true);
}
void setClientModel(ClientModel *model); void setClientModel(ClientModel *model);