Example #1
0
        public String EndReadLine(IAsyncResult ar)
        {
            AsyncReadLineRequest lRequest = (AsyncReadLineRequest)ar;

            try
            {
                if (lRequest.State == AsyncReadLineState.MaxLineLengthReached)
                {
                    TriggerAsyncDisconnect();
                    Disconnect();
                    throw new ConnectionClosedException("Size limit for ReadLine() was exceeded.");
                }

                Byte[] lBuffer = lRequest.Data.ToArray();
                if (lRequest.Data.Length > 0 && lBuffer[lRequest.Data.Length - 1] == 13)
                {
                    return(Encoding.GetString(lBuffer, 0, (Int32)lRequest.Data.Length - 1));                    // on the rare occasion that the split is between the #13 and the #10
                }
                return(Encoding.GetString(lBuffer, 0, (Int32)lRequest.Data.Length));
            }
            finally
            {
                lRequest.Data.Close();
            }
        }
Example #2
0
        public IAsyncResult BeginReadLine(AsyncCallback callback, Object state)
        {
            if (!BufferedAsync)
                throw new Exception("BufferedAsync must be true to use BeginReadLine");

            AsyncReadLineRequest lRequest;
            if (fBuffer != null)
            {
                for (Int32 i = fBufferStart; i < fBufferEnd; i++)
                {
                    if (fBuffer[i] == 10)
                    {
                        Int32 lLen = i - fBufferStart;

                        if (lLen > 0 && fBuffer[i - 1] == 13)
                            lLen--;

                        lRequest = new AsyncReadLineRequest(state, callback);
                        lRequest.Data.Write(fBuffer, fBufferStart, lLen);

                        lRequest.State = AsyncReadLineState.SyncDone;
                        fBufferStart = i + 1;

                        callback(lRequest);

                        return lRequest;
                    }
                }
            }

            lRequest = new AsyncReadLineRequest(state, callback);
            if (fBuffer != null)
                lRequest.Data.Write(fBuffer, fBufferStart, fBufferEnd - fBufferStart);
            else
                fBuffer = new Byte[BUFFER_SIZE];

            fBufferStart = 0;
            fBufferEnd = 0;

            try
            {
                IntBeginRead(fBuffer, 0, fBuffer.Length, new AsyncCallback(IntReadLineCallback), lRequest);
            }
            catch (ObjectDisposedException) // disconnect from this side
            {
                TriggerAsyncDisconnect();
                throw;
            }
            catch (SocketException) // disconnect
            {
                TriggerAsyncDisconnect();
                throw;
            }

            return lRequest;
        }
Example #3
0
        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();
            }
        }
Example #4
0
        public IAsyncResult BeginReadLine(AsyncCallback callback, Object state)
        {
            if (!BufferedAsync)
            {
                throw new Exception("BufferedAsync must be true to use BeginReadLine");
            }

            AsyncReadLineRequest lRequest;

            if (fBuffer != null)
            {
                for (Int32 i = fBufferStart; i < fBufferEnd; i++)
                {
                    if (fBuffer[i] != 10)
                    {
                        continue;
                    }

                    Int32 lLen = i - fBufferStart;

                    if (lLen > 0 && fBuffer[i - 1] == 13)
                    {
                        lLen--;
                    }

                    lRequest = new AsyncReadLineRequest(state, callback);
                    lRequest.Data.Write(fBuffer, fBufferStart, lLen);

                    lRequest.State = AsyncReadLineState.SyncDone;
                    fBufferStart   = i + 1;

                    callback(lRequest);

                    return(lRequest);
                }
            }

            lRequest = new AsyncReadLineRequest(state, callback);
            if (fBuffer != null)
            {
                lRequest.Data.Write(fBuffer, fBufferStart, fBufferEnd - fBufferStart);
            }
            else
            {
                fBuffer = new Byte[BUFFER_SIZE];
            }

            fBufferStart = 0;
            fBufferEnd   = 0;

            try
            {
                IntBeginRead(fBuffer, 0, fBuffer.Length, IntReadLineCallback, lRequest);
            }
            catch (ObjectDisposedException)             // disconnect from this side
            {
                TriggerAsyncDisconnect();
                throw;
            }
            catch (SocketException)             // disconnect
            {
                TriggerAsyncDisconnect();
                throw;
            }

            return(lRequest);
        }