protected virtual ICommand ReadMessage(StompFrame frame)
    {
        frame.RemoveProperty(PropertyKeys.Transformation);

        var message = new BytesMessage {
            Content = frame.Content
        };

        // Remove any receipt header we might have attached if the outbound command was
        // sent with response required set to true
        frame.RemoveProperty(PropertyKeys.Receipt);

        // Clear any attached content length headers as they aren't needed anymore and can
        // clutter the Message Properties.
        frame.RemoveProperty(PropertyKeys.ContentLength);

        message.Type             = frame.RemoveProperty(PropertyKeys.Type);
        message.Destination      = Destination.ConvertToDestination(frame.RemoveProperty(PropertyKeys.Destination), SkipDestinationNameFormatting);
        message.ReplyTo          = Destination.ConvertToDestination(frame.RemoveProperty(PropertyKeys.ReplyTo), SkipDestinationNameFormatting);
        message.TargetConsumerId = new(frame.RemoveProperty(PropertyKeys.Subscription));
        message.CorrelationId    = frame.RemoveProperty(PropertyKeys.CorrelationId);
        message.MessageId        = new(frame.RemoveProperty(PropertyKeys.MessageId));
        message.Persistent       = StompHelper.ToBool(frame.RemoveProperty(PropertyKeys.Persistent), false);

        // If it came from NMS.Stomp we added this header to ensure its reported on the
        // receiver side.
        if (frame.HasProperty(PropertyKeys.NmsxDeliveryMode))
        {
            message.Persistent = StompHelper.ToBool(frame.RemoveProperty(PropertyKeys.NmsxDeliveryMode), false);
        }

        if (frame.HasProperty(PropertyKeys.Priority))
        {
            message.Priority = Byte.Parse(frame.RemoveProperty(PropertyKeys.Priority));
        }

        if (frame.HasProperty(PropertyKeys.TimeStamp))
        {
            message.Timestamp = Int64.Parse(frame.RemoveProperty(PropertyKeys.TimeStamp));
        }

        if (frame.HasProperty(PropertyKeys.Expires))
        {
            message.Expiration = Int64.Parse(frame.RemoveProperty(PropertyKeys.Expires));
        }

        if (frame.RemoveProperty(PropertyKeys.Redelivered) != null)
        {
            message.RedeliveryCounter = 1;
        }

        // now lets add the generic headers
        foreach (var key in frame.Properties.Keys)
        {
            var value = frame.Properties[key];
            message.Headers[key] = value;
        }

        return(new MessageDispatch(message.TargetConsumerId, message.Destination, message, message.RedeliveryCounter));
    }
    protected virtual ICommand ReadConnected(StompFrame frame)
    {
        _remoteWireFormatInfo = new();

        if (frame.HasProperty(PropertyKeys.Version))
        {
            _remoteWireFormatInfo.Version = Single.Parse(frame.RemoveProperty(PropertyKeys.Version), CultureInfo.InvariantCulture);
            if (_remoteWireFormatInfo.Version > 1.0f)
            {
                _encodeHeaders = true;
            }

            if (frame.HasProperty(PropertyKeys.Session))
            {
                _remoteWireFormatInfo.Session = frame.RemoveProperty(PropertyKeys.Session);
            }

            if (frame.HasProperty(PropertyKeys.HartBeat))
            {
                var hearBeats = frame.RemoveProperty(PropertyKeys.HartBeat)
                                .Split(",".ToCharArray());
                if (hearBeats.Length != 2)
                {
                    throw new IoException("Malformed heartbeat property in Connected Frame.");
                }

                _remoteWireFormatInfo.WriteCheckInterval = Int32.Parse(hearBeats[0]
                                                                       .Trim());
                _remoteWireFormatInfo.ReadCheckInterval = Int32.Parse(hearBeats[1]
                                                                      .Trim());
            }
        }
        else
        {
            _remoteWireFormatInfo.ReadCheckInterval  = 0;
            _remoteWireFormatInfo.WriteCheckInterval = 0;
            _remoteWireFormatInfo.Version            = 1.0f;
        }

        if (_connectedResponseId != -1)
        {
            var answer = new Response {
                CorrelationId = _connectedResponseId
            };
            SendCommand(answer);
            _connectedResponseId = -1;
        }
        else
        {
            throw new IoException("Received Connected Frame without a set Response Id for it.");
        }

        return(_remoteWireFormatInfo);
    }