summaryrefslogtreecommitdiff
path: root/qpid/dotnet/Qpid.Common/Framing
diff options
context:
space:
mode:
Diffstat (limited to 'qpid/dotnet/Qpid.Common/Framing')
-rw-r--r--qpid/dotnet/Qpid.Common/Framing/BasicContentHeaderProperties.cs364
-rw-r--r--qpid/dotnet/Qpid.Common/Framing/ContentBody.cs36
-rw-r--r--qpid/dotnet/Qpid.Common/Framing/FieldTable.cs29
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;
}
}
}