in src/main/csharp/Protocol/StompWireFormat.cs [275:368]
protected virtual Command ReadMessage(StompFrame frame)
{
Message message = null;
string transformation = frame.RemoveProperty("transformation");
if(frame.HasProperty("content-length"))
{
message = new BytesMessage();
message.Content = frame.Content;
}
else if(transformation == "jms-map-xml")
{
message = new MapMessage(this.mapMarshaler.Unmarshal(frame.Content) as PrimitiveMap);
}
else
{
message = new TextMessage(encoder.GetString(frame.Content, 0, frame.Content.Length));
}
// Remove any receipt header we might have attached if the outbound command was
// sent with response required set to true
frame.RemoveProperty("receipt");
// Clear any attached content length headers as they aren't needed anymore and can
// clutter the Message Properties.
frame.RemoveProperty("content-length");
message.Type = frame.RemoveProperty("type");
message.Destination = Destination.ConvertToDestination(frame.RemoveProperty("destination"));
message.ReplyTo = Destination.ConvertToDestination(frame.RemoveProperty("reply-to"));
message.TargetConsumerId = new ConsumerId(frame.RemoveProperty("subscription"));
message.CorrelationId = frame.RemoveProperty("correlation-id");
message.MessageId = new MessageId(frame.RemoveProperty("message-id"));
message.Persistent = StompHelper.ToBool(frame.RemoveProperty("persistent"), false);
// If it came from NMS.Stomp we added this header to ensure its reported on the
// receiver side.
if(frame.HasProperty("NMSXDeliveryMode"))
{
message.Persistent = StompHelper.ToBool(frame.RemoveProperty("NMSXDeliveryMode"), false);
}
if(frame.HasProperty("priority"))
{
message.Priority = Byte.Parse(frame.RemoveProperty("priority"));
}
if(frame.HasProperty("timestamp"))
{
message.Timestamp = Int64.Parse(frame.RemoveProperty("timestamp"));
}
if(frame.HasProperty("expires"))
{
message.Expiration = Int64.Parse(frame.RemoveProperty("expires"));
}
if(frame.RemoveProperty("redelivered") != null)
{
// We aren't told how many times that the message was redelivered so if it
// is tagged as redelivered we always set the counter to one.
message.RedeliveryCounter = 1;
}
// now lets add the generic headers
foreach(string key in frame.Properties.Keys)
{
Object value = frame.Properties[key];
if(value != null)
{
// lets coerce some standard header extensions
if(key == "JMSXGroupSeq" || key == "NMSXGroupSeq")
{
value = Int32.Parse(value.ToString());
message.Properties["NMSXGroupSeq"] = value;
continue;
}
else if(key == "JMSXGroupID" || key == "NMSXGroupID")
{
message.Properties["NMSXGroupID"] = value;
continue;
}
}
message.Properties[key] = value;
}
MessageDispatch dispatch = new MessageDispatch();
dispatch.Message = message;
dispatch.ConsumerId = message.TargetConsumerId;
dispatch.Destination = message.Destination;
dispatch.RedeliveryCounter = message.RedeliveryCounter;
return dispatch;
}