diff --git a/libretroshare/src/chat/rschatitems.cc b/libretroshare/src/chat/rschatitems.cc index 165dc94de..41291515e 100644 --- a/libretroshare/src/chat/rschatitems.cc +++ b/libretroshare/src/chat/rschatitems.cc @@ -476,7 +476,7 @@ bool RsChatMsgItem::serialise(void *data, uint32_t& pktsize) } #endif -void RsChatLobbyBouncingObject::serial_process(RsItem::SerializeJob j,SerializeContext& ctx) +void RsChatLobbyBouncingObject::serial_process(RsItem::SerializeJob j, SerializeContext& ctx, bool include_signature) { RsTypeSerializer::TlvString tt(nick,TLV_TYPE_STR_NAME) ; @@ -484,7 +484,7 @@ void RsChatLobbyBouncingObject::serial_process(RsItem::SerializeJob j,SerializeC RsTypeSerializer::serial_process(j,ctx,msg_id ,"msg_id") ; RsTypeSerializer::serial_process(j,ctx,tt ,"nick") ; - if(!(ctx.mFlags & RS_CHAT_SERIALIZER_FLAGS_NO_SIGNATURE)) + if(include_signature) RsTypeSerializer::serial_process(j,ctx,signature,"signature") ; } @@ -494,7 +494,7 @@ void RsChatLobbyMsgItem::serial_process(RsItem::SerializeJob j,SerializeContext& RsTypeSerializer::serial_process(j,ctx,parent_msg_id,"parent_msg_id") ; - RsChatLobbyBouncingObject::serial_process(j,ctx) ; + RsChatLobbyBouncingObject::serial_process(j,ctx,true) ; } #ifdef TO_BE_REMOVED @@ -586,9 +586,9 @@ bool RsChatLobbyListRequestItem::serialise(void *data, uint32_t& pktsize) } #endif -template<> void RsTypeSerializer::serial_process(RsItem::SerializeJob j,SerializeContext& ctx,VisibleChatLobbyInfo& info) +template<> void RsTypeSerializer::serial_process(RsItem::SerializeJob j,SerializeContext& ctx,VisibleChatLobbyInfo& info,const std::string& name) { - RsTypeSerializer::serial_process(info.id) ; + RsTypeSerializer::serial_process(j,ctx,info.id,"info.id") ; TlvString tt1(info.name ,TLV_TYPE_STR_NAME) ; TlvString tt2(info.topic,TLV_TYPE_STR_NAME) ; @@ -596,12 +596,12 @@ template<> void RsTypeSerializer::serial_process(RsItem::SerializeJob j,Serializ RsTypeSerializer::serial_process(j,ctx,info.name,"info.name") ; RsTypeSerializer::serial_process(j,ctx,info.topic,"info.topic") ; RsTypeSerializer::serial_process(j,ctx,info.count,"info.count") ; - RsTypeSerializer::serial_process(j,ctx,info.flags.toUInt32(),"info.flags") ; + RsTypeSerializer::serial_process(j,ctx,info.flags,"info.flags") ; } void RsChatLobbyListItem::serial_process(RsItem::SerializeJob j,SerializeContext& ctx) { - RsTypeSerializer::serial_process(j,ctx,lobbies,"lobbies") ; + RsTypeSerializer::serial_process(j,ctx,lobbies,"lobbies") ; } #ifdef TO_BE_REMOVED @@ -644,7 +644,7 @@ void RsChatLobbyEventItem::serial_process(RsItem::SerializeJob j,SerializeContex RsTypeSerializer::serial_process (j,ctx,string1,"string1") ; RsTypeSerializer::serial_process(j,ctx,sendTime,"sendTime") ; - RsChatLobbyBouncingObject::serial_process(j,ctx,!(ctx.mFlags & RS_CHAT_SERIALIZER_FLAGS_NO_SIGNATURE)); + RsChatLobbyBouncingObject::serial_process(j,ctx,true) ; } #ifdef TO_BE_REMOVED @@ -781,7 +781,7 @@ void RsChatLobbyInviteItem::serial_process(RsItem::SerializeJob j,SerializeConte RsTypeSerializer::TlvString s(lobby_name,TLV_TYPE_STR_NAME) ; RsTypeSerializer::serial_process(j,ctx,s,"lobby_name") ; - RsTypeSerializer::serial_process(j,ctx,lobby_flags.toUInt32(),"lobby_flags") ; + RsTypeSerializer::serial_process(j,ctx,lobby_flags,"lobby_flags") ; } #ifdef TO_BE_REMOVED @@ -963,7 +963,7 @@ bool RsChatStatusItem::serialise(void *data, uint32_t& pktsize) void RsChatAvatarItem::serial_process(RsItem::SerializeJob j,SerializeContext& ctx) { - RsTypeSerializer::serial_process(j,ctx,RsTypeSerializer::BinaryDataBlock_ref(image_data,image_size)) ; + RsTypeSerializer::serial_process(j,ctx,RsTypeSerializer::block_ref(image_data,image_size),"image data") ; } #ifdef TO_BE_REMOVED @@ -1403,9 +1403,8 @@ uint32_t RsChatLobbyBouncingObject::serial_size_no_signature() const SerializeContext ctx(NULL,0); ctx.mOffset = 8; - ctx.mFlags = RS_CHAT_SERIALIZER_FLAGS_NO_SIGNATURE ; - const_cast(this)->serial_process(RsItem::SERIALIZE,ctx) ; + const_cast(this)->serial_process(RsItem::SERIALIZE,ctx,false) ; return ctx.mOffset ; } @@ -1426,9 +1425,8 @@ bool RsChatLobbyBouncingObject::serialize_no_signature(uint8_t *data,uint32_t si } ctx.mOffset = 8; ctx.mSize = tlvsize; - ctx.mFlags = RS_CHAT_SERIALIZER_FLAGS_NO_SIGNATURE ; - const_cast(this)->serial_process(RsItem::SERIALIZE,ctx) ; + const_cast(this)->serial_process(RsItem::SERIALIZE,ctx,false) ; if(ctx.mSize != ctx.mOffset) { diff --git a/libretroshare/src/chat/rschatitems.h b/libretroshare/src/chat/rschatitems.h index 5cdee927e..2440722dd 100644 --- a/libretroshare/src/chat/rschatitems.h +++ b/libretroshare/src/chat/rschatitems.h @@ -145,7 +145,7 @@ protected: // They are called by serial_size() and serialise() from children, but should not overload the serial_size() and // serialise() methods, otherwise the wrong method will be called when serialising from this top level class. - void serial_process(RsItem::SerializeJob j,SerializeContext& ctx); + void serial_process(RsItem::SerializeJob j,SerializeContext& ctx,bool include_signature); virtual uint32_t PacketId() const= 0; }; diff --git a/libretroshare/src/serialization/rsserializer.cc b/libretroshare/src/serialization/rsserializer.cc index b17785038..745dc3521 100644 --- a/libretroshare/src/serialization/rsserializer.cc +++ b/libretroshare/src/serialization/rsserializer.cc @@ -2,6 +2,7 @@ #include "util/rsprint.h" #include "serialization/rsserializer.h" +#include "serialization/rstypeserializer.h" RsItem *RsSerializer::deserialise(const uint8_t *data,uint32_t size) { diff --git a/libretroshare/src/serialization/rstypeserializer.h b/libretroshare/src/serialization/rstypeserializer.h index 348d18375..15bb8c696 100644 --- a/libretroshare/src/serialization/rstypeserializer.h +++ b/libretroshare/src/serialization/rstypeserializer.h @@ -1,5 +1,7 @@ #pragma once +#include + #include "serialiser/rsserial.h" #include "serialiser/rstlvbase.h" @@ -8,31 +10,39 @@ class SerializeContext public: SerializeContext(uint8_t *data,uint32_t size) - : mData(data),mSize(size),mOffset(0),mOk(true),mFlags(0) {} + : mData(data),mSize(size),mOffset(0),mOk(true) {} unsigned char *mData ; uint32_t mSize ; uint32_t mOffset ; bool mOk ; - uint32_t mFlags ; }; class RsTypeSerializer { +protected: + class BinaryDataBlock_ref + { + public: + BinaryDataBlock_ref(unsigned char *_mem,uint32_t& _size) : mem(_mem),size(_size){} + + // This allows to pass Temporary objects as modifiable. This is valid only because all members of this class + // are pointers and references. + + BinaryDataBlock_ref& modifiable() const { return *const_cast(this) ; } + + unsigned char *& mem ; + uint32_t& size ; + }; + + public: // This type should be used to pass a parameter to drive the serialisation if needed. typedef std::pair TlvString; - class BinaryDataBlock_ref - { - public: - BinaryDataBlock_ref(unsigned char *& _mem,uint32_t& _size) : mem(&_mem),size(&_size){} - - unsigned char **mem ; - uint32_t *size ; - }; + static BinaryDataBlock_ref& block_ref(unsigned char *mem,uint32_t& size) { return BinaryDataBlock_ref(mem,size).modifiable() ; } template static void serial_process(RsItem::SerializeJob j,SerializeContext& ctx,T& member,const std::string& member_name) @@ -57,11 +67,65 @@ class RsTypeSerializer } } + // Arrays of stuff + + template + static void serial_process(RsItem::SerializeJob j,SerializeContext& ctx,std::vector& v,const std::string& member_name) + { + switch(j) + { + case RsItem::SIZE_ESTIMATE: + { + ctx.mOffset += 4 ; + for(uint32_t i=0;i static bool serialize (uint8_t data[], uint32_t size, uint32_t &offset, const T& member); template static bool deserialize(const uint8_t data[], uint32_t size, uint32_t &offset, T& member); template static uint32_t serial_size(const T& /* member */); template static void print_data(const std::string& name,const T& /* member */); + + };