diff options
Diffstat (limited to 'qpid/dotnet/Qpid.Common/Framing')
-rw-r--r-- | qpid/dotnet/Qpid.Common/Framing/BasicContentHeaderProperties.cs | 364 | ||||
-rw-r--r-- | qpid/dotnet/Qpid.Common/Framing/ContentBody.cs | 36 | ||||
-rw-r--r-- | qpid/dotnet/Qpid.Common/Framing/FieldTable.cs | 29 |
3 files changed, 283 insertions, 146 deletions
diff --git a/qpid/dotnet/Qpid.Common/Framing/BasicContentHeaderProperties.cs b/qpid/dotnet/Qpid.Common/Framing/BasicContentHeaderProperties.cs index 75d67fdfb8..0c06a01eb4 100644 --- a/qpid/dotnet/Qpid.Common/Framing/BasicContentHeaderProperties.cs +++ b/qpid/dotnet/Qpid.Common/Framing/BasicContentHeaderProperties.cs @@ -25,144 +25,266 @@ using Qpid.Messaging; namespace Qpid.Framing { - public class BasicContentHeaderProperties : IContentHeaderProperties - { - private static readonly ILog _log = LogManager.GetLogger(typeof(BasicContentHeaderProperties)); + public class BasicContentHeaderProperties : IContentHeaderProperties + { + private static readonly ILog _log = LogManager.GetLogger(typeof(BasicContentHeaderProperties)); - public string ContentType; + private string _contentType; + private string _encoding; + private FieldTable _headers; + private byte _deliveryMode; + private byte _priority; + private string _correlationId; + private long _expiration; + private string _replyTo; + private string _messageId; + private ulong _timestamp; + private string _type; + private string _userId; + private string _appId; + private string _clusterId; - public string Encoding; - public FieldTable Headers; + #region Properties + // + // Properties + // - public byte DeliveryMode; + /// <summary> + /// The MIME Content Type + /// </summary> + public string ContentType + { + get { return _contentType; } + set { _contentType = value; } + } - public byte Priority; + /// <summary> + /// The MIME Content Encoding + /// </summary> + public string Encoding + { + get { return _encoding; } + set { _encoding = value; } + } - public string CorrelationId; + /// <summary> + /// Message headers + /// </summary> + public FieldTable Headers + { + get { return _headers; } + set { _headers = value; } + } - public long Expiration; + /// <summary> + /// Non-persistent (1) or persistent (2) + /// </summary> + public byte DeliveryMode + { + get { return _deliveryMode; } + set { _deliveryMode = value; } + } - public string ReplyTo; + /// <summary> + /// The message priority, 0 to 9 + /// </summary> + public byte Priority + { + get { return _priority; } + set { _priority = value; } + } - public string MessageId; + /// <summary> + /// The application correlation identifier + /// </summary> + public string CorrelationId + { + get { return _correlationId; } + set { _correlationId = value; } + } - public ulong Timestamp; + /// <summary> + /// Message expiration specification + /// </summary> + // TODO: Should be string according to spec + public long Expiration + { + get { return _expiration; } + set { _expiration = value; } + } - public string Type; + /// <summary> + /// The destination to reply to + /// </summary> + public string ReplyTo + { + get { return _replyTo; } + set { _replyTo = value; } + } - public string UserId; + /// <summary> + /// The application message identifier + /// </summary> + public string MessageId + { + get { return _messageId; } + set { _messageId = value; } + } - public string AppId; + /// <summary> + /// The message timestamp + /// </summary> + public ulong Timestamp + { + get { return _timestamp; } + set { _timestamp = value; } + } - public string ClusterId; - - public BasicContentHeaderProperties() - { - } + /// <summary> + /// The message type name + /// </summary> + public string Type + { + get { return _type; } + set { _type = value; } + } - public uint PropertyListSize - { - get - { - return (uint)(EncodingUtils.EncodedShortStringLength(ContentType) + - EncodingUtils.EncodedShortStringLength(Encoding) + - EncodingUtils.EncodedFieldTableLength(Headers) + - 1 + 1 + - EncodingUtils.EncodedShortStringLength(CorrelationId) + - EncodingUtils.EncodedShortStringLength(ReplyTo) + - EncodingUtils.EncodedShortStringLength(String.Format("{0:D}", Expiration)) + - EncodingUtils.EncodedShortStringLength(MessageId) + - 8 + - EncodingUtils.EncodedShortStringLength(Type) + - EncodingUtils.EncodedShortStringLength(UserId) + - EncodingUtils.EncodedShortStringLength(AppId) + - EncodingUtils.EncodedShortStringLength(ClusterId)); - - } - } + /// <summary> + /// The creating user id + /// </summary> + public string UserId + { + get { return _userId; } + set { _userId = value; } + } - public ushort PropertyFlags - { - get - { - int value = 0; - - // for now we just blast in all properties - for (int i = 0; i < 14; i++) - { - value += (1 << (15-i)); - } - return (ushort) value; - } - } - - public void WritePropertyListPayload(ByteBuffer buffer) - { - EncodingUtils.WriteShortStringBytes(buffer, ContentType); - EncodingUtils.WriteShortStringBytes(buffer, Encoding); - EncodingUtils.WriteFieldTableBytes(buffer, Headers); - buffer.Put(DeliveryMode); - buffer.Put(Priority); - EncodingUtils.WriteShortStringBytes(buffer, CorrelationId); - EncodingUtils.WriteShortStringBytes(buffer, ReplyTo); - EncodingUtils.WriteShortStringBytes(buffer, String.Format("{0:D}", Expiration)); - EncodingUtils.WriteShortStringBytes(buffer, MessageId); - buffer.Put(Timestamp); - EncodingUtils.WriteShortStringBytes(buffer, Type); - EncodingUtils.WriteShortStringBytes(buffer, UserId); - EncodingUtils.WriteShortStringBytes(buffer, AppId); - EncodingUtils.WriteShortStringBytes(buffer, ClusterId); - } - - public void PopulatePropertiesFromBuffer(ByteBuffer buffer, ushort propertyFlags) - { - _log.Debug("Property flags: " + propertyFlags); - if ((propertyFlags & (1 << 15)) > 0) - ContentType = EncodingUtils.ReadShortString(buffer); - if ((propertyFlags & (1 << 14)) > 0) - Encoding = EncodingUtils.ReadShortString(buffer); - if ((propertyFlags & (1 << 13)) > 0) - Headers = EncodingUtils.ReadFieldTable(buffer); - if ((propertyFlags & (1 << 12)) > 0) - DeliveryMode = buffer.GetByte(); - if ((propertyFlags & (1 << 11)) > 0) - Priority = buffer.GetByte(); - if ((propertyFlags & (1 << 10)) > 0) - CorrelationId = EncodingUtils.ReadShortString(buffer); - if ((propertyFlags & (1 << 9)) > 0) - ReplyTo = EncodingUtils.ReadShortString(buffer); - if ((propertyFlags & (1 << 8)) > 0) - Expiration = EncodingUtils.ReadLongAsShortString(buffer); - if ((propertyFlags & (1 << 7)) > 0) - MessageId = EncodingUtils.ReadShortString(buffer); - if ((propertyFlags & (1 << 6)) > 0) - Timestamp = buffer.GetUInt64(); - if ((propertyFlags & (1 << 5)) > 0) - Type = EncodingUtils.ReadShortString(buffer); - if ((propertyFlags & (1 << 4)) > 0) - UserId = EncodingUtils.ReadShortString(buffer); - if ((propertyFlags & (1 << 3)) > 0) - AppId = EncodingUtils.ReadShortString(buffer); - if ((propertyFlags & (1 << 2)) > 0) - ClusterId = EncodingUtils.ReadShortString(buffer); - } - - public void SetDeliveryMode(DeliveryMode deliveryMode) - { - if (deliveryMode == Messaging.DeliveryMode.NonPersistent) - { - DeliveryMode = 1; - } - else + /// <summary> + /// The creating application id + /// </summary> + public string AppId + { + get { return _appId; } + set { _appId = value; } + } + + /// <summary> + /// Intra-cluster routing identifier + /// </summary> + public string ClusterId + { + get { return _clusterId; } + set { _clusterId = value; } + } + + #endregion // Properties + + + public BasicContentHeaderProperties() + { + } + + public uint PropertyListSize + { + get + { + return (uint)(EncodingUtils.EncodedShortStringLength(ContentType) + + EncodingUtils.EncodedShortStringLength(Encoding) + + EncodingUtils.EncodedFieldTableLength(Headers) + + 1 + 1 + + EncodingUtils.EncodedShortStringLength(CorrelationId) + + EncodingUtils.EncodedShortStringLength(ReplyTo) + + EncodingUtils.EncodedShortStringLength(String.Format("{0:D}", Expiration)) + + EncodingUtils.EncodedShortStringLength(MessageId) + + 8 + + EncodingUtils.EncodedShortStringLength(Type) + + EncodingUtils.EncodedShortStringLength(UserId) + + EncodingUtils.EncodedShortStringLength(AppId) + + EncodingUtils.EncodedShortStringLength(ClusterId)); + + } + } + + public ushort PropertyFlags + { + get + { + int value = 0; + + // for now we just blast in all properties + for ( int i = 0; i < 14; i++ ) { - DeliveryMode = 2; + value += (1 << (15 - i)); } - } + return (ushort)value; + } + } + + public void WritePropertyListPayload(ByteBuffer buffer) + { + EncodingUtils.WriteShortStringBytes(buffer, ContentType); + EncodingUtils.WriteShortStringBytes(buffer, Encoding); + EncodingUtils.WriteFieldTableBytes(buffer, Headers); + buffer.Put(DeliveryMode); + buffer.Put(Priority); + EncodingUtils.WriteShortStringBytes(buffer, CorrelationId); + EncodingUtils.WriteShortStringBytes(buffer, ReplyTo); + EncodingUtils.WriteShortStringBytes(buffer, String.Format("{0:D}", Expiration)); + EncodingUtils.WriteShortStringBytes(buffer, MessageId); + buffer.Put(Timestamp); + EncodingUtils.WriteShortStringBytes(buffer, Type); + EncodingUtils.WriteShortStringBytes(buffer, UserId); + EncodingUtils.WriteShortStringBytes(buffer, AppId); + EncodingUtils.WriteShortStringBytes(buffer, ClusterId); + } + + public void PopulatePropertiesFromBuffer(ByteBuffer buffer, ushort propertyFlags) + { + _log.Debug("Property flags: " + propertyFlags); + if ( (propertyFlags & (1 << 15)) > 0 ) + ContentType = EncodingUtils.ReadShortString(buffer); + if ( (propertyFlags & (1 << 14)) > 0 ) + Encoding = EncodingUtils.ReadShortString(buffer); + if ( (propertyFlags & (1 << 13)) > 0 ) + Headers = EncodingUtils.ReadFieldTable(buffer); + if ( (propertyFlags & (1 << 12)) > 0 ) + DeliveryMode = buffer.GetByte(); + if ( (propertyFlags & (1 << 11)) > 0 ) + Priority = buffer.GetByte(); + if ( (propertyFlags & (1 << 10)) > 0 ) + CorrelationId = EncodingUtils.ReadShortString(buffer); + if ( (propertyFlags & (1 << 9)) > 0 ) + ReplyTo = EncodingUtils.ReadShortString(buffer); + if ( (propertyFlags & (1 << 8)) > 0 ) + Expiration = EncodingUtils.ReadLongAsShortString(buffer); + if ( (propertyFlags & (1 << 7)) > 0 ) + MessageId = EncodingUtils.ReadShortString(buffer); + if ( (propertyFlags & (1 << 6)) > 0 ) + Timestamp = buffer.GetUInt64(); + if ( (propertyFlags & (1 << 5)) > 0 ) + Type = EncodingUtils.ReadShortString(buffer); + if ( (propertyFlags & (1 << 4)) > 0 ) + UserId = EncodingUtils.ReadShortString(buffer); + if ( (propertyFlags & (1 << 3)) > 0 ) + AppId = EncodingUtils.ReadShortString(buffer); + if ( (propertyFlags & (1 << 2)) > 0 ) + ClusterId = EncodingUtils.ReadShortString(buffer); + } + + public void SetDeliveryMode(DeliveryMode deliveryMode) + { + if ( deliveryMode == Messaging.DeliveryMode.NonPersistent ) + { + DeliveryMode = 1; + } else + { + DeliveryMode = 2; + } + } - public override string ToString() - { - return "Properties: " + ContentType + " " + Encoding + " " + Timestamp + " " + Type; - } - } + public override string ToString() + { + return "Properties: " + ContentType + " " + Encoding + " " + Timestamp + " " + Type; + } + } } diff --git a/qpid/dotnet/Qpid.Common/Framing/ContentBody.cs b/qpid/dotnet/Qpid.Common/Framing/ContentBody.cs index b63df22339..617086f2e8 100644 --- a/qpid/dotnet/Qpid.Common/Framing/ContentBody.cs +++ b/qpid/dotnet/Qpid.Common/Framing/ContentBody.cs @@ -26,11 +26,24 @@ namespace Qpid.Framing { public const byte TYPE = 3; - /// <summary> - /// - /// </summary> - /// TODO: consider whether this should be a pointer into the ByteBuffer to avoid copying */ - public byte[] Payload; + private ByteBuffer _payload; + + public ByteBuffer Payload + { + get { return _payload; } + } + + public ContentBody() + { + } + public ContentBody(ByteBuffer payload) + { + PopulateFromBuffer(payload, (uint)payload.Remaining); + } + public ContentBody(ByteBuffer payload, uint length) + { + PopulateFromBuffer(payload, length); + } #region IBody Members @@ -46,7 +59,7 @@ namespace Qpid.Framing { get { - return (ushort)(Payload == null ? 0 : Payload.Length); + return (ushort)(Payload == null ? 0 : Payload.Remaining); } } @@ -55,6 +68,7 @@ namespace Qpid.Framing if (Payload != null) { buffer.Put(Payload); + Payload.Rewind(); } } @@ -62,8 +76,9 @@ namespace Qpid.Framing { if (size > 0) { - Payload = new byte[size]; - buffer.GetBytes(Payload); + _payload = buffer.Slice(); + _payload.Limit = (int)size; + buffer.Skip((int)size); } } @@ -76,5 +91,10 @@ namespace Qpid.Framing frame.BodyFrame = body; return frame; } + + public override string ToString() + { + return string.Format("ContentBody [ Size: {0} ]", Size); + } } } diff --git a/qpid/dotnet/Qpid.Common/Framing/FieldTable.cs b/qpid/dotnet/Qpid.Common/Framing/FieldTable.cs index fe83fff721..adff817923 100644 --- a/qpid/dotnet/Qpid.Common/Framing/FieldTable.cs +++ b/qpid/dotnet/Qpid.Common/Framing/FieldTable.cs @@ -47,7 +47,6 @@ namespace Qpid.Framing /// </summary> /// <param name="buffer">the buffer from which to read data. The length byte must be read already</param> /// <param name="length">the length of the field table. Must be > 0.</param> - /// <exception cref="AMQFrameDecodingException">if there is an error decoding the table</exception> public FieldTable(ByteBuffer buffer, uint length) : this() { _encodedForm = buffer.Slice(); @@ -497,27 +496,18 @@ namespace Qpid.Framing private AMQTypedValue GetProperty(string name) { - lock ( _syncLock ) - { - if ( _properties == null ) - { - if ( _encodedForm == null ) - { - return null; - } else - { - PopulateFromBuffer(); - } - } - return (AMQTypedValue) _properties[name]; - } + InitMapIfNecessary(); + return (AMQTypedValue) _properties[name]; } private void PopulateFromBuffer() { try { - SetFromBuffer(_encodedForm, _encodedSize); + ByteBuffer buffer = _encodedForm; + _encodedForm = null; + if ( buffer != null ) + SetFromBuffer(buffer, _encodedSize); } catch ( AMQFrameDecodingException e ) { _log.Error("Error decoding FieldTable in deferred decoding mode ", e); @@ -598,7 +588,11 @@ namespace Qpid.Framing { if ( _encodedForm != null ) { - buffer.Put(_encodedForm); + lock ( _syncLock ) + { + buffer.Put(_encodedForm); + _encodedForm.Flip(); + } } else if ( _properties != null ) { foreach ( DictionaryEntry de in _properties ) @@ -629,6 +623,7 @@ namespace Qpid.Framing _log.Debug("Buffer Position:" + buffer.Position + " Remaining:" + buffer.Remaining); } + throw; } } } |