ZT/sources/NetworkManager.cpp

248 lines
6.7 KiB
C++

/*******************************************************************************
* *
* Société de Transports de Montréal. *
* 2015 *
* *
* Projet Zones Tests *
* *
* *
* *
*******************************************************************************/
/*
Description:
Classe qui gère la communication IP entre la Zone Test et l'outil d'analyse.
*/
/* ************************************************************************** */
/* Revision:
### 20121210 JFM
Verision d'origine.
### YYYYMMDD Description du besoin ou du bug
Description du changement.
*/
/* ************************************************************************** */
#include "NetworkManager.h"
#include <QDebug>
#include <QByteArray>
#include <Zonetest.h>
#include <ZTLog.h>
CNetworkManager CNetworkManager::mSingleton;
CNetworkManager::CNetworkManager(QObject *parent) :
QObject(parent)
{
mProgramHandle = 0;
mTCPSocket = 0;
mCurTrainLogsListIndex = 0;
mTrainLogsFileInfoList.clear();
connect(&mTCPServer,SIGNAL(newConnection()),this,SLOT(NewTCPConnection()));
}
CNetworkManager::~CNetworkManager()
{
mTCPSocket->disconnectFromHost();
mTCPServer.close();
}
void CNetworkManager::BindPointers(CZoneTest *ProgramHandle)
{
mProgramHandle = ProgramHandle;
}
unsigned int CNetworkManager::StartServer()
{
if(mTCPServer.listen(QHostAddress::Any,TCP_SERVER_PORT) == false)
{
CZTLog::instance()->AddLogString("Impossible de démarrer le serveur TCP",true);
return RET_ERROR;
}
CZTLog::instance()->AddLogString(QString().sprintf("Serveur TCP démarré sur le port %d",TCP_SERVER_PORT),true);
return RET_OK;
}
void CNetworkManager::NewTCPConnection()
{
mTCPSocket = mTCPServer.nextPendingConnection();
if(mTCPSocket == 0)
{
CEngLog::instance()->AddLogString("Invalid socket from TCP server");
return;
}
// mTCPSocket->setSocketOption(QAbstractSocket::LowDelayOption,1);
connect(mTCPSocket,SIGNAL(readyRead()),this,SLOT(TCPDataReady()));
connect(mTCPSocket,SIGNAL(disconnected()),this,SLOT(TCPSockedDisconnected()));
QString str = "Client connecté : ";
str += mTCPSocket->peerAddress().toString();
CZTLog::instance()->AddLogString(str,true);
}
void CNetworkManager::TCPDataReady()
{
qint64 datasize = mTCPSocket->bytesAvailable();
//QByteArray data= mTCPSocket->read(datasize);
qDebug() << "TCP data received" << datasize;// << "bytes: " << data.toHex();
AnalyzeNewData(mTCPSocket->readAll());
}
void CNetworkManager::TCPSockedDisconnected()
{
CZTLog::instance()->AddLogString("Client TCP déconnecté",true);
//StartServer();
}
void CNetworkManager::TCPTxRequest(QByteArray request)
{
qDebug() << "Tx request in Network Manager : " << request.size() << " bytes : " << request.toHex();
mTCPSocket->write(request);
}
void CNetworkManager::TCPHeartbeatRequest()
{
qDebug("TCP: Received heartbeat request...");
mTCPSocket->write(GetHeartbeatPacket());
}
void CNetworkManager::TCPStationNameRequest()
{
qDebug("TCP: Received station name request...");
mTCPSocket->write(GetStationNamePacket(mProgramHandle->GetStationTextualName()));
}
void CNetworkManager::TCPStatusRequest()
{
qDebug("TCP: Received ZT status request");
CTCPZTStatus *status = mProgramHandle->GetTCPStatusRequest();
mTCPSocket->write(GetZTStatusPacket(status));
delete status;
// mTCPSocket->write(SendZTStatus());
}
void CNetworkManager::TCPZTLogDownloadRequest()
{
qDebug("TCP: Received ZTLog Download request");
QString *ZTLogText = mProgramHandle->GetZTLogTextRequest();
mTCPSocket->write(GetZTLogPacket(ZTLogText));
delete ZTLogText;
}
void CNetworkManager::TCPTrainLogsDownloadRequest()
{
mTrainLogsFileInfoList.clear();
mTrainLogsFileInfoList = mProgramHandle->GetTrainLogsFileListRequest();
mCurTrainLogsListIndex = 0;
//Add LogZT.txt to the list of files to transfer...
mTrainLogsFileInfoList.append(QFileInfo("./LOG/LogZT.txt"));
mTCPSocket->write(GetTrainLogsDownloadAckPacket((qint32)mTrainLogsFileInfoList.size()));
}
void CNetworkManager::TCPTrainLogFileDataAck(eTCPProtocolAcknowledge Acknowledge)
{
if(mCurTrainLogsListIndex >= mTrainLogsFileInfoList.size())
{
mTCPSocket->write(GetTrainLogsDownloadFinishedPacket());
return;
}
if(Acknowledge != TCP_PROTOCOL_ACK)
{
//TODO: Manage NACK codes...
return;
}
//Send next file
QByteArray FileData;
QDataStream strm(&FileData,QIODevice::WriteOnly);
strm.device()->seek(0);
QFile* BinaryLogFile = new QFile(mTrainLogsFileInfoList.at(mCurTrainLogsListIndex).absoluteFilePath());
if(BinaryLogFile)
{
if(BinaryLogFile->open(QIODevice::ReadOnly | QIODevice::Unbuffered) == false)
{
delete BinaryLogFile;
return;
}
}
else
{
return;
}
strm << mTrainLogsFileInfoList.at(mCurTrainLogsListIndex).fileName();
FileData.append(BinaryLogFile->readAll());
BinaryLogFile->flush();
BinaryLogFile->close();
delete BinaryLogFile;
QByteArray *Packet = GetTrainLogDataPacket(FileData);
qDebug() << "Sending: " << mTrainLogsFileInfoList.at(mCurTrainLogsListIndex).absoluteFilePath();
mTCPSocket->write(*Packet);
delete Packet;
mCurTrainLogsListIndex++;
}
void CNetworkManager::TCPDeleteZTLogRequest()
{
qDebug("TCP: Received ZTLog Delete request");
if(mProgramHandle->DeleteZTLogRequest() == RET_OK)
{
mTCPSocket->write(GetDeleteZTLogsAckPacket((qint32)TCP_PROTOCOL_ACK));
}
else
{
mTCPSocket->write(GetDeleteZTLogsAckPacket((qint32)TCP_PROTOCOL_NACK));
}
}
void CNetworkManager::TCPSetZTFunctionsConfigRequest(QByteArray &Data)
{
qDebug("TCP: Received Set ZT functions config request");
CTCPZTFunctionsStatus FunctionsConfig;
QDataStream strm(&Data,QIODevice::ReadOnly);
strm.device()->seek(0);
strm >> FunctionsConfig;
if(mProgramHandle->SetZTFunctionsConfig(FunctionsConfig) == RET_OK)
{
mTCPSocket->write(GetSetZTFunctionsConfigAckPacket((qint32)TCP_PROTOCOL_ACK));
}
else
{
mTCPSocket->write(GetSetZTFunctionsConfigAckPacket((qint32)TCP_PROTOCOL_NACK));
}
}