size_t ProtobufSocketSerializer::serialize( const ::google::protobuf::Message &msg, char *&packet) { size_t size = PROTOBUF_HEADER_LENGTH + (size_t) msg.ByteSize(); packet = new char[size](); ::google::protobuf::io::ArrayOutputStream aos(packet, (int) size); ::google::protobuf::io::CodedOutputStream coded_output(&aos); coded_output.WriteLittleEndian32((google::protobuf::uint32) msg.ByteSize()); msg.SerializeToCodedStream(&coded_output); return size; }
int Packet::Write(ClientService client) { if (null/*null packet*/) return 0; byte buf[6]; google::protobuf::io::ArrayOutputStream raw_output(buf, 1024); google::protobuf::io::CodedOutputStream coded_output(&raw_output); coded_output.WriteRaw((void*)&ServiceId, 1); coded_output.WriteVarint32(MethodId); byte requestIdTemp[2]; requestIdTemp[0] = (byte)(RequestId & 0xff); requestIdTemp[1] = (byte)(RequestId >> 8); coded_output.WriteRaw(requestIdTemp, 2); if (ServiceId != 0xfe) coded_output.WriteVarint64(Unknown); coded_output.WriteVarint32(PayloadLength); client.socket->Send(buf, coded_output.ByteCount()); //DumpBuffer(buf, coded_output.ByteCount()); if (PayloadLength > 0) { client.socket->Send(Payload, PayloadLength); //DumpBuffer(Payload, PayloadLength); } return 0; }