//------------------------------------------------------------------------------ /* Copyright (c) 2011-2013, OpenCoin, Inc. */ //============================================================================== PackedMessage::PackedMessage (::google::protobuf::Message const& message, int type) { unsigned const messageBytes = message.ByteSize (); assert (messageBytes != 0); mBuffer.resize (kHeaderBytes + messageBytes); encodeHeader (messageBytes, type); if (messageBytes != 0) { message.SerializeToArray (&mBuffer [PackedMessage::kHeaderBytes], messageBytes); #ifdef BEAST_DEBUG // std::cerr << "PackedMessage: type=" << type << ", datalen=" << msg_size << std::endl; #endif } } bool PackedMessage::operator== (PackedMessage const& other) const { return mBuffer == other.mBuffer; } unsigned PackedMessage::getLength (std::vector const& buf) { unsigned result; if (buf.size () >= PackedMessage::kHeaderBytes) { result = buf [0]; result <<= 8; result |= buf [1]; result <<= 8; result |= buf [2]; result <<= 8; result |= buf [3]; } else { result = 0; } return result; } int PackedMessage::getType (std::vector const& buf) { if (buf.size () < PackedMessage::kHeaderBytes) return 0; int ret = buf[4]; ret <<= 8; ret |= buf[5]; return ret; } void PackedMessage::encodeHeader (unsigned size, int type) { assert (mBuffer.size () >= PackedMessage::kHeaderBytes); mBuffer[0] = static_cast ((size >> 24) & 0xFF); mBuffer[1] = static_cast ((size >> 16) & 0xFF); mBuffer[2] = static_cast ((size >> 8) & 0xFF); mBuffer[3] = static_cast (size & 0xFF); mBuffer[4] = static_cast ((type >> 8) & 0xFF); mBuffer[5] = static_cast (type & 0xFF); }