174 lines
3.8 KiB
C++
174 lines
3.8 KiB
C++
|
/***************************************************************************
|
||
|
|
||
|
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 <QFile>
|
||
|
#include <QFileDialog>
|
||
|
#include <QMessageBox>
|
||
|
#include <QMetaType>
|
||
|
#include <QSet>
|
||
|
#include <QTcpSocket>
|
||
|
#include <QDebug>
|
||
|
|
||
|
#include <libMiniCash.h>
|
||
|
#include <mcreceiver.h>
|
||
|
|
||
|
|
||
|
|
||
|
/**
|
||
|
* @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<QTcpSocket*>( 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<QTcpSocket*>(sender());
|
||
|
|
||
|
QSet<QTcpSocket*>::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();
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|