Exemple #1
0
			static void serialize(Type &map, ContentSerializer &serializer)
			{
				serializer.write_map(map, [&](color_t key, typename Inner::Type *value) {
						color_t &color = serializer.write_object<color_t>();

						color = key;

						REINDEER_SCOPE(Map) serialize_inner(*value, serializer);
				});
			}
////////////////////////////////////////////////////////////////////////////////
////
//// Payload classes
////
////////////////////////////////////////////////////////////////////////////////
vector<uint8_t> Payload::serialize(uint32_t magic_word) const
{
   //serialize payload
   auto payload_size = serialize_inner(nullptr);
   
   vector<uint8_t> msg;
   msg.resize(MESSAGE_HEADER_LEN + payload_size);
   if (payload_size > 0)
      serialize_inner(&msg[MESSAGE_HEADER_LEN]);

   //magic word
   uint8_t* ptr = &msg[0];
   uint32_t* magicword = (uint32_t*)(ptr + MAGIC_WORD_OFFSET);
   *magicword = magic_word;

   //message type
   auto&& type = typeStr();
   char* msgtype = (char*)(ptr + MESSAGE_TYPE_OFFSET);
   memset(msgtype, 0, MESSAGE_TYPE_LEN);
   memcpy(msgtype, type.c_str(), type.size());

   //length
   uint32_t msglen = payload_size;
   uint32_t* msglenptr = (uint32_t*)(ptr + PAYLOAD_LENGTH_OFFSET);
   *msglenptr = msglen;

   //checksum
   uint8_t* payloadptr = nullptr;
   if (payload_size > 0)
      payloadptr = &msg[MESSAGE_HEADER_LEN];
   BinaryDataRef bdr(payloadptr, payload_size);
   auto&& hash = BtcUtils::getHash256(bdr);
   uint32_t* checksum = (uint32_t*)hash.getPtr();
   uint32_t* checksumptr = (uint32_t*)(ptr + CHECKSUM_OFFSET);
   *checksumptr = *checksum;

   return msg;
}