Esempio n. 1
0
std::shared_ptr<MyBuffer> ProtobufCodec::Encode(const CMessage& message)
{
	std::shared_ptr<MyBuffer> ptrBuffer(new MyBuffer());
	assert(0 == ptrBuffer->readableBytes());
	const std::string& typeName = message.GetTypeName();

	int32_t nameLen = static_cast<int32_t>(typeName.size() + 1);//'\0'

	ptrBuffer->appendUint32(nameLen);
	ptrBuffer->append(typeName.c_str(), nameLen);
	//消息内容
	size_t byte_size = message.ByteSize();
	//ensure memory enough
	ptrBuffer->ensureWritableBytes(byte_size);
	//write data
	message.SerializeWithCachedSizesToArray(reinterpret_cast<uint8_t*>(ptrBuffer->beginWrite()));
	ptrBuffer->commit(byte_size);//move write index

	//检验和
	uint32_t checkSum = adler32(1, reinterpret_cast<const Bytef*>(ptrBuffer->peek()), ptrBuffer->readableBytes());

	ptrBuffer->appendUint32(checkSum);
	assert(ptrBuffer->readableBytes() == sizeof(nameLen)+nameLen + byte_size + sizeof(checkSum));
	//消息长度
	int32_t len = htonl(static_cast<int32_t>(ptrBuffer->readableBytes()));
	ptrBuffer->prepend(&len, sizeof(len));
	//delimiter
	ptrBuffer->append("\r\n", 2);
	return ptrBuffer;
}