private void IntReadLineCallback(IAsyncResult ar)
{
AsyncReadLineRequest lRequest = (AsyncReadLineRequest)ar.AsyncState;
try
{
Int32 lCount = IntEndRead(ar);
if (lCount == 0)
{
TriggerAsyncDisconnect();
return;
}
for (Int32 i = 0; i < lCount; i++)
{
if (fBuffer[i] != 10)
continue;
if (i > 0 && fBuffer[i - 1] == 13)
lRequest.Data.Write(fBuffer, 0, i - 1);
else
lRequest.Data.Write(fBuffer, 0, i);
fBufferStart = i + 1;
fBufferEnd = lCount;
lRequest.State = AsyncReadLineState.Done;
lRequest.Callback(lRequest);
return;
}
if (this.MaxLineLengthEnabled && (lRequest.Data.Length > this.MaxLineLength))
{
fBufferStart = 0;
fBufferEnd = lCount;
lRequest.State = AsyncReadLineState.MaxLineLengthReached;
lRequest.Callback(lRequest);
return;
}
lRequest.Data.Write(fBuffer, 0, lCount);
TriggerAsyncHaveIncompleteData();
IntBeginRead(fBuffer, 0, fBuffer.Length, IntReadLineCallback, lRequest);
}
catch (ObjectDisposedException) // disconnect from this side
{
TriggerAsyncDisconnect();
}
catch (SocketException) // disconnect
{
TriggerAsyncDisconnect();
}
catch (ArgumentException)
{
}
catch (Exception) // different platforms throw different exceptions
{
TriggerAsyncDisconnect();
}
}