mirror of
https://github.com/XRPLF/rippled.git
synced 2025-12-06 17:27:55 +00:00
Merge branch 'master' into unl
This commit is contained in:
150
src/SerializedObject.cpp
Normal file
150
src/SerializedObject.cpp
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
|
||||||
|
#include "SerializedObject.h"
|
||||||
|
|
||||||
|
STUObject::STUObject(SOElement* elem, const char *name) : SerializedType(name)
|
||||||
|
{
|
||||||
|
while(elem->e_id!=STI_DONE)
|
||||||
|
{
|
||||||
|
type.push_back(elem);
|
||||||
|
if( (elem->e_type==SOE_IFFLAG) || (elem->e_type==SOE_IFNFLAG) )
|
||||||
|
giveObject(new STUObject(elem->e_name));
|
||||||
|
else switch(elem->e_id)
|
||||||
|
{
|
||||||
|
case STI_UINT16:
|
||||||
|
giveObject(new STUInt16(elem->e_name));
|
||||||
|
break;
|
||||||
|
case STI_UINT32:
|
||||||
|
giveObject(new STUInt32(elem->e_name));
|
||||||
|
break;
|
||||||
|
case STI_UINT64:
|
||||||
|
giveObject(new STUInt64(elem->e_name));
|
||||||
|
break;
|
||||||
|
case STI_HASH160:
|
||||||
|
giveObject(new STHash160(elem->e_name));
|
||||||
|
break;
|
||||||
|
case STI_HASH256:
|
||||||
|
giveObject(new STHash256(elem->e_name));
|
||||||
|
break;
|
||||||
|
case STI_VL:
|
||||||
|
giveObject(new STVariableLength(elem->e_name));
|
||||||
|
break;
|
||||||
|
case STI_TL:
|
||||||
|
giveObject(new STTaggedList(elem->e_name));
|
||||||
|
break;
|
||||||
|
#if 0
|
||||||
|
case STI_ACCOUNT: // CHECKME: Should an account be variable length?
|
||||||
|
giveObject(new STVariableLength(elem->e_name));
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default: throw(std::runtime_error("invalid transaction element"));
|
||||||
|
}
|
||||||
|
elem++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
STUObject::STUObject(SOElement* elem, SerializerIterator& sit, const char *name) : SerializedType(name)
|
||||||
|
{
|
||||||
|
int flags=-1;
|
||||||
|
while(elem->e_id!=STI_DONE)
|
||||||
|
{
|
||||||
|
type.push_back(elem);
|
||||||
|
bool done=false;
|
||||||
|
if(elem->e_type==SOE_IFFLAG)
|
||||||
|
{
|
||||||
|
assert(flags>=0);
|
||||||
|
if((flags&elem->e_flags)==0) done=true;
|
||||||
|
}
|
||||||
|
else if(elem->e_type==SOE_IFNFLAG)
|
||||||
|
{
|
||||||
|
assert(flags>=0);
|
||||||
|
if((flags&elem->e_flags)!=0) done=true;
|
||||||
|
}
|
||||||
|
else if(elem->e_type==SOE_FLAGS)
|
||||||
|
{
|
||||||
|
assert(elem->e_id==STI_UINT16);
|
||||||
|
flags=sit.get16();
|
||||||
|
giveObject(new STUInt16(elem->e_name, flags));
|
||||||
|
done=true;
|
||||||
|
}
|
||||||
|
if(!done)
|
||||||
|
{
|
||||||
|
switch(elem->e_id)
|
||||||
|
{
|
||||||
|
case STI_UINT16:
|
||||||
|
giveObject(STUInt16::construct(sit, elem->e_name));
|
||||||
|
break;
|
||||||
|
case STI_UINT32:
|
||||||
|
giveObject(STUInt32::construct(sit, elem->e_name));
|
||||||
|
break;
|
||||||
|
case STI_UINT64:
|
||||||
|
giveObject(STUInt64::construct(sit, elem->e_name));
|
||||||
|
break;
|
||||||
|
case STI_HASH160:
|
||||||
|
giveObject(STHash160::construct(sit, elem->e_name));
|
||||||
|
break;
|
||||||
|
case STI_HASH256:
|
||||||
|
giveObject(STHash256::construct(sit, elem->e_name));
|
||||||
|
break;
|
||||||
|
case STI_VL:
|
||||||
|
giveObject(STVariableLength::construct(sit, elem->e_name));
|
||||||
|
break;
|
||||||
|
case STI_TL:
|
||||||
|
giveObject(STTaggedList::construct(sit, elem->e_name));
|
||||||
|
break;
|
||||||
|
#if 0
|
||||||
|
case STI_ACCOUNT: // CHECKME: Should an account be variable length?
|
||||||
|
giveObject(STVariableLength::construct(sit, elem->e_name));
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default: throw(std::runtime_error("invalid transaction element"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elem++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string STUObject::getFullText() const
|
||||||
|
{
|
||||||
|
std::string ret;
|
||||||
|
if(name!=NULL)
|
||||||
|
{
|
||||||
|
ret=name;
|
||||||
|
ret+=" = {";
|
||||||
|
}
|
||||||
|
else ret="{";
|
||||||
|
for(boost::ptr_vector<SerializedType>::const_iterator it=data.begin(), end=data.end(); it!=end; ++it)
|
||||||
|
ret+=it->getFullText();
|
||||||
|
ret+="}";
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int STUObject::getLength() const
|
||||||
|
{
|
||||||
|
int ret=0;
|
||||||
|
for(boost::ptr_vector<SerializedType>::const_iterator it=data.begin(), end=data.end(); it!=end; ++it)
|
||||||
|
ret+=it->getLength();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void STUObject::add(Serializer& s) const
|
||||||
|
{
|
||||||
|
for(boost::ptr_vector<SerializedType>::const_iterator it=data.begin(), end=data.end(); it!=end; ++it)
|
||||||
|
it->add(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string STUObject::getText() const
|
||||||
|
{
|
||||||
|
std::string ret="{";
|
||||||
|
bool first=false;
|
||||||
|
for(boost::ptr_vector<SerializedType>::const_iterator it=data.begin(), end=data.end(); it!=end; ++it)
|
||||||
|
{
|
||||||
|
if(!first)
|
||||||
|
{
|
||||||
|
ret+=", ";
|
||||||
|
first=false;
|
||||||
|
}
|
||||||
|
ret+=it->getText();
|
||||||
|
}
|
||||||
|
ret+="}";
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user