/** * SystemCaller to set Time and Date * $Id$ * $HeadURL$ * $Author$ * Created by Patric Karwat, NLE, 07-03-2019 */ #include "system_caller.h" #include #include namespace DateTimeSyncer { SystemCaller::SystemCaller(QObject *parent) : QObject(parent) , m_tcpServer(new TcpServer(this)) , m_sockets(QVector()) , m_logger(getLogger("SystemCaller")) {} SystemCaller::~SystemCaller() { for (auto socket : qAsConst(m_sockets)) { socket->close(); socket->deleteLater(); } m_tcpServer->close(); delete m_tcpServer; } bool SystemCaller::init(int tcpPort) { connect(m_tcpServer, &TcpServer::newConnection, this, &SystemCaller::newConnection); bool result = m_tcpServer->listen(QHostAddress::Any, tcpPort); quint16 actualPort = m_tcpServer->serverPort(); NOTICE_LOG(m_logger) << "Start listen to port " << actualPort << " result: " << result; if (!result) return false; return true; } void SystemCaller::newConnection() { while (m_tcpServer->hasPendingConnections()) { // store socket and connect to signals QTcpSocket *socket = m_tcpServer->nextPendingConnection(); connect(socket, &QTcpSocket::readyRead, this, &SystemCaller::readTcp); connect(socket, &QTcpSocket::disconnected, this, &SystemCaller::tcpDisconnected); m_sockets.append(socket); NOTICE_LOG(m_logger) << "New TCP-connection on port " << m_tcpServer->serverPort(); } } void SystemCaller::readTcp() { QTcpSocket *socket = qobject_cast(sender()); if (!socket) return; QByteArray ba = socket->readAll(); qint64 time = ba.toLongLong(); DEBUG_LOG(m_logger) << "New Time " << time; QDateTime newDateTime = QDateTime::fromSecsSinceEpoch(time); if (newDateTime.isValid()) { #ifndef WIN32 //linux QString string = newDateTime.toString(QStringLiteral("\"yyyy-MM-dd hh:mm:ss\"")); QString dateTimeString(QStringLiteral("date --set=")); dateTimeString.append(string); int systemDateTimeStatus = system(dateTimeString.toStdString().c_str()); if (systemDateTimeStatus == -1) WARNING_LOG(m_logger) << "Failed to change date time"; int systemHwClockStatus = system("/sbin/hwclock -w"); if (systemHwClockStatus == -1) WARNING_LOG(m_logger) << "Failed to sync hardware clock"; #else QString dateString = newDateTime.toString(QStringLiteral("dd-MM-yy")); QString timeString = newDateTime.toString(QStringLiteral("hh:mm:ss")); QString systemDateString(QStringLiteral("date ")); QString systemTimeString(QStringLiteral("time ")); systemDateString.append(dateString); systemTimeString.append(timeString); int systemDateStatus = system(systemDateString.toLocal8Bit().data()); if (systemDateStatus == -1) WARNING_LOG(m_logger) << "Failed to change date"; int systemTimeStatus = system(systemTimeString.toLocal8Bit().data()); if (systemTimeStatus == -1) WARNING_LOG(m_logger) << "Failed to change date"; #endif } } void SystemCaller::tcpDisconnected() { QTcpSocket *socket = qobject_cast(sender()); m_sockets.removeOne(socket); } void SystemCaller::handleTcpError(QAbstractSocket::SocketError error) { Q_UNUSED(error) //TODO: TCP-Socket Error handling } } //namespace DateTimeSyncer