From 1df5c37bfa8fe1ec20e41dfd2bb06bc10a790917 Mon Sep 17 00:00:00 2001 From: Steven Shaw Date: Wed, 29 Nov 2006 05:51:43 +0000 Subject: 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 --- .../Client/Message/AMQMessageFactory.cs | 73 +++++++++++++++++----- 1 file changed, 58 insertions(+), 15 deletions(-) (limited to 'dotnet/Qpid.Client/Client/Message/AMQMessageFactory.cs') 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(); + + ///// + ///// + ///// + ///// + ///// + ///// + ///// + ///// + //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(); - - /// - /// - /// - /// - /// - /// - /// - /// - protected abstract AbstractQmsMessage CreateMessageWithBody(ulong messageNbr, - ContentHeaderBody contentHeader, - IList bodies); } } -- cgit v1.2.1