mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-02-04 17:15:31 -05:00
progress in converting chat items to new serialization
This commit is contained in:
parent
9438d60609
commit
48688eae3f
@ -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<uint64_t>(info.id) ;
|
||||
RsTypeSerializer::serial_process<uint64_t>(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<uint32_t>(j,ctx,info.count,"info.count") ;
|
||||
RsTypeSerializer::serial_process<uint32_t>(j,ctx,info.flags.toUInt32(),"info.flags") ;
|
||||
RsTypeSerializer::serial_process<ChatLobbyFlags>(j,ctx,info.flags,"info.flags") ;
|
||||
}
|
||||
|
||||
void RsChatLobbyListItem::serial_process(RsItem::SerializeJob j,SerializeContext& ctx)
|
||||
{
|
||||
RsTypeSerializer::serial_process<uint32_t>(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<uint32_t>(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<uint32_t>(j,ctx,lobby_flags.toUInt32(),"lobby_flags") ;
|
||||
RsTypeSerializer::serial_process<ChatLobbyFlags>(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<RsTypeSerializer::BinaryDataBlock_ref>(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<RsChatLobbyBouncingObject*>(this)->serial_process(RsItem::SERIALIZE,ctx) ;
|
||||
const_cast<RsChatLobbyBouncingObject*>(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<RsChatLobbyBouncingObject*>(this)->serial_process(RsItem::SERIALIZE,ctx) ;
|
||||
const_cast<RsChatLobbyBouncingObject*>(this)->serial_process(RsItem::SERIALIZE,ctx,false) ;
|
||||
|
||||
if(ctx.mSize != ctx.mOffset)
|
||||
{
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -1,5 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <typeinfo>
|
||||
|
||||
#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<BinaryDataBlock_ref*>(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<std::string&,uint16_t> 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<typename T>
|
||||
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<typename T>
|
||||
static void serial_process(RsItem::SerializeJob j,SerializeContext& ctx,std::vector<T>& v,const std::string& member_name)
|
||||
{
|
||||
switch(j)
|
||||
{
|
||||
case RsItem::SIZE_ESTIMATE:
|
||||
{
|
||||
ctx.mOffset += 4 ;
|
||||
for(uint32_t i=0;i<v.size();++i)
|
||||
serial_process(j,ctx,v[i],member_name) ;
|
||||
}
|
||||
break ;
|
||||
|
||||
case RsItem::DESERIALIZE:
|
||||
{ uint32_t n=0 ;
|
||||
serial_process(j,ctx,n,"temporary size") ;
|
||||
|
||||
v.resize(n) ;
|
||||
for(uint32_t i=0;i<v.size();++i)
|
||||
serial_process(j,ctx,v[i],member_name) ;
|
||||
}
|
||||
break ;
|
||||
|
||||
case RsItem::SERIALIZE:
|
||||
{
|
||||
uint32_t n=v.size();
|
||||
serial_process(j,ctx,n,"temporary size") ;
|
||||
for(uint32_t i=0;i<v.size();++i)
|
||||
serial_process(j,ctx,v[i],member_name) ;
|
||||
}
|
||||
break ;
|
||||
|
||||
case RsItem::PRINT:
|
||||
{
|
||||
if(v.empty())
|
||||
std::cerr << " Empty array"<< std::endl;
|
||||
else
|
||||
std::cerr << " Array of \"" << typeid(v[0]).name() << "\"" << " with " << v.size() << " elements:";
|
||||
for(uint32_t i=0;i<v.size();++i)
|
||||
{
|
||||
std::cerr << " " ;
|
||||
serial_process(j,ctx,v[i],member_name) ;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
template<class T> static bool serialize (uint8_t data[], uint32_t size, uint32_t &offset, const T& member);
|
||||
template<class T> static bool deserialize(const uint8_t data[], uint32_t size, uint32_t &offset, T& member);
|
||||
template<class T> static uint32_t serial_size(const T& /* member */);
|
||||
template<class T> static void print_data(const std::string& name,const T& /* member */);
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user