bool STObject::setType (const SOTemplate& type) { boost::ptr_vector<SerializedType> newData (type.peek ().size ()); bool valid = true; mType = &type; BOOST_FOREACH (const SOElement * elem, type.peek ()) { bool match = false; for (boost::ptr_vector<SerializedType>::iterator it = mData.begin (); it != mData.end (); ++it) if (it->getFName () == elem->e_field) { // matching entry, move to new vector match = true; if ((elem->flags == SOE_DEFAULT) && it->isDefault ()) { WriteLog (lsWARNING, STObject) << "setType( " << getFName ().getName () << ") invalid default " << elem->e_field.fieldName; valid = false; } newData.push_back (mData.release (it).release ()); // CAUTION: This renders 'it' invalid break; } if (!match) { // no match found if (elem->flags == SOE_REQUIRED) { WriteLog (lsWARNING, STObject) << "setType( " << getFName ().getName () << ") invalid missing " << elem->e_field.fieldName; valid = false; } newData.push_back (makeNonPresentObject (elem->e_field).release ()); } } BOOST_FOREACH (const SerializedType & t, mData) { // Anything left over must be discardable if (!t.getFName ().isDiscardable ()) { WriteLog (lsWARNING, STObject) << "setType( " << getFName ().getName () << ") invalid leftover " << t.getFName ().getName (); valid = false; } } mData.swap (newData); return valid; }
bool STObject::setType (const SOTemplate& type) { bool valid = true; mType = &type; decltype(v_) v; v.reserve(type.size()); for (auto const& e : type.all()) { auto const iter = std::find_if( v_.begin(), v_.end(), [&](detail::STVar const& b) { return b.get().getFName() == e->e_field; }); if (iter != v_.end()) { if ((e->flags == SOE_DEFAULT) && iter->get().isDefault()) { WriteLog (lsWARNING, STObject) << "setType( " << getFName ().getName () << " ) invalid default " << e->e_field.fieldName; valid = false; } v.emplace_back(std::move(*iter)); v_.erase(iter); } else { if (e->flags == SOE_REQUIRED) { WriteLog (lsWARNING, STObject) << "setType( " << getFName ().getName () << " ) invalid missing " << e->e_field.fieldName; valid = false; } v.emplace_back(detail::nonPresentObject, e->e_field); } } for (auto const& e : v_) { // Anything left over in the object must be discardable if (! e->getFName().isDiscardable()) { WriteLog (lsWARNING, STObject) << "setType( " << getFName ().getName () << " ) invalid leftover " << e->getFName ().getName (); valid = false; } } // Swap the template matching data in for the old data, // freeing any leftover junk v_.swap(v); return valid; }
void STObject::set (const SOTemplate& type) { v_.clear(); v_.reserve(type.size()); mType = &type; for (auto const& elem : type.all()) { if (elem->flags != SOE_REQUIRED) v_.emplace_back(detail::nonPresentObject, elem->e_field); else v_.emplace_back(detail::defaultObject, elem->e_field); } }
STObject::STObject (SOTemplate const& type, SerialIter & sit, SField const& name) : STBase (name) { v_.reserve(type.size()); set (sit); setType (type); }
void STObject::set (const SOTemplate& type) { mData.clear (); mType = &type; BOOST_FOREACH (const SOElement * elem, type.peek ()) { if (elem->flags != SOE_REQUIRED) giveObject (makeNonPresentObject (elem->e_field)); else giveObject (makeDefaultObject (elem->e_field)); } }
void STObject::set (const SOTemplate& type) { mData.clear (); mType = &type; for (SOTemplate::value_type const& elem : type.peek ()) { if (elem->flags != SOE_REQUIRED) giveObject (makeNonPresentObject (elem->e_field)); else giveObject (makeDefaultObject (elem->e_field)); } }
FormatHolder () { format.push_back (SOElement (sfFlags, SOE_REQUIRED)); format.push_back (SOElement (sfLedgerHash, SOE_REQUIRED)); format.push_back (SOElement (sfLedgerSequence, SOE_OPTIONAL)); format.push_back (SOElement (sfCloseTime, SOE_OPTIONAL)); format.push_back (SOElement (sfLoadFee, SOE_OPTIONAL)); format.push_back (SOElement (sfAmendments, SOE_OPTIONAL)); format.push_back (SOElement (sfBaseFee, SOE_OPTIONAL)); format.push_back (SOElement (sfReserveBase, SOE_OPTIONAL)); format.push_back (SOElement (sfReserveIncrement, SOE_OPTIONAL)); format.push_back (SOElement (sfSigningTime, SOE_REQUIRED)); format.push_back (SOElement (sfSigningPubKey, SOE_REQUIRED)); format.push_back (SOElement (sfSignature, SOE_OPTIONAL)); format.push_back (SOElement (sfConsensusHash, SOE_OPTIONAL)); format.push_back (SOElement (sfCookie, SOE_OPTIONAL)); }
void testSerialization () { testcase ("serialization"); unexpected (sfGeneric.isUseful (), "sfGeneric must not be useful"); SField const& sfTestVL = SField::getField (STI_VL, 255); SField const& sfTestH256 = SField::getField (STI_HASH256, 255); SField const& sfTestU32 = SField::getField (STI_UINT32, 255); SField const& sfTestObject = SField::getField (STI_OBJECT, 255); SOTemplate elements; elements.push_back (SOElement (sfFlags, SOE_REQUIRED)); elements.push_back (SOElement (sfTestVL, SOE_REQUIRED)); elements.push_back (SOElement (sfTestH256, SOE_OPTIONAL)); elements.push_back (SOElement (sfTestU32, SOE_REQUIRED)); STObject object1 (elements, sfTestObject); STObject object2 (object1); unexpected (object1.getSerializer () != object2.getSerializer (), "STObject error 1"); unexpected (object1.isFieldPresent (sfTestH256) || !object1.isFieldPresent (sfTestVL), "STObject error"); object1.makeFieldPresent (sfTestH256); unexpected (!object1.isFieldPresent (sfTestH256), "STObject Error 2"); unexpected (object1.getFieldH256 (sfTestH256) != uint256 (), "STObject error 3"); if (object1.getSerializer () == object2.getSerializer ()) { WriteLog (lsINFO, STObject) << "O1: " << object1.getJson (0); WriteLog (lsINFO, STObject) << "O2: " << object2.getJson (0); fail ("STObject error 4"); } else { pass (); } object1.makeFieldAbsent (sfTestH256); unexpected (object1.isFieldPresent (sfTestH256), "STObject error 5"); unexpected (object1.getFlags () != 0, "STObject error 6"); unexpected (object1.getSerializer () != object2.getSerializer (), "STObject error 7"); STObject copy (object1); unexpected (object1.isFieldPresent (sfTestH256), "STObject error 8"); unexpected (copy.isFieldPresent (sfTestH256), "STObject error 9"); unexpected (object1.getSerializer () != copy.getSerializer (), "STObject error 10"); copy.setFieldU32 (sfTestU32, 1); unexpected (object1.getSerializer () == copy.getSerializer (), "STObject error 11"); for (int i = 0; i < 1000; i++) { Blob j (i, 2); object1.setFieldVL (sfTestVL, j); Serializer s; object1.add (s); SerialIter it (s.slice()); STObject object3 (elements, it, sfTestObject); unexpected (object1.getFieldVL (sfTestVL) != j, "STObject error"); unexpected (object3.getFieldVL (sfTestVL) != j, "STObject error"); } }