From 649e1fda37c3614c5d00bc04b8ea220dc0768cf1 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 26 Mar 2012 11:43:26 -0700 Subject: [PATCH] Final non-breaking changes to serializer classes. Extra set helper functions. --- src/SerializedObject.cpp | 112 ++++++++++++++++++++++++++++++++++ src/SerializedObject.h | 9 +++ src/SerializedTransaction.cpp | 3 +- src/SerializedTransaction.h | 18 +++++- 4 files changed, 139 insertions(+), 3 deletions(-) diff --git a/src/SerializedObject.cpp b/src/SerializedObject.cpp index ac00f503f..cce8db74c 100644 --- a/src/SerializedObject.cpp +++ b/src/SerializedObject.cpp @@ -343,3 +343,115 @@ std::vector STObject::getValueFieldTL(SOE_Field field) const if(!cf) throw std::runtime_error("Wrong field type"); return cf->getValue(); } + +void STObject::setValueFieldU8(SOE_Field field, unsigned char v) +{ + SerializedType* rf=getPField(field); + if(!rf) throw std::runtime_error("Field not found"); + SerializedTypeID id=rf->getType(); + if(id==STI_OBJECT) + { + makeFieldPresent(field); + rf=getPField(field); + id=rf->getType(); + } + STUInt8* cf=dynamic_cast(rf); + if(!cf) throw(std::runtime_error("Wrong field type")); + cf->setValue(v); +} + +void STObject::setValueFieldU16(SOE_Field field, uint16 v) +{ + SerializedType* rf=getPField(field); + if(!rf) throw std::runtime_error("Field not found"); + SerializedTypeID id=rf->getType(); + if(id==STI_OBJECT) + { + makeFieldPresent(field); + rf=getPField(field); + id=rf->getType(); + } + STUInt16* cf=dynamic_cast(rf); + if(!cf) throw(std::runtime_error("Wrong field type")); + cf->setValue(v); +} + +void STObject::setValueFieldU32(SOE_Field field, uint32 v) +{ + SerializedType* rf=getPField(field); + if(!rf) throw std::runtime_error("Field not found"); + SerializedTypeID id=rf->getType(); + if(id==STI_OBJECT) + { + makeFieldPresent(field); + rf=getPField(field); + id=rf->getType(); + } + STUInt32* cf=dynamic_cast(rf); + if(!cf) throw(std::runtime_error("Wrong field type")); + cf->setValue(v); +} + +void STObject::setValueFieldU64(SOE_Field field, uint64 v) +{ + SerializedType* rf=getPField(field); + if(!rf) throw std::runtime_error("Field not found"); + SerializedTypeID id=rf->getType(); + if(id==STI_OBJECT) + { + makeFieldPresent(field); + rf=getPField(field); + id=rf->getType(); + } + STUInt64* cf=dynamic_cast(rf); + if(!cf) throw(std::runtime_error("Wrong field type")); + cf->setValue(v); +} + +void STObject::setValueFieldH160(SOE_Field field, const uint160& v) +{ + SerializedType* rf=getPField(field); + if(!rf) throw std::runtime_error("Field not found"); + SerializedTypeID id=rf->getType(); + if(id==STI_OBJECT) + { + makeFieldPresent(field); + rf=getPField(field); + id=rf->getType(); + } + STHash160* cf=dynamic_cast(rf); + if(!cf) throw(std::runtime_error("Wrong field type")); + cf->setValue(v); +} + +void STObject::setValueFieldVL(SOE_Field field, const std::vector& v) +{ + SerializedType* rf=getPField(field); + if(!rf) throw std::runtime_error("Field not found"); + SerializedTypeID id=rf->getType(); + if(id==STI_OBJECT) + { + makeFieldPresent(field); + rf=getPField(field); + id=rf->getType(); + } + STVariableLength* cf=dynamic_cast(rf); + if(!cf) throw(std::runtime_error("Wrong field type")); + cf->setValue(v); +} + +void STObject::setValueFieldTL(SOE_Field field, const std::vector& v) +{ + SerializedType* rf=getPField(field); + if(!rf) throw std::runtime_error("Field not found"); + SerializedTypeID id=rf->getType(); + if(id==STI_OBJECT) + { + makeFieldPresent(field); + rf=getPField(field); + id=rf->getType(); + } + STTaggedList* cf=dynamic_cast(rf); + if(!cf) throw(std::runtime_error("Wrong field type")); + cf->setValue(v); +} diff --git a/src/SerializedObject.h b/src/SerializedObject.h index ff631acc6..0dacd15f3 100644 --- a/src/SerializedObject.h +++ b/src/SerializedObject.h @@ -93,6 +93,15 @@ public: std::vector getValueFieldVL(SOE_Field field) const; std::vector getValueFieldTL(SOE_Field field) const; + void setValueFieldU8(SOE_Field field, unsigned char); + void setValueFieldU16(SOE_Field field, uint16); + void setValueFieldU32(SOE_Field field, uint32); + void setValueFieldU64(SOE_Field field, uint64); + void setValueFieldH160(SOE_Field field, const uint160&); + void setValueFieldH256(SOE_Field field, const uint256&); + void setValueFieldVL(SOE_Field field, const std::vector&); + void setValueFieldTL(SOE_Field field, const std::vector&); + bool isFieldPresent(SOE_Field field) const; void makeFieldPresent(SOE_Field field); void makeFieldAbsent(SOE_Field field); diff --git a/src/SerializedTransaction.cpp b/src/SerializedTransaction.cpp index 24117a455..c848efeee 100644 --- a/src/SerializedTransaction.cpp +++ b/src/SerializedTransaction.cpp @@ -16,7 +16,8 @@ SerializedTransaction::SerializedTransaction(TransactionType type) SerializedTransaction::SerializedTransaction(SerializerIterator& sit, int length) { - if(length==0) length=sit.get32(); + if(length==-1) length=sit.getBytesLeft(); + else if(length==0) length=sit.get32(); if( (lengthTransactionMaxLen) ) throw(std::runtime_error("Transaction length invalid")); diff --git a/src/SerializedTransaction.h b/src/SerializedTransaction.h index 23e2763b9..973909e1d 100644 --- a/src/SerializedTransaction.h +++ b/src/SerializedTransaction.h @@ -3,12 +3,17 @@ #include +#include + #include "uint256.h" #include "SerializedObject.h" #include "TransactionFormats.h" class SerializedTransaction : public STObject { +public: + typedef boost::shared_ptr pointer; + protected: TransactionType type; STVariableLength mSignature; @@ -16,7 +21,7 @@ protected: TransactionFormat* mFormat; public: - SerializedTransaction(SerializerIterator&, int length); + SerializedTransaction(SerializerIterator& sit, int length); // -1=all remaining, 0=get from sit SerializedTransaction(TransactionType type); // STObject functions @@ -65,7 +70,16 @@ public: uint256 getITFieldH256(SOE_Field field) const { return mInnerTxn.getValueFieldH256(field); } std::vector getITFieldVL(SOE_Field field) const { return mInnerTxn.getValueFieldVL(field); } std::vector getITFieldTL(SOE_Field field) const { return mInnerTxn.getValueFieldTL(field); } - + void SetITFieldU8(SOE_Field field, unsigned char v) { return mInnerTxn.setValueFieldU8(field, v); } + void SetITFieldU16(SOE_Field field, uint16 v) { return mInnerTxn.setValueFieldU16(field, v); } + void SetITFieldU32(SOE_Field field, uint32 v) { return mInnerTxn.setValueFieldU32(field, v); } + void SetITFieldU64(SOE_Field field, uint32 v) { return mInnerTxn.setValueFieldU64(field, v); } + void SetITFieldH160(SOE_Field field, const uint160& v) { return mInnerTxn.setValueFieldH160(field, v); } + void SetITFieldH256(SOE_Field field, const uint256& v) { return mInnerTxn.setValueFieldH256(field, v); } + void SetITFieldVL(SOE_Field field, const std::vector& v) + { return mInnerTxn.setValueFieldVL(field, v); } + void SetITFieldTL(SOE_Field field, const std::vector& v) + { return mInnerTxn.setValueFieldTL(field, v); } // optional field functions bool getITFieldPresent(SOE_Field field) const;