diff options
| author | Steven Shaw <steshaw@apache.org> | 2006-11-29 05:51:43 +0000 |
|---|---|---|
| committer | Steven Shaw <steshaw@apache.org> | 2006-11-29 05:51:43 +0000 |
| commit | 1df5c37bfa8fe1ec20e41dfd2bb06bc10a790917 (patch) | |
| tree | 8012603b18bae10e2c781debf36a5cd9b7e89bb6 /dotnet/Qpid.Client/Client/Message/AMQMessageFactory.cs | |
| parent | 74abf7b06d6d3d4d291f87d750500ceded74dd1b (diff) | |
| download | qpid-python-1df5c37bfa8fe1ec20e41dfd2bb06bc10a790917.tar.gz | |
QPID-137. First stab at porting enough to get AutoAcknowledge mode working.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@480423 13f79535-47bb-0310-9956-ffa450edef68
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); } } |
