fixed a few bugs in new serialization

This commit is contained in:
csoler 2017-04-05 18:09:45 +02:00
parent 5b3e488b42
commit a941136c04
4 changed files with 14 additions and 16 deletions

View File

@ -92,7 +92,7 @@ bool DistantChatService::handleOutgoingItem(RsChatItem *item)
uint32_t size = RsChatSerialiser().size(item) ; uint32_t size = RsChatSerialiser().size(item) ;
RsTemporaryMemory mem(size) ; RsTemporaryMemory mem(size) ;
if(!RsChatSerialiser().serialise(item,mem,size)) if(!RsChatSerialiser().serialise(item,mem,&size))
{ {
std::cerr << "(EE) serialisation error. Something's really wrong!" << std::endl; std::cerr << "(EE) serialisation error. Something's really wrong!" << std::endl;
return false; return false;
@ -152,7 +152,7 @@ bool DistantChatService::acceptDataFromPeer(const RsGxsId& gxs_id,const RsGxsTun
uint32_t size = RsChatSerialiser().size(item) ; uint32_t size = RsChatSerialiser().size(item) ;
RsTemporaryMemory mem(size) ; RsTemporaryMemory mem(size) ;
if(!RsChatSerialiser().serialise(item,mem,size)) if(!RsChatSerialiser().serialise(item,mem,&size))
{ {
std::cerr << "(EE) serialisation error. Something's really wrong!" << std::endl; std::cerr << "(EE) serialisation error. Something's really wrong!" << std::endl;
return false; return false;
@ -218,7 +218,7 @@ void DistantChatService::receiveData(const RsGxsTunnelService::RsGxsTunnelId &tu
contact.from_id = tinfo.source_gxs_id ; contact.from_id = tinfo.source_gxs_id ;
} }
RsItem *item = RsChatSerialiser().deserialise(data,data_size) ; RsItem *item = RsChatSerialiser().deserialise(data,&data_size) ;
if(item != NULL) if(item != NULL)
{ {

View File

@ -219,6 +219,7 @@ uint32_t RsSerialType::size(RsItem *)
bool RsSerialType::serialise(RsItem */*item*/, void */*data*/, uint32_t */*size*/) bool RsSerialType::serialise(RsItem */*item*/, void */*data*/, uint32_t */*size*/)
{ {
std::cerr << "(EE) Empty method called for missing serialize() method in serializer class " << typeid(this).name() << std::endl;
#ifdef RSSERIAL_DEBUG #ifdef RSSERIAL_DEBUG
std::cerr << "RsSerialType::serialise()" << std::endl; std::cerr << "RsSerialType::serialise()" << std::endl;
#endif #endif

View File

@ -1,10 +1,8 @@
#pragma once
#include "util/rsprint.h" #include "util/rsprint.h"
#include "serialization/rsserializer.h" #include "serialization/rsserializer.h"
#include "serialization/rstypeserializer.h" #include "serialization/rstypeserializer.h"
RsItem *RsSerializer::deserialise(const uint8_t *data,uint32_t size) RsItem *RsSerializer::deserialise(void *data, uint32_t *size)
{ {
uint32_t rstype = getRsItemId(const_cast<void*>((const void*)data)) ; uint32_t rstype = getRsItemId(const_cast<void*>((const void*)data)) ;
@ -13,11 +11,11 @@ RsItem *RsSerializer::deserialise(const uint8_t *data,uint32_t size)
if(!item) if(!item)
{ {
std::cerr << "(EE) cannot deserialise: unknown item type " << std::hex << rstype << std::dec << std::endl; std::cerr << "(EE) cannot deserialise: unknown item type " << std::hex << rstype << std::dec << std::endl;
std::cerr << "(EE) Data is: " << RsUtil::BinToHex(data,std::min(50u,size)) << ((size>50)?"...":"") << std::endl; std::cerr << "(EE) Data is: " << RsUtil::BinToHex(static_cast<uint8_t*>(data),std::min(50u,*size)) << ((*size>50)?"...":"") << std::endl;
return NULL ; return NULL ;
} }
SerializeContext ctx(const_cast<uint8_t*>(data),size); SerializeContext ctx(const_cast<uint8_t*>(static_cast<uint8_t*>(data)),*size);
ctx.mOffset = 8 ; ctx.mOffset = 8 ;
item->serial_process(RsItem::DESERIALIZE, ctx) ; item->serial_process(RsItem::DESERIALIZE, ctx) ;
@ -29,13 +27,13 @@ RsItem *RsSerializer::deserialise(const uint8_t *data,uint32_t size)
return NULL ; return NULL ;
} }
bool RsSerializer::serialise(RsItem *item,uint8_t *const data,uint32_t size) bool RsSerializer::serialise(RsItem *item,void *data,uint32_t *size)
{ {
SerializeContext ctx(data,0); SerializeContext ctx(static_cast<uint8_t*>(data),0);
uint32_t tlvsize = this->size(item) ; uint32_t tlvsize = this->size(item) ;
if(tlvsize > size) if(tlvsize > *size)
throw std::runtime_error("Cannot serialise: not enough room.") ; throw std::runtime_error("Cannot serialise: not enough room.") ;
if(!setRsItemHeader(data, tlvsize, item->PacketId(), tlvsize)) if(!setRsItemHeader(data, tlvsize, item->PacketId(), tlvsize))

View File

@ -12,7 +12,7 @@
class RsSerializer: public RsSerialType class RsSerializer: public RsSerialType
{ {
public: public:
RsSerializer(uint16_t service_id) : RsSerialType(service_id) {} RsSerializer(uint16_t service_id) : RsSerialType(RS_PKT_VERSION_SERVICE,service_id) {}
/*! create_item /*! create_item
* should be overloaded to create the correct type of item depending on the data * should be overloaded to create the correct type of item depending on the data
@ -22,11 +22,10 @@ class RsSerializer: public RsSerialType
return NULL ; return NULL ;
} }
// The following functions *should not* be overloaded. // The following functions overload RsSerialType. They *should not* need to be further overloaded.
// They are kept public in order to allow them to be called if needed.
RsItem *deserialise(const uint8_t *data,uint32_t size) ; RsItem *deserialise(void *data,uint32_t *size) ;
bool serialise(RsItem *item,uint8_t *const data,uint32_t size) ; bool serialise(RsItem *item,void *data,uint32_t *size) ;
uint32_t size(RsItem *item) ; uint32_t size(RsItem *item) ;
void print(RsItem *item) ; void print(RsItem *item) ;
}; };