Exemplo n.º 1
0
// serialize serializes a message. It returns an error if serialization
// failed, or if the message was too big to serialize based on the current
// msgSize. The config lock is held during serialize.
func (fs *FileServer) serialize(m qp.Message) ([]byte, error) {
	var (
		mt  qp.MessageType
		err error
	)

	if mt, err = fs.proto.MessageType(m); err != nil {
		return nil, err
	}

	l := m.EncodedSize() + qp.HeaderSize
	if l > int(fs.msgSize) {
		return nil, errMsgTooBig
	}

	b := make([]byte, l)

	if err = m.Marshal(b[qp.HeaderSize:]); err != nil {
		return nil, err
	}

	binary.LittleEndian.PutUint32(b[0:4], uint32(l))
	b[4] = byte(mt)

	return b, nil
}