progress in converting chat items to new serialization

This commit is contained in:
csoler 2017-04-05 10:27:12 +02:00
parent 9438d60609
commit 48688eae3f
4 changed files with 88 additions and 25 deletions

View File

@ -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)
{

View File

@ -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;
};

View File

@ -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)
{

View File

@ -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 */);
};