Beispiel #1
0
        public static DefaultMessage FromBuffer(IBuffer buffer,
                                                Func <IBuffer, int, int, ushort, object> messageBodyDecoder)
        {
            if (buffer.Remaining < DefaultMessageHeader.HeaderLength)
            {
                return(null);
            }

            int index = buffer.IndexOf(BitConverter.GetBytes(HeaderTag));

            if (index != -1)
            {
                buffer.Position = index;

                if (buffer.Remaining >= DefaultMessageHeader.HeaderLength)
                {
                    int messageLength = BitConverter.ToInt32(
                        buffer.ByteArray, buffer.Position + 11);
                    if (buffer.Remaining >= DefaultMessageHeader.HeaderLength + messageLength)
                    {
                        DefaultMessageHeader header = new DefaultMessageHeader();
                        header.Tag     = HeaderTag;
                        header.Version = buffer.ByteArray[buffer.Position + 4];
                        header.Type    = BitConverter.ToUInt16(
                            buffer.ByteArray, buffer.Position + 5);
                        header.SubType = BitConverter.ToUInt16(
                            buffer.ByteArray, buffer.Position + 7);
                        header.Zip       = BitConverter.ToBoolean(buffer.ByteArray, buffer.Position + 9);
                        header.Encrypted = BitConverter.ToBoolean(buffer.ByteArray, buffer.Position + 10);
                        header.Length    = messageLength;

                        object obj = messageBodyDecoder(buffer,
                                                        buffer.Position + DefaultMessageHeader.HeaderLength, messageLength, header.Type);

                        buffer.Position += (DefaultMessageHeader.HeaderLength + messageLength);
                        return(new DefaultMessage
                        {
                            Header = header,
                            Obj = obj
                        });
                    }
                }
            }
            else
            {
                buffer.Position = buffer.Limit;
            }

            return(null);
        }
Beispiel #2
0
        public IndexOfResult IndexOf(Byte[] eof)
        {
            IndexOfResult result = new IndexOfResult();

            result.EofData = eof;
            if (eof == null || mLength < eof.Length)
            {
                return(result);
            }
            IBuffer rbuffer = GetReadBuffer();

            if (rbuffer == null)
            {
                return(result);
            }
            result.Start        = rbuffer;
            result.StartPostion = rbuffer.Postion;
            int bufferLen = 0;
            int eofOffset = 0;

            byte[] bufferdata = null;
            while (rbuffer != null)
            {
                bufferLen  = rbuffer.Length;
                bufferdata = rbuffer.Data;
                int?offset = null;
                while (true)
                {
                    var index = rbuffer.IndexOf(eof[0], offset);
                    if (index != -1)
                    {
                        offset = index + 1;
                        if (eof.Length == 1)
                        {
                            result.End        = rbuffer;
                            result.EndPostion = index;
                            result.Length     = GetLength((IBuffer)result.Start, (IBuffer)result.End, result.EndPostion);
                            return(result);
                        }
                        eofOffset = 1;
                        for (int i = offset.Value; i < bufferLen; i++)
                        {
                            if (eof[eofOffset] == bufferdata[i])
                            {
                                eofOffset++;
                                if (eofOffset == eof.Length)
                                {
                                    break;
                                }
                            }
                            else
                            {
                                eofOffset = -1;
                                break;
                            }
                        }
                        if (eofOffset == eof.Length)
                        {
                            result.End        = rbuffer;
                            result.EndPostion = index + eofOffset - 1;
                            result.Length     = GetLength((IBuffer)result.Start, (IBuffer)result.End, result.EndPostion);
                            return(result);
                        }
                        else if (eofOffset > 0)
                        {
                            if (rbuffer.Next != null)
                            {
                                var startW = rbuffer.Next.StartWith(eof, eofOffset);
                                if (startW != -1)
                                {
                                    result.End        = rbuffer.Next;
                                    result.EndPostion = startW;
                                    result.Length     = GetLength((IBuffer)result.Start, (IBuffer)result.End, result.EndPostion);
                                    return(result);
                                }
                            }
                        }
                    }
                    else
                    {
                        break;
                    }
                }
                rbuffer = rbuffer.Next;
            }
            return(result);
        }
Beispiel #3
0
        public IndexOfResult IndexOfLine()
        {
            IndexOfResult result = new IndexOfResult();

            result.EofData = mLineEof;
            if (mLength < 2)
            {
                return(result);
            }
            IBuffer rbuffer = GetReadBuffer();

            if (rbuffer == null)
            {
                return(result);
            }
            result.Start        = rbuffer;
            result.StartPostion = rbuffer.Postion;
            int bufferLen = 0;

            byte[] bufferdata = null;
            while (rbuffer != null)
            {
                bufferLen  = rbuffer.Length;
                bufferdata = rbuffer.Data;
                int?offset = null;
                while (true)
                {
                    var index = rbuffer.IndexOf(13, offset);
                    if (index != -1)
                    {
                        offset = index + 1;
                        if (index + 1 >= bufferLen)
                        {
                            if (rbuffer.Next == null)
                            {
                                return(result);
                            }
                            if (rbuffer.Next.Data[0] == 10)
                            {
                                result.End        = rbuffer.Next;
                                result.EndPostion = 0;
                                result.Length     = GetLength((IBuffer)result.Start, (IBuffer)result.End, result.EndPostion);
                                return(result);
                            }
                        }
                        else
                        {
                            if (bufferdata[index + 1] == 10)
                            {
                                result.End        = rbuffer;
                                result.EndPostion = index + 1;
                                result.Length     = GetLength((IBuffer)result.Start, (IBuffer)result.End, result.EndPostion);
                                return(result);
                            }
                        }
                    }
                    else
                    {
                        break;
                    }
                }
                rbuffer = rbuffer.Next;
            }
            return(result);
        }