mirror of
https://github.com/Xahau/xahaud.git
synced 2025-12-06 17:27:52 +00:00
SignerListSet txn and InnerObjectFormats (RIPD-182):
Add support for the SignerListSet transaction as a step toward multi-sign support. As part of the SignerListSet implementation, add InnerObjectFormat templates (similar to TxFormats and LedgerFormats) and enforce them in STObject, STArray, and STParsedJSON.
This commit is contained in:
committed by
Vinnie Falco
parent
92799187ed
commit
64ebd64d2b
@@ -21,6 +21,7 @@
|
||||
#include <ripple/basics/Log.h>
|
||||
#include <ripple/json/json_reader.h>
|
||||
#include <ripple/json/to_string.h>
|
||||
#include <ripple/protocol/InnerObjectFormats.h>
|
||||
#include <ripple/protocol/STBase.h>
|
||||
#include <ripple/protocol/STAccount.h>
|
||||
#include <ripple/protocol/STArray.h>
|
||||
@@ -119,7 +120,7 @@ bool STObject::setType (const SOTemplate& type)
|
||||
{
|
||||
WriteLog (lsWARNING, STObject) <<
|
||||
"setType( " << getFName ().getName () <<
|
||||
") invalid default " << e->e_field.fieldName;
|
||||
" ) invalid default " << e->e_field.fieldName;
|
||||
valid = false;
|
||||
}
|
||||
v.emplace_back(std::move(*iter));
|
||||
@@ -131,7 +132,7 @@ bool STObject::setType (const SOTemplate& type)
|
||||
{
|
||||
WriteLog (lsWARNING, STObject) <<
|
||||
"setType( " << getFName ().getName () <<
|
||||
") invalid missing " << e->e_field.fieldName;
|
||||
" ) invalid missing " << e->e_field.fieldName;
|
||||
valid = false;
|
||||
}
|
||||
v.emplace_back(detail::nonPresentObject, e->e_field);
|
||||
@@ -144,7 +145,7 @@ bool STObject::setType (const SOTemplate& type)
|
||||
{
|
||||
WriteLog (lsWARNING, STObject) <<
|
||||
"setType( " << getFName ().getName () <<
|
||||
") invalid leftover " << e->getFName ().getName ();
|
||||
" ) invalid leftover " << e->getFName ().getName ();
|
||||
valid = false;
|
||||
}
|
||||
}
|
||||
@@ -154,6 +155,20 @@ bool STObject::setType (const SOTemplate& type)
|
||||
return valid;
|
||||
}
|
||||
|
||||
STObject::ResultOfSetTypeFromSField
|
||||
STObject::setTypeFromSField (SField const& sField)
|
||||
{
|
||||
ResultOfSetTypeFromSField ret = noTemplate;
|
||||
|
||||
SOTemplate const* elements =
|
||||
InnerObjectFormats::getInstance ().findSOTemplateBySField (sField);
|
||||
if (elements)
|
||||
{
|
||||
ret = setType (*elements) ? typeIsSet : typeSetFail;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool STObject::isValidForType ()
|
||||
{
|
||||
auto it = v_.begin();
|
||||
@@ -219,6 +234,13 @@ bool STObject::set (SerialIter& sit, int depth)
|
||||
|
||||
// Unflatten the field
|
||||
v_.emplace_back(sit, fn);
|
||||
|
||||
// If the object type has a known SOTemplate then set it.
|
||||
STObject* const obj = dynamic_cast <STObject*> (&(v_.back().get()));
|
||||
if (obj && (obj->setTypeFromSField (fn) == typeSetFail))
|
||||
{
|
||||
throw std::runtime_error ("field deserialization error");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user