private bool SerializeAndSend()

in FixAntenna/NetCore/FixEngine/Session/IoThreads/NoQueueMessagePumper.cs [318:395]


		private bool SerializeAndSend(string msgType, FixMessage content, ChangesType? changesType, bool checkState)
		{
			if (checkState)
			{
				if (!_started)
				{
					throw new InvalidOperationException("Pumper is not started, it cannot send any messages in this state.");
				}

				if (((AbstractFixSession)_fixSession).AlreadySendingLogout)
				{
					throw new InvalidOperationException("Session is shutting down, cannot send any messages in this state.");
				}
			}
			try
			{
				var offset = _messageBuffer.Offset;
				if (changesType != null)
				{
					_fixMessageFactory.Serialize(content, changesType, _messageBuffer, _context);
				}
				else
				{
					_fixMessageFactory.Serialize(null, msgType, content, _messageBuffer, _context);
				}

				var len = _messageBuffer.Offset - offset;
				long written = _transport.Write(_messageBuffer, offset, len);
				if (written != len)
				{
					throw new IOException("Transport sent only part of message (" + written + " vs " + len + ")");
				}

				if (msgType != null || changesType != null)
				{
					try
					{
						_sequenceManager.IncrementOutSeqNum();
					}
					catch (IOException e)
					{
						Log.Error("Failed to increment sequence", e);
						return false;
					}
				}

				UpdateMessageProcessedTimestamp();
				_outgoingLog.AppendMessage(_messageBuffer.GetByteArray(), offset, len);

				try
				{
					_fixSession.ExtendedFixSessionListener.OnMessageSent(_messageBuffer.GetByteArray(), offset, len);
				}
				catch (Exception e)
				{
					if (Log.IsDebugEnabled)
					{
						Log.Warn("ExtendedFIXSessionListener::OnMessageSent thrown error. Cause:" + e.Message, e);
					}
					else
					{
						Log.Warn("ExtendedFIXSessionListener::OnMessageSent thrown error. Cause:" + e.Message);
					}
				}
			}
			catch (IOException e)
			{
				Log.Error("Failed to send message: " + e.Message, e);
				ReportErrorAndShutdown(e);
				throw new MessageNotSentException("Message wasn't sent due to error", e);
			}
			finally
			{
				_messageBuffer.ResetBuffer();
			}

			return true;
		}