private bool WriteToTransport()

in FixAntenna/NetCore/FixEngine/Session/IoThreads/SyncMessagePumper.cs [420:502]


		private bool WriteToTransport(int messageCount, byte[] externalBuffer)
		{
			//TODO extract next block into separate function. Looks like for main thread it should be used without the rest part of code (messageCount = 0, externalBuffer = null)

			int toWrite, written;

			if (HasDataChunkToTransfer())
			{
				toWrite = _dataChunkEnd - _dataChunkStart;
				written = _transport.Write(_messageBuffer, _dataChunkStart, toWrite);
				_dataChunkStart += written;

				// update statistics
				if (_statisticEnabled)
				{
					_messageStatistic.AddBytesProcessed(written);
				}

				return false;
			}

			toWrite = _messageEnd[messageCount - 1] - _messageStart[0];

			if (externalBuffer != null)
			{
				try
				{
					written = _transport.Write(externalBuffer, _messageStart[0], toWrite);
					if (written < toWrite)
					{
						_messageBuffer.Add(externalBuffer, _messageStart[0] + written, toWrite - written);
						ScheduleChunkToTransfer(_messageStart[0] + written, toWrite);
						return false;
					}
				}
				catch (IOException e)
				{
					_messageBuffer.Add(externalBuffer, _messageStart[0], toWrite);
					ScheduleChunkToTransfer(_messageStart[0], toWrite);
					//throw e;

					var messages = new string[1];
					messages[0] = StringHelper.NewString(externalBuffer, _messageStart[0], toWrite);
					throw new TransportMessagesNotSentException(e, messages);
				}
			}
			else
			{
				try
				{
					written = _transport.Write(_messageBuffer, _messageStart[0], toWrite);
					if (written < toWrite)
					{
						ScheduleChunkToTransfer(_messageStart[0] + written, toWrite);
						return false;
					}
				}
				catch (IOException e)
				{
					ScheduleChunkToTransfer(_messageStart[0], toWrite);
					//throw e;

					var messages = new string[messageCount];
					for (var i = 0; i < messageCount; i++)
					{
						messages[i] = StringHelper.NewString(_messageBuffer.GetByteArray(), _messageStart[i], _messageEnd[i]);
					}

					throw new TransportMessagesNotSentException(e, messages);
				}
			}

			// update statistics
			MessageProcessedTimestamp = DateTimeHelper.CurrentMilliseconds;
			if (_statisticEnabled)
			{
				//updateStatistic();
				_messageStatistic.AddMessagesProcessed(messageCount);
				_messageStatistic.AddBytesProcessed(written);
			}

			return true;
		}