#include "headers/baseconn.h" BaseConn::BaseConn(QObject *parent) : QObject(parent) { socket = new QTcpSocket(); this->setState("disconnected"); } bool BaseConn::connectToHost() { setState("connecting"); this->connection_progress = 0; QEventLoop loop; QTimer timer; timer.setSingleShot(true); // quit the loop when the timer times out loop.connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); //quit the loop when the connection was established loop.connect(this->socket, SIGNAL(connected()), &loop, SLOT(quit())); // start the timer before starting to connect timer.start(3000); //connect this->socket->connectToHost(this->ip, this->port); //wait for the connection to finish (programm gets stuck in here) loop.exec(); //loop finished if(timer.remainingTime() == -1){ //the time has been triggered -> timeout this->socket->abort(); setState("disconnected"); return(false); } // stop the timer as the connection has been established timer.stop(); connect(this->socket, &QTcpSocket::readyRead, this, &BaseConn::readyRead); this->connection_progress = 100; setState("connected"); return(true); } QString BaseConn::sendCommand(QString command){ QByteArray arrBlock; QDataStream out(&arrBlock, QIODevice::WriteOnly); //out.setVersion(QDataStream::Qt_5_10); out << quint16(0) << command; out.device()->seek(0); out << quint16(arrBlock.size() - sizeof(quint16)); QEventLoop loop; QTimer timer; timer.setSingleShot(true); // quit the loop when the timer times out loop.connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); //quit the loop when the connection was established loop.connect(this, &BaseConn::gotReply, &loop, &QEventLoop::quit); // start the timer before starting to connect timer.start(3000); //write data socket->write(arrBlock); //wait for an answer to finish (programm gets stuck in here) loop.exec(); //loop finished if(timer.remainingTime() == -1){ //the time has been triggered -> timeout return("timeout"); } // stop the timer as the connection has been established timer.stop(); return(this->latestReadReply); } void BaseConn::readyRead() { qDebug() << "readyRead"; QDataStream in(socket); //in.setVersion(QDataStream::Qt_5_10); qint16 nextBlockSize = 0; for (;;) { if (!nextBlockSize) { if (socket->bytesAvailable() < sizeof(quint16)) { break; } in >> nextBlockSize; } if (socket->bytesAvailable() < nextBlockSize) { break; } QString str; in >> str; // if (str == "0") // { // str = "Connection closed"; // closeConnection(); // } nextBlockSize = 0; latestReadReply = str; emit gotReply(); } } void BaseConn::setIP(const QString &ipAdress){ this->ip = ipAdress; } QString BaseConn::getIP() const { return(this->ip); } QString BaseConn::getState() const { return(this->state); } void BaseConn::setState(QString newState){ this->state = newState; emit stateChanged(); } int BaseConn::getProgress() const { return(connection_progress); }