diff options
Diffstat (limited to 'dotnet/Qpid.Client/Client/Message/AMQMessageFactory.cs')
| -rw-r--r-- | dotnet/Qpid.Client/Client/Message/AMQMessageFactory.cs | 73 |
1 files changed, 58 insertions, 15 deletions
diff --git a/dotnet/Qpid.Client/Client/Message/AMQMessageFactory.cs b/dotnet/Qpid.Client/Client/Message/AMQMessageFactory.cs index e485bb6d34..dd9855d675 100644 --- a/dotnet/Qpid.Client/Client/Message/AMQMessageFactory.cs +++ b/dotnet/Qpid.Client/Client/Message/AMQMessageFactory.cs @@ -20,30 +20,73 @@ */ using System.Collections; using Qpid.Framing; +using log4net; +using Qpid.Buffer; namespace Qpid.Client.Message { public abstract class AbstractQmsMessageFactory : IMessageFactory { - public AbstractQmsMessage CreateMessage(ulong messageNbr, bool redelivered, ContentHeaderBody contentHeader, IList bodies) + //public AbstractQmsMessage CreateMessage(long messageNbr, bool redelivered, ContentHeaderBody contentHeader, IList bodies) + //{ + // AbstractQmsMessage msg = CreateMessageWithBody(messageNbr, contentHeader, bodies); + // msg.Redelivered = redelivered; + // return msg; + //} + + public abstract AbstractQmsMessage CreateMessage(); + + ///// <summary> + ///// + ///// </summary> + ///// <param name="messageNbr"></param> + ///// <param name="contentHeader"></param> + ///// <param name="bodies"></param> + ///// <returns></returns> + ///// <exception cref="AMQException"></exception> + //protected abstract AbstractQmsMessage CreateMessageWithBody(long messageNbr, + // ContentHeaderBody contentHeader, + // IList bodies); + + private static readonly ILog _logger = LogManager.GetLogger(typeof (AbstractQmsMessageFactory)); + + protected abstract AbstractQmsMessage CreateMessage(long messageNbr, ByteBuffer data, ContentHeaderBody contentHeader); + + protected AbstractQmsMessage CreateMessageWithBody(long messageNbr, + ContentHeaderBody contentHeader, + IList bodies) + { + ByteBuffer data; + + // we optimise the non-fragmented case to avoid copying + if (bodies != null && bodies.Count == 1) + { + _logger.Debug("Non-fragmented message body (bodySize=" + contentHeader.BodySize +")"); + data = HeapByteBuffer.wrap(((ContentBody)bodies[0]).Payload); + } + else + { + _logger.Debug("Fragmented message body (" + bodies.Count + " frames, bodySize=" + contentHeader.BodySize + ")"); + data = ByteBuffer.Allocate((int)contentHeader.BodySize); // XXX: Is cast a problem? + foreach (ContentBody body in bodies) { + data.Put(body.Payload); + //body.Payload.Release(); + } + + data.Flip(); + } + _logger.Debug("Creating message from buffer with position=" + data.Position + " and remaining=" + data.Remaining); + + return CreateMessage(messageNbr, data, contentHeader); + } + + public AbstractQmsMessage CreateMessage(long messageNbr, bool redelivered, + ContentHeaderBody contentHeader, + IList bodies) { AbstractQmsMessage msg = CreateMessageWithBody(messageNbr, contentHeader, bodies); msg.Redelivered = redelivered; return msg; } - - public abstract AbstractQmsMessage CreateMessage(); - - /// <summary> - /// - /// </summary> - /// <param name="messageNbr"></param> - /// <param name="contentHeader"></param> - /// <param name="bodies"></param> - /// <returns></returns> - /// <exception cref="AMQException"></exception> - protected abstract AbstractQmsMessage CreateMessageWithBody(ulong messageNbr, - ContentHeaderBody contentHeader, - IList bodies); } } |
