/// <summary>
        /// Send TDS Message to the server.
        /// </summary>
        /// <param name="data">TDS Message Data</param>
        public void SendTDSMessage(ITDSPacketData data)
        {
            switch (this.communicatorState)
            {
            case TDSCommunicatorState.Initial:
            {
                if (!(data is TDSPreLoginPacketData))
                {
                    throw new InvalidDataException();
                }

                this.innerTdsStream.CurrentOutboundMessageType = TDSMessageType.PreLogin;
                break;
            }

            case TDSCommunicatorState.SentInitialPreLogin:
            {
                if (!(data is TDSLogin7PacketData))
                {
                    throw new InvalidDataException();
                }

                this.innerTdsStream.CurrentOutboundMessageType = TDSMessageType.TDS7Login;
                break;
            }

            case TDSCommunicatorState.LoggedIn:
            {
                throw new NotSupportedException();
            }

            default:
            {
                throw new InvalidOperationException();
            }
            }

            var buffer = new byte[data.Length()];

            data.Pack(new MemoryStream(buffer));

            this.innerStream.Write(buffer, 0, buffer.Length);

            switch (this.communicatorState)
            {
            case TDSCommunicatorState.Initial:
            {
                this.communicatorState = TDSCommunicatorState.SentInitialPreLogin;
                break;
            }

            case TDSCommunicatorState.SentInitialPreLogin:
            {
                this.communicatorState = TDSCommunicatorState.SentLogin7RecordWithCompleteAuthToken;
                break;
            }
            }
        }
        /// <summary>
        /// Receive TDS Message from the server.
        /// </summary>
        /// <returns>Returns received TDS Message.</returns>
        public ITDSPacketData ReceiveTDSMessage()
        {
            if (TDSSQLTestClient.flag == TDSEncryptionOption.EncryptOff && this.communicatorState == TDSCommunicatorState.Initial)
            {
                this.communicatorState = TDSCommunicatorState.SentLogin7RecordWithCompleteAuthToken;
            }
            TDSSQLTestClient.flag = TDSEncryptionOption.EncryptOn;
            byte[] resultBuffer = null;
            var    curOffset    = 0;

            if (this.communicatorState == TDSCommunicatorState.SentLogin7RecordWithCompleteAuthToken)
            {
            }
            do
            {
                Array.Resize(ref resultBuffer, curOffset + this.packetSize);
                curOffset += this.innerStream.Read(resultBuffer, curOffset, this.packetSize);
            }while (!this.innerTdsStream.InboundMessageTerminated);

            Array.Resize(ref resultBuffer, curOffset);

            ITDSPacketData result;

            switch (this.communicatorState)
            {
            case TDSCommunicatorState.SentInitialPreLogin:
            {
                result = new TDSPreLoginPacketData();
                result.Unpack(new MemoryStream(resultBuffer));
                break;
            }

            case TDSCommunicatorState.SentLogin7RecordWithCompleteAuthToken:
            {
                result = new TDSTokenStreamPacketData();
                result.Unpack(new MemoryStream(resultBuffer));
                break;
            }

            default:
            {
                throw new InvalidOperationException();
            }
            }

            return(result);
        }