Worker::Worker(QIODevice* peer, QObject* parent) : QObject(parent), m_peer(peer), m_target(0), m_connector(0), m_buf(), m_expected_length(-1), m_state(Worker::ConnectedState), m_noauth_allowed(false) { QObject::connect(this->m_peer, SIGNAL(readyRead()), this, SLOT(peerReadyReadHandler())); if (qobject_cast<QAbstractSocket*>(this->m_peer)) { QObject::connect(this->m_peer, SIGNAL(disconnected()), this, SLOT(disconnectHandler())); QObject::connect(this->m_peer, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(peerErrorHandler(QAbstractSocket::SocketError))); } else { QObject::connect(this->m_peer, SIGNAL(aboutToClose()), this, SLOT(disconnectHandler())); } }
void Worker::targetConnectedHandler(void) { this->m_target = new QTcpSocket(this); this->m_connector->assignTo(this->m_target); delete this->m_connector; this->m_connector = 0; union { quint32 v4; Q_IPV6ADDR v6; quint16 port; char ptr; } data; QByteArray response("\x05\x00\x00", 3); QHostAddress a; if (qobject_cast<QAbstractSocket*>(this->m_peer)) { a = (qobject_cast<QAbstractSocket*>(this->m_peer))->peerAddress(); } if (a.protocol() == QAbstractSocket::IPv4Protocol) { response.append('\x01'); data.v4 = qToBigEndian(a.toIPv4Address()); response.append(QByteArray::fromRawData(&data.ptr, sizeof(data.v4))); } else if (a.protocol() == QAbstractSocket::IPv6Protocol) { response.append('\x04'); data.v6 = a.toIPv6Address(); response.append(QByteArray::fromRawData(&data.ptr, sizeof(data.v6))); } else { Q_ASSERT(false); } if (qobject_cast<QAbstractSocket*>(this->m_peer)) { data.port = qToBigEndian<quint16>((qobject_cast<QAbstractSocket*>(this->m_peer))->peerPort()); } else { data.port = 0; } response.append(QByteArray::fromRawData(&data.ptr, sizeof(data.port))); QObject::connect(this->m_target, SIGNAL(readyRead()), this, SLOT(targetReadyReadHandler())); QObject::connect(this->m_target, SIGNAL(disconnected()), this, SLOT(disconnectHandler())); if (this->writeAndFlush(this->m_peer, response) == response.size()) { this->m_state = Worker::ConnectionProxiedState; } else { if (this->m_peer) { this->m_peer->close(); } this->m_state = Worker::FatalErrorState; } }
void readMessage(char *buffer, int sock) //parse the commands read { int readStatus; zeroBuffer(buffer); readStatus = read(sock, buffer, MAX_MESSAGE_SIZE); printf("command read: %d\n", (int)buffer[COMMAND_LOCATION]); switch ((int)buffer[COMMAND_LOCATION]) { case PORT: portHandler(buffer, sock); break; case USERNAME: usernameHandler(buffer, sock); break; case DISCONNECT: disconnectHandler(buffer, sock); break; case LIST_USERS: listHandler(buffer, sock); break; case MESSAGE: messageUserHandler(buffer, sock); break; default: printf("\nCommand not supported: (%d)\n", buffer[COMMAND_LOCATION]); writeMessageDefined(sock, buffer); break; } if (readStatus < 0) { error("ERROR reading from socket"); } else { if(!chop(buffer)) //remove any unwanted characters { memset(buffer, 0, MAX_MESSAGE_SIZE); buffer = TIMEOUT_CALL; } } }