public void Send()

in src/main/csharp/MessageProducer.cs [103:197]


		public void Send(IDestination dest, IMessage message, MsgDeliveryMode deliveryMode, MsgPriority priority, TimeSpan timeToLive, bool specifiedTimeToLive)
		{
			if(null == dest)
			{
				return;
			}

			if(null != this.ProducerTransformer)
			{
				IMessage transformedMessage = ProducerTransformer(this.session, this, message);

				if(null != transformedMessage)
				{
					message = transformedMessage;
				}
			}

			// Serialize the message data
			Destination theDest = (Destination) dest;
			List<byte> msgDataBuilder = new List<byte>();

			// Always set the message Id.
			message.NMSMessageId = Guid.NewGuid().ToString();
			message.NMSTimestamp = DateTime.UtcNow;
			if(specifiedTimeToLive)
			{
				message.NMSTimeToLive = timeToLive;
			}

			// Prefix the message with the destination name. The client will subscribe to this destination name
			// in order to receive messages.
			msgDataBuilder.AddRange(Encoding.UTF8.GetBytes(theDest.Name));

			// Encode all meta data (e.g., headers and properties)
			EncodeField(msgDataBuilder, WireFormat.MFT_MESSAGEID, message.NMSMessageId);
			EncodeField(msgDataBuilder, WireFormat.MFT_TIMESTAMP, message.NMSTimestamp.ToBinary());
			if(null != message.NMSType)
			{
				EncodeField(msgDataBuilder, WireFormat.MFT_NMSTYPE, message.NMSType);
			}

			if(null != message.NMSCorrelationID)
			{
				EncodeField(msgDataBuilder, WireFormat.MFT_CORRELATIONID, message.NMSCorrelationID);
			}

			if(null != message.NMSReplyTo)
			{
				EncodeField(msgDataBuilder, WireFormat.MFT_REPLYTO, ((Destination) message.NMSReplyTo).Name);
			}

			EncodeField(msgDataBuilder, WireFormat.MFT_DELIVERYMODE, message.NMSDeliveryMode);
			EncodeField(msgDataBuilder, WireFormat.MFT_PRIORITY, message.NMSPriority);
			EncodeField(msgDataBuilder, WireFormat.MFT_TIMETOLIVE, message.NMSTimeToLive.Ticks);

			IPrimitiveMap properties = message.Properties;
			if(null != properties && properties.Count > 0)
			{
				EncodeField(msgDataBuilder, WireFormat.MFT_HEADERS, ((PrimitiveMap) properties).Marshal());
			}

			if(message is ITextMessage)
			{
				EncodeField(msgDataBuilder, WireFormat.MFT_MSGTYPE, WireFormat.MT_TEXTMESSAGE);
				// Append the message text body to the msg.
				string msgBody = ((ITextMessage) message).Text;

				if(null != msgBody)
				{
					EncodeField(msgDataBuilder, WireFormat.MFT_BODY, msgBody);
				}
			}
			else if(message is IBytesMessage)
			{
				EncodeField(msgDataBuilder, WireFormat.MFT_MSGTYPE, WireFormat.MT_BYTESMESSAGE);
				// Append the message text body to the msg.
				byte[] msgBody = ((IBytesMessage) message).Content;

				if(null != msgBody)
				{
					EncodeField(msgDataBuilder, WireFormat.MFT_BODY, msgBody);
				}
			}
			else
			{
				// TODO: Add support for more message types
				EncodeField(msgDataBuilder, WireFormat.MFT_MSGTYPE, WireFormat.MT_MESSAGE);
			}

			// Put the sentinal field marker.
			EncodeField(msgDataBuilder, WireFormat.MFT_NONE, 0);

			((BaseMessage) message).OnSend();
			theDest.Send(msgDataBuilder.ToArray());
		}