From 22c22bd734e0dd04da84a46a34065c8d8be49779 Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Thu, 27 Sep 2012 13:36:04 -0700 Subject: [PATCH] WS: Add support ledger_entry to return a ripple_state. --- src/Amount.cpp | 1 + src/WSDoor.cpp | 58 ++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/src/Amount.cpp b/src/Amount.cpp index f0692f2af..637d4ef52 100644 --- a/src/Amount.cpp +++ b/src/Amount.cpp @@ -12,6 +12,7 @@ uint64 STAmount::uRateOne = STAmount::getRate(STAmount(1), STAmount(1)); +// --> sCurrency: "", "XNS", or three letter ISO code. bool STAmount::currencyFromString(uint160& uDstCurrency, const std::string& sCurrency) { bool bSuccess = true; diff --git a/src/WSDoor.cpp b/src/WSDoor.cpp index ae63b0212..7e6960b83 100644 --- a/src/WSDoor.cpp +++ b/src/WSDoor.cpp @@ -608,33 +608,23 @@ void WSConnection::doLedgerEntry(Json::Value& jvResult, const Json::Value& jvReq jvResult["ledger_index"] = uLedgerIndex; + uint256 uNodeIndex; + if (jvRequest.isMember("index")) { jvResult["error"] = "notImplemented"; } else if (jvRequest.isMember("account_root")) { - NewcoinAddress naAccount = NewcoinAddress::createAccountID(jvRequest["account_root"].asString()); + NewcoinAddress naAccount; - if (!naAccount.isValid()) + if (!naAccount.setAccountID(jvRequest["account_root"].asString())) { jvResult["error"] = "malformedAddress"; - return; - } - - uint256 accountRootIndex = Ledger::getAccountRootIndex(naAccount.getAccountID()); - - SLE::pointer sleNode = noNetwork.getSLE(lpLedger, accountRootIndex); - - if (!sleNode) - { - // Not found. - // XXX We should also provide proof. - jvResult["error"] = "entryNotFound"; } else { - jvResult["node"] = sleNode->getJson(0); + uNodeIndex = Ledger::getAccountRootIndex(naAccount.getAccountID()); } } else if (jvRequest.isMember("directory")) @@ -651,12 +641,48 @@ void WSConnection::doLedgerEntry(Json::Value& jvResult, const Json::Value& jvReq } else if (jvRequest.isMember("ripple_state")) { - jvResult["error"] = "notImplemented"; + NewcoinAddress naA; + NewcoinAddress naB; + uint160 uCurrency; + + if (!jvRequest.isMember("accounts") + || !jvRequest.isMember("currency") + || !jvRequest["accounts"].isArray() + || 2 != jvRequest["accounts"].size()) { + jvResult["error"] = "malformedRequest"; + } + else if (!naA.setAccountID(jvRequest["accounts"][0u].asString()) + || !naB.setAccountID(jvRequest["accounts"][1u].asString())) { + jvResult["error"] = "malformedAddress"; + } + else if (!STAmount::currencyFromString(uCurrency, jvRequest["currency"].asString())) { + jvResult["error"] = "malformedCurrency"; + } + else + { + uNodeIndex = Ledger::getRippleStateIndex(naA, naB, uCurrency); + } } else { jvResult["error"] = "unknownOption"; } + + if (!!uNodeIndex) + { + SLE::pointer sleNode = noNetwork.getSLE(lpLedger, uNodeIndex); + + if (!sleNode) + { + // Not found. + // XXX We should also provide proof. + jvResult["error"] = "entryNotFound"; + } + else + { + jvResult["node"] = sleNode->getJson(0); + } + } } void WSConnection::doTransactionSubcribe(Json::Value& jvResult, const Json::Value& jvRequest)