diff --git a/src/cpp/ripple/CallRPC.cpp b/src/cpp/ripple/CallRPC.cpp index be955d8a01..eb9eae3e7d 100644 --- a/src/cpp/ripple/CallRPC.cpp +++ b/src/cpp/ripple/CallRPC.cpp @@ -131,6 +131,31 @@ Json::Value RPCParser::parseEvented(const Json::Value& jvParams) return rpcError(rpcNO_EVENTS); } +// ledger [id|ledger_current|ledger_closed] [full] +Json::Value RPCParser::parseLedger(const Json::Value& jvParams) +{ + Json::Value jvRequest(Json::objectValue); + + if (!jvParams.size()) + { + return jvRequest; + } + + std::string strLedger = jvParams[0u].asString(); + + if (strLedger == "current" || strLedger == "ledger_closed" || strLedger.length() > 12) + jvRequest["ledger"] = strLedger; + else + jvRequest["ledger"] = lexical_cast_s(strLedger); + + if (2 == jvParams.size() && jvParams[1u].asString() == "full") + { + jvRequest["full"] = bool(1); + } + + return jvRequest; +} + // submit any transaction to the network // submit private_key json Json::Value RPCParser::parseSubmit(const Json::Value& jvParams) @@ -211,7 +236,7 @@ Json::Value RPCParser::parseCommand(std::string strMethod, Json::Value jvParams) // { "data_fetch", &RPCParser::doDataFetch, 1, 1, true, false, optNone }, // { "data_store", &RPCParser::doDataStore, 2, 2, true, false, optNone }, // { "get_counts", &RPCParser::doGetCounts, 0, 1, true, false, optNone }, -// { "ledger", &RPCParser::doLedger, 0, 2, false, false, optNetwork }, + { "ledger", &RPCParser::parseLedger, 0, 2 }, { "ledger_accept", &RPCParser::parseAsIs, 0, 0 }, { "ledger_closed", &RPCParser::parseAsIs, 0, 0 }, { "ledger_current", &RPCParser::parseAsIs, 0, 0 }, @@ -266,6 +291,10 @@ Json::Value RPCParser::parseCommand(std::string strMethod, Json::Value jvParams) else if ((commandsA[i].iMinParams >= 0 && jvParams.size() < commandsA[i].iMinParams) || (commandsA[i].iMaxParams >= 0 && jvParams.size() > commandsA[i].iMaxParams)) { + cLog(lsWARNING) << "Wrong number of parameters: minimum=" << commandsA[i].iMinParams + << " maximum=" << commandsA[i].iMaxParams + << " actual=" << jvParams.size(); + return rpcError(rpcBAD_SYNTAX); } diff --git a/src/cpp/ripple/CallRPC.h b/src/cpp/ripple/CallRPC.h index 9a972662ad..df7b4c4f07 100644 --- a/src/cpp/ripple/CallRPC.h +++ b/src/cpp/ripple/CallRPC.h @@ -15,10 +15,9 @@ protected: Json::Value parseAccountInfo(const Json::Value& jvParams); Json::Value parseAccountTransactions(const Json::Value& jvParams); Json::Value parseConnect(const Json::Value& jvParams); - - Json::Value parseSubmit(const Json::Value& jvParams); Json::Value parseEvented(const Json::Value& jvParams); - + Json::Value parseLedger(const Json::Value& jvParams); + Json::Value parseSubmit(const Json::Value& jvParams); Json::Value parseUnlAdd(const Json::Value& jvParams); Json::Value parseUnlDelete(const Json::Value& jvParams); diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index 3716b8fca8..c8715c46f0 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -1131,41 +1131,47 @@ Json::Value RPCHandler::doLedgerCurrent(Json::Value) return jvResult; } -// ledger [id|current|lastclosed] [full] -Json::Value RPCHandler::doLedger(Json::Value params) +// ledger [id|ledger_current|lastclosed] [full] +// { +// ledger: 'ledger_current' | 'ledger_closed' | | , // optional +// full: true | false // optional, defaults to false. +// } +Json::Value RPCHandler::doLedger(Json::Value jvParams) { - if (getParamCount(params) == 0) + if (!jvParams.isMember("ledger")) { Json::Value ret(Json::objectValue), current(Json::objectValue), closed(Json::objectValue); + theApp->getLedgerMaster().getCurrentLedger()->addJson(current, 0); theApp->getLedgerMaster().getClosedLedger()->addJson(closed, 0); + ret["open"] = current; ret["closed"] = closed; + return ret; } - std::string param; - if (!extractString(param, params, 0)) - { - return "bad params"; - } - + std::string strLedger = jvParams["ledger"].asString(); Ledger::pointer ledger; - if (param == "current") + + if (strLedger == "ledger_current") ledger = theApp->getLedgerMaster().getCurrentLedger(); - else if ((param == "lastclosed") || (param == "lastaccepted")) + else if (strLedger == "ledger_closed") ledger = theApp->getLedgerMaster().getClosedLedger(); - else if (param.size() > 12) - ledger = theApp->getLedgerMaster().getLedgerByHash(uint256(param)); + else if (strLedger.size() > 12) + ledger = theApp->getLedgerMaster().getLedgerByHash(uint256(strLedger)); else - ledger = theApp->getLedgerMaster().getLedgerBySeq(lexical_cast_s(param)); + ledger = theApp->getLedgerMaster().getLedgerBySeq(jvParams["ledger"].asUInt()); if (!ledger) return rpcError(rpcLGR_NOT_FOUND); - bool full = extractString(param, params, 1) && (param == "full"); + bool full = jvParams.isMember("full") && jvParams["full"].asBool(); + Json::Value ret(Json::objectValue); + ledger->addJson(ret, full ? LEDGER_JSON_FULL : 0); + return ret; } @@ -2176,7 +2182,7 @@ Json::Value RPCHandler::doCommand(Json::Value& jvParams, int iRole) { "data_fetch", &RPCHandler::doDataFetch, 1, 1, true, false, optNone }, { "data_store", &RPCHandler::doDataStore, 2, 2, true, false, optNone }, { "get_counts", &RPCHandler::doGetCounts, 0, 1, true, false, optNone }, - { "ledger", &RPCHandler::doLedger, 0, 2, false, false, optNetwork }, + { "ledger", &RPCHandler::doLedger, -1, -1, false, false, optNetwork }, { "ledger_accept", &RPCHandler::doLedgerAccept, -1, -1, true, false, optCurrent }, { "ledger_closed", &RPCHandler::doLedgerClosed, -1, -1, false, false, optClosed }, { "ledger_current", &RPCHandler::doLedgerCurrent, -1, -1, false, false, optCurrent }, diff --git a/src/js/remote.js b/src/js/remote.js index aff05c2439..0912f40dfc 100644 --- a/src/js/remote.js +++ b/src/js/remote.js @@ -548,13 +548,18 @@ Remote.prototype.request_server_info = function () { return new Request(this, 'server_info'); }; -Remote.prototype.request_ledger = function (params) { - // XXX Does this require the server to be trusted? +// XXX This is a bad command. Some varients don't scale. +// XXX Require the server to be trusted. +Remote.prototype.request_ledger = function (ledger, full) { //assert(this.trusted); var request = new Request(this, 'ledger'); - request.message.params = params; + if (ledger) + request.message.ledger = ledger; + + if (full) + request.message.full = true; return request; };