internal LoginHandler(ReadPacket packet)
        {
            int currentPacketSize = packet.ReadInt();
            if (currentPacketSize != packet.DataAvailable + 4)
            {
                throw new IOException("Wrong Login Packet size:" + currentPacketSize);
            }
            int protocolVersion = packet.ReadInt();
            networkChunkSize = packet.ReadInt();
            if (networkChunkSize > 0xFFFF)
            {
                throw new IOException("Network Chunk Size to large:" + networkChunkSize);
            }

            packet.ReadInt(); // Unknown
            processID = packet.ReadInt();
            connectionID = packet.ReadInt();

            // 0x20: enable warning messages if USE <database> issued
            // 0x40: change to initial database must succeed
            // 0x80: enable warning messages if SET LANGUAGE issued
            packet.ReadByte();

            int loginFlags = packet.ReadByte();
            bool isNtlmLogin = (loginFlags & 0x80) > 0;
            if (isNtlmLogin)
            {
                //TODO add support for NTLM
                throw new IOException("NTLM login currently not implemented.");
            }

            packet.ReadByte(); // SQL Type
            packet.ReadByte();
            packet.ReadInt(); // Timezone
            packet.ReadInt(); // Collation

            int wsidOffset = packet.ReadUnsignedShort();
            int wsidLength = packet.ReadUnsignedShort();

            int userOffset = packet.ReadUnsignedShort();
            int userLength = packet.ReadUnsignedShort();

            int passOffset = packet.ReadUnsignedShort();
            int passLength = packet.ReadUnsignedShort();

            int applOffset = packet.ReadUnsignedShort();
            int applLength = packet.ReadUnsignedShort();

            int servOffset = packet.ReadUnsignedShort();
            int servLength = packet.ReadUnsignedShort();

            int unknOffset = packet.ReadUnsignedShort();
            int unknLength = packet.ReadUnsignedShort();

            int progOffset = packet.ReadUnsignedShort();
            int progLength = packet.ReadUnsignedShort();

            int langOffset = packet.ReadUnsignedShort();
            int langLength = packet.ReadUnsignedShort();

            int dbOffset = packet.ReadUnsignedShort();
            int dbLength = packet.ReadUnsignedShort();

            packet.Skip(6);

            int ntlmOffset = packet.ReadUnsignedShort();
            int ntlmLength = packet.ReadUnsignedShort();

            int packetSize2 = packet.ReadInt();
            if (currentPacketSize != packetSize2)
            {
                throw new IOException("Invalid login packet.");
            }

            int offset = 86;
            wsid = ReadString(ref offset, packet, wsidOffset, wsidLength);
            user = ReadString(ref offset, packet, userOffset, userLength);
            password = EncryptPassword(ReadString(ref offset, packet, passOffset, passLength));
            application = ReadString(ref offset, packet, applOffset, applLength);
            server = ReadString(ref offset, packet, servOffset, servLength);
            ReadString(ref offset, packet, unknOffset, unknLength);
            program = ReadString(ref offset, packet, progOffset, progLength);
            language = ReadString(ref offset, packet, langOffset, langLength);
            database = ReadString(ref offset, packet, dbOffset, dbLength);
        }