summaryrefslogtreecommitdiff
path: root/dotnet/Qpid.Client/Client/Message/AMQMessageFactory.cs
diff options
context:
space:
mode:
Diffstat (limited to 'dotnet/Qpid.Client/Client/Message/AMQMessageFactory.cs')
-rw-r--r--dotnet/Qpid.Client/Client/Message/AMQMessageFactory.cs73
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);
}
}