public int Decode(byte[] data, int offset, int length, out DecodedPacket pkt)
        {
            int ret;

            // When data exists in queue, add on and attempt decode.
            if (_readpos > 0)
            {
                if (!Save(data, offset, length))
                {
                    _error      = true;
                    pkt.packet  = null;
                    pkt.type_id = -1;
                    return(length);
                }

                ret = DoDecode(_data, _parsepos, _readpos - _parsepos, out pkt);
                if (ret > 0)
                {
                    OnParsed(ret);
                }
                return(length);
            }

            // No data in queue; attempt decode directly in buffer
            ret = DoDecode(data, offset, length, out pkt);
            if (pkt.type_id < 0)
            {
                // No decode yet. Consume what it wants and store the rest.
                if (!Save(data, offset + ret, length - ret))
                {
                    pkt.packet  = null;
                    pkt.type_id = -1;
                    _error      = true;
                }
                return(length);
            }

            return(ret);
        }
		public int Decode(byte[] data, int offset, int length, out DecodedPacket pkt)
		{
			int ret;

			// When data exists in queue, add on and attempt decode.
			if (_readpos > 0)
			{
				if (!Save(data, offset, length))
				{
					_error = true;
					pkt.packet = null;
					pkt.type_id = -1;
					return length;
				}

				ret = DoDecode(_data, _parsepos, _readpos - _parsepos, out pkt);
				if (ret > 0)
					OnParsed(ret);
				return length;
			}

			// No data in queue; attempt decode directly in buffer
			ret = DoDecode(data, offset, length, out pkt);
			if (pkt.type_id < 0)
			{
				// No decode yet. Consume what it wants and store the rest.
				if (!Save(data, offset + ret, length - ret))
				{
					pkt.packet = null;
					pkt.type_id = -1;
					_error = true;
				}
				return length;
			}

			return ret;
		}
 public int DoDecode(byte[] data, int offset, int length, out DecodedPacket pkt)
 {
     return(_decoder.Decode(data, offset, length, out pkt));
 }
		public int DoDecode(byte[] data, int offset, int length, out DecodedPacket pkt)
		{
			return _decoder.Decode(data, offset, length, out pkt);
		}