/*************************************************************************** miniCashConnect Copyright © 2022 christoph holzheuer c.holzheuer@sourceworx.org This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. ***************************************************************************/ #include #include #include #include #include #include #include #include #include /** * @brief Destructor, alles schließen */ MCReceiver::~MCReceiver() { onDiscardConnection(); deleteLater(); } /** * @brief Empfangsbereit machen: hier passiert weiter nichts, * erst wir nur der parameter 'port' neu gesetzt, die * entsprechende Aktion wird über ein SIGNAL getriggert. */ void MCReceiver::setupConnection( int port ) { qDebug() << "MCReceiver::setupConnection: " << port; _port = port; } /** * @brief Slot, */ void MCReceiver::onCreateConnection() { if( isListening() ) onDiscardConnection(); //qDebug( "MCReceiver::onCreateConnection() 1: listen...." ); if( listen( QHostAddress::Any, _port ) ) { //qDebug( "MCReceiver::onCreateConnection() 2: Server is listening..."); connect( this, &QTcpServer::newConnection, this, &MCReceiver::onNewConnection ); //qDebug( "MCReceiver::onCreateConnection() 3: Server is listening..."); emit connectionChanged( miniCash::IsServer ); return; } emit connectionChanged( miniCash::Error ); //QMessageBox::critical(this,"QTCPServer",QString("Unable to start the server: %1.").arg(errorString())); //exit(EXIT_FAILURE); } void MCReceiver::onDiscardConnection() { //qDebug( "MCReceiver::onDiscardConnection()"); foreach( QTcpSocket* socket, _connections ) { socket->close(); socket->deleteLater(); } close(); emit connectionChanged( miniCash::UnConnected ); } /** * @brief Nimmt neue Connections an und schreibt sie * in die Connectionliste. */ void MCReceiver::onNewConnection() { while( hasPendingConnections() ) appendToSocketList( nextPendingConnection() ); emit connectionChanged( miniCash::ServerReady ); } void MCReceiver::appendToSocketList( QTcpSocket* socket ) { _connections.insert(socket); connect( socket, &QTcpSocket::readyRead, this, &MCReceiver::onReadReady ); connect( socket, &QTcpSocket::disconnected, this, &MCReceiver::onSocketDisconnected ); //qDebug() << QString("INFO :: Client with sockd:%1 has just entered the room").arg(socket->socketDescriptor() ); } void MCReceiver::onReadReady() { QTcpSocket* socket = reinterpret_cast( sender() ); QByteArray buffer; QDataStream socketStream( socket ); socketStream.setVersion( QDataStream::Qt_5_15 ); socketStream.startTransaction(); socketStream >> buffer; if( !socketStream.commitTransaction() ) return; /* { QString message = QString("%1 :: Waiting for more data to come..").arg(socket->socketDescriptor()); emit newData(message); return; } */ // warum?? //QString message = QString::fromStdString( buffer.toStdString() ); emit newTransaction( QString( buffer ) ); } void MCReceiver::onSocketDisconnected() { QTcpSocket* socket = reinterpret_cast(sender()); QSet::iterator it = _connections.find(socket); if (it != _connections.end()) { //displayMessage( QString("INFO :: A client has just left the room").arg(socket->socketDescriptor()) ); _connections.remove( *it ); } socket->deleteLater(); }