Commit 8febebf264765912b35dda552940a66736c12303

Authored by Steven de Ridder
0 parents

Initial commit. dependencies not resolved yet.

.gitignore 0 → 100644
  1 +++ a/.gitignore
  1 +build/
  2 +CMakeLists.txt.user
CMakeLists.txt 0 → 100644
  1 +++ a/CMakeLists.txt
  1 +cmake_minimum_required(VERSION 3.0)
  2 +
  3 +# Check to see where cmake is located.
  4 +if( IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/cmake )
  5 + LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
  6 +elseif( IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../cmake )
  7 + LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../cmake)
  8 +else()
  9 + return()
  10 +endif()
  11 +
  12 +# Check to see if there is versioning information available
  13 +if(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/osdev_versioning/cmake)
  14 + LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/osdev_versioning/cmake)
  15 + include(osdevversion)
  16 +endif()
  17 +
  18 +include(projectheader)
  19 +project_header(osdev_iputils)
  20 +
  21 +add_subdirectory(src)
  22 +add_subdirectory(tests)
  23 +
  24 +# include(packaging)
  25 +# package_component()
README.md 0 → 100644
  1 +++ a/README.md
src/CMakeLists.txt 0 → 100644
  1 +++ a/src/CMakeLists.txt
  1 +cmake_minimum_required(VERSION 3.0)
  2 +LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../cmake)
  3 +include(projectheader)
  4 +project_header(iputils)
  5 +
  6 +find_package( Qt5Core REQUIRED )
  7 +find_package( Qt5Network REQUIRED )
  8 +
  9 +include_directories( SYSTEM
  10 + ${Qt5Core_INCLUDE_DIRS}
  11 + ${Qt5Network_INCLUDE_DIRS}
  12 +)
  13 +
  14 +include(compiler)
  15 +
  16 +include_directories(
  17 + ${CMAKE_CURRENT_SOURCE_DIR}/../logutils
  18 +)
  19 +
  20 +set(SRC_LIST
  21 + ${CMAKE_CURRENT_SOURCE_DIR}/namesolver.cpp
  22 + ${CMAKE_CURRENT_SOURCE_DIR}/autodiscover.cpp
  23 + ${CMAKE_CURRENT_SOURCE_DIR}/hostbuffer.cpp
  24 + ${CMAKE_CURRENT_SOURCE_DIR}/pingrunner.cpp
  25 + ${CMAKE_CURRENT_SOURCE_DIR}/pingdata.cpp
  26 + ${CMAKE_CURRENT_SOURCE_DIR}/pingdataqueue.cpp
  27 + ${CMAKE_CURRENT_SOURCE_DIR}/pingmanager.cpp
  28 + ${CMAKE_CURRENT_SOURCE_DIR}/pingthread.cpp
  29 + ${CMAKE_CURRENT_SOURCE_DIR}/httpclient.cpp
  30 + ${CMAKE_CURRENT_SOURCE_DIR}/compatqt514.h
  31 +)
  32 +
  33 +include(qtmoc)
  34 +create_mocs( SRC_LIST MOC_LIST
  35 + ${CMAKE_CURRENT_SOURCE_DIR}/autodiscover.h
  36 + ${CMAKE_CURRENT_SOURCE_DIR}/hostbuffer.h
  37 + ${CMAKE_CURRENT_SOURCE_DIR}/pingrunner.h
  38 + ${CMAKE_CURRENT_SOURCE_DIR}/pingdataqueue.h
  39 + ${CMAKE_CURRENT_SOURCE_DIR}/pingmanager.h
  40 + ${CMAKE_CURRENT_SOURCE_DIR}/pingthread.h
  41 + ${CMAKE_CURRENT_SOURCE_DIR}/httpclient.h
  42 +)
  43 +
  44 +link_directories(
  45 + ${CMAKE_BINARY_DIR}/lib
  46 +)
  47 +
  48 +include(library)
  49 +add_libraries(
  50 + ${Qt5Core_LIBRARIES}
  51 + ${Qt5Network_LIBRARIES}
  52 + logutils
  53 +)
  54 +
  55 +include(installation)
  56 +install_component()
src/autodiscover.cpp 0 → 100644
  1 +++ a/src/autodiscover.cpp
  1 +/* ****************************************************************************
  2 + * Copyright 2019 Open Systems Development BV *
  3 + * *
  4 + * Permission is hereby granted, free of charge, to any person obtaining a *
  5 + * copy of this software and associated documentation files (the "Software"), *
  6 + * to deal in the Software without restriction, including without limitation *
  7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, *
  8 + * and/or sell copies of the Software, and to permit persons to whom the *
  9 + * Software is furnished to do so, subject to the following conditions: *
  10 + * *
  11 + * The above copyright notice and this permission notice shall be included in *
  12 + * all copies or substantial portions of the Software. *
  13 + * *
  14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
  15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
  16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
  17 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
  18 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *
  19 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *
  20 + * DEALINGS IN THE SOFTWARE. *
  21 + * ***************************************************************************/
  22 +// Local
  23 +#include "autodiscover.h"
  24 +#include "log.h"
  25 +#include "httpclient.h"
  26 +
  27 +// Qt
  28 +#include <QCoreApplication>
  29 +#include <QNetworkInterface>
  30 +#include <QHostAddress>
  31 +
  32 +#include <QtDebug>
  33 +
  34 +using namespace osdev::components;
  35 +
  36 +AutoDiscover::AutoDiscover( QObject *parent )
  37 + : QObject( parent )
  38 + , m_hosts_found( QStringList() )
  39 + , m_hosts_to_check( QStringList() )
  40 + , m_pingManager( 10 )
  41 +{
  42 + // Connect the PingManager to this object
  43 + connect( &m_pingManager, &PingManager::signalAllThreadsFinished, this, &AutoDiscover::slotPingThreadsReady );
  44 +
  45 + // Start the network discovery
  46 + this->startDiscovery();
  47 +}
  48 +
  49 +void AutoDiscover::getNetworks()
  50 +{
  51 + // Make sure we start clean and fresh.
  52 + m_hosts_to_check.clear();
  53 + LogInfo( "[AutoDiscover::getNetworks]", QString( "Starting with %1 hosts in the buffer" ).arg( m_hosts_to_check.count() ) );
  54 + foreach( const QHostAddress &address, QNetworkInterface::allAddresses() )
  55 + {
  56 + if( address.protocol() == QAbstractSocket::IPv4Protocol
  57 + && address != QHostAddress( QHostAddress::LocalHost ) )
  58 + {
  59 + LogInfo( "[AutoDiscover::getNetworks]", QString( "Found network address : %1" ).arg( address.toString() ) );
  60 + QStringList octets = address.toString().split( "." );
  61 + if( octets.size() == 4 )
  62 + {
  63 + for( int host = 1; host < 255; host++ )
  64 + {
  65 + m_hosts_to_check.append( QString( "%1.%2.%3.%4" )
  66 + .arg( octets.at( 0 ) )
  67 + .arg( octets.at( 1 ) )
  68 + .arg( octets.at( 2 ) )
  69 + .arg( host ) );
  70 + }
  71 + }
  72 + }
  73 + }
  74 +}
  75 +
  76 +void AutoDiscover::slotPingThreadsReady()
  77 +{
  78 + LogInfo( "[AutoDiscover::slotPingThreadsReady]", QString( "Wrapping up the pings. Getting all Active IP-addresses" ) );
  79 + // All Threads are done, which means the pingDataQueue is ready for reading.
  80 + QStringList ip_lijst = m_pingManager.getActiveIPs();
  81 +
  82 + for( const auto &ip : ip_lijst )
  83 + {
  84 + LogInfo( "[AutoDiscover::slotPingThreadsReady]",
  85 + QString( "Host : %1 is active." ) .arg( ip ) );
  86 +
  87 + HttpClient *pClient = new HttpClient( this );
  88 + connect( pClient, &HttpClient::signalDataReceived, this, &AutoDiscover::slotDataReceived );
  89 + pClient->sendRequest( ip, "/id" );
  90 + }
  91 +
  92 +}
  93 +
  94 +void AutoDiscover::startDiscovery()
  95 +{
  96 + // Produce all nodes within this network
  97 + getNetworks();
  98 + // Check if the found hosts are actually sensors.
  99 + checkHost();
  100 +}
  101 +
  102 +void AutoDiscover::checkHost()
  103 +{
  104 + LogInfo( "[AutoDiscover::checkHost]", QString( "Adding %1 hosts to the pingmanager" ).arg( m_hosts_to_check.count() ) );
  105 + m_pingManager.addHosts( m_hosts_to_check );
  106 + m_pingManager.startPingTests();
  107 +}
  108 +
  109 +void AutoDiscover::slotDataReceived( const QString &ip_address, const QString &data, QObject *client )
  110 +{
  111 + if( data.contains( "CO2MOS" ) )
  112 + {
  113 + LogInfo( "[AutoDiscover::slotDataReceived]", QString( "Host : %1 seems to be a CO2MOS Smart Sensor. Data Received : %2" )
  114 + .arg( ip_address )
  115 + .arg( data ) );
  116 +
  117 + // Send this ip-address with String, Id and IP-address, separated by colons.
  118 + emit signalSensorFound( data );
  119 + }
  120 + else
  121 + {
  122 + LogInfo( "[AutoDiscover::slotDataReceived]", QString( "Host : %1 doesn't seem to be a CO2 Sensor." ).arg( ip_address ) );
  123 + }
  124 +
  125 + if( client )
  126 + {
  127 + LogInfo( "[AutoDiscover::slotDataReceived]", QString( "Deleting the ClientObject will be done if the parent object is removed." ) );
  128 + // delete client;
  129 + }
  130 +}
src/autodiscover.h 0 → 100644
  1 +++ a/src/autodiscover.h
  1 +/* ****************************************************************************
  2 + * Copyright 2019 Open Systems Development BV *
  3 + * *
  4 + * Permission is hereby granted, free of charge, to any person obtaining a *
  5 + * copy of this software and associated documentation files (the "Software"), *
  6 + * to deal in the Software without restriction, including without limitation *
  7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, *
  8 + * and/or sell copies of the Software, and to permit persons to whom the *
  9 + * Software is furnished to do so, subject to the following conditions: *
  10 + * *
  11 + * The above copyright notice and this permission notice shall be included in *
  12 + * all copies or substantial portions of the Software. *
  13 + * *
  14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
  15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
  16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
  17 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
  18 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *
  19 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *
  20 + * DEALINGS IN THE SOFTWARE. *
  21 + * ***************************************************************************/
  22 +#ifndef OSDEV_COMPONENTS_AUTODISCOVER_H
  23 +#define OSDEV_COMPONENTS_AUTODISCOVER_H
  24 +
  25 +// Qt
  26 +#include <QObject>
  27 +#include <QString>
  28 +#include <QStringList>
  29 +#include <QPointer>
  30 +
  31 +// Local
  32 +#include "pingmanager.h"
  33 +/*
  34 + _______________________________________
  35 +/ Dealing with failure is easy: \
  36 +| |
  37 +| Work hard to improve. Success is also |
  38 +| easy to handle: |
  39 +| |
  40 +| You've solved the wrong problem. |
  41 +| |
  42 +\ Work hard to improve. /
  43 + ---------------------------------------
  44 + .--.
  45 + |o_o |
  46 + |:_/ |
  47 + // \ \
  48 + (| | )
  49 + /'\_ _/`\
  50 + \___)=(___/
  51 +*/
  52 +
  53 +namespace osdev {
  54 +namespace components {
  55 +
  56 +/*!
  57 + * \brief Autodiscover will check the NIC for its networkaddress and scans
  58 + * the network for connected and active sensors.
  59 + */
  60 +class AutoDiscover : public QObject
  61 +{
  62 + Q_OBJECT
  63 +
  64 +public:
  65 + /*!
  66 + * \brief AutoDiscover - The default Constructor
  67 + * \param parent - The calling QObject
  68 + */
  69 + explicit AutoDiscover( QObject *parent = nullptr );
  70 +
  71 +public slots:
  72 + /*!
  73 + * \brief startDiscovery - Start scanning the network for active sensors.
  74 + */
  75 + void startDiscovery();
  76 +
  77 +private slots:
  78 + /*!
  79 + * \brief slotPingThreadsReady - Will be called when all threads are ready
  80 + */
  81 + void slotPingThreadsReady();
  82 +
  83 + /*!
  84 + * \brief slotDataReceived - Called by the thread that received data.
  85 + * \param ip_address - The ip-address of the sensor
  86 + * \param data - The data received
  87 + * \param client - The pointer to the calling object. Can be NULL in most cases.
  88 + */
  89 + void slotDataReceived( const QString &ip_address, const QString &data, QObject *client = nullptr );
  90 +
  91 +signals:
  92 + /*!
  93 + * \brief signalSensorFound - Signal will fire when data was received from one of the threads.
  94 + * \param data - The received data.
  95 + */
  96 + void signalSensorFound( const QString &data );
  97 +
  98 +private:
  99 + /// Determine the network subnet(s) we're living in.
  100 + void getNetworks();
  101 + /// CHeck all found hosts if they respond to the ID query
  102 + void checkHost();
  103 +
  104 +private: // Members ( Giggity! )
  105 + QStringList m_hosts_found;
  106 + QStringList m_hosts_to_check;
  107 +
  108 + PingManager m_pingManager;
  109 +
  110 +};
  111 +
  112 +} /* End namespace components */
  113 +} /* End namespace osdev */
  114 +
  115 +#endif /* OSDEV_COMPONENTS_AUTODISCOVER_H */
src/compatqt514.h 0 → 100644
  1 +++ a/src/compatqt514.h
  1 +/* ****************************************************************************
  2 + * Copyright 2019 Open Systems Development BV *
  3 + * *
  4 + * Permission is hereby granted, free of charge, to any person obtaining a *
  5 + * copy of this software and associated documentation files (the "Software"), *
  6 + * to deal in the Software without restriction, including without limitation *
  7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, *
  8 + * and/or sell copies of the Software, and to permit persons to whom the *
  9 + * Software is furnished to do so, subject to the following conditions: *
  10 + * *
  11 + * The above copyright notice and this permission notice shall be included in *
  12 + * all copies or substantial portions of the Software. *
  13 + * *
  14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
  15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
  16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
  17 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
  18 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *
  19 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *
  20 + * DEALINGS IN THE SOFTWARE. *
  21 + * ***************************************************************************/
  22 +#ifndef OSDEV_COMPONENTS_COMPATQT514_H
  23 +#define OSDEV_COMPONENTS_COMPATQT514_H
  24 +
  25 +#include <QtCore>
  26 +
  27 +/*
  28 + _________________________________________
  29 +/ This conjunction of an immense military \
  30 +| establishment and a large arms industry |
  31 +| is now in the American experience... We |
  32 +| must not fail to comprehend its grave |
  33 +| implications... We must guard against |
  34 +| the acquisition of unwarranted |
  35 +| influence...by the military-industrial |
  36 +| complex. The potential for the |
  37 +| disastrous rise of misplaced power |
  38 +| exists and will persist. |
  39 +| |
  40 +| -- Dwight D. Eisenhower, from his |
  41 +\ farewell address in 1961 /
  42 + -----------------------------------------
  43 + \
  44 + \
  45 + .--.
  46 + |o_o |
  47 + |:_/ |
  48 + // \ \
  49 + (| | )
  50 + /'\_ _/`\
  51 + \___)=(___/
  52 +*/
  53 +
  54 +// A little something to satisfy the namespace change in Qt.
  55 +#if(QT_VERSION >= QT_VERSION_CHECK( 5, 14, 0) )
  56 +#define SKIP_EMPTY_PARTS Qt::SkipEmptyParts
  57 +#else
  58 +#define SKIP_EMPTY_PARTS QString::SkipEmptyParts
  59 +#endif
  60 +
  61 +#endif /* OSDEV_COMPONENTS_COMPATQT514_H */
src/hostbuffer.cpp 0 → 100644
  1 +++ a/src/hostbuffer.cpp
  1 +/* ****************************************************************************
  2 + * Copyright 2019 Open Systems Development BV *
  3 + * *
  4 + * Permission is hereby granted, free of charge, to any person obtaining a *
  5 + * copy of this software and associated documentation files (the "Software"), *
  6 + * to deal in the Software without restriction, including without limitation *
  7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, *
  8 + * and/or sell copies of the Software, and to permit persons to whom the *
  9 + * Software is furnished to do so, subject to the following conditions: *
  10 + * *
  11 + * The above copyright notice and this permission notice shall be included in *
  12 + * all copies or substantial portions of the Software. *
  13 + * *
  14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
  15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
  16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
  17 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
  18 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *
  19 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *
  20 + * DEALINGS IN THE SOFTWARE. *
  21 + * ***************************************************************************/
  22 +#include "hostbuffer.h"
  23 +
  24 +using namespace osdev::components;
  25 +
  26 +HostBuffer::HostBuffer( QObject *parent )
  27 + : QObject( parent )
  28 + , m_data( QStringList() )
  29 + , m_mutList()
  30 +{
  31 +
  32 +}
  33 +
  34 +HostBuffer::HostBuffer( const QStringList &host_list, QObject *parent )
  35 + : QObject( parent )
  36 + , m_data( host_list )
  37 + , m_mutList()
  38 +{
  39 +
  40 +}
  41 +
  42 +int HostBuffer::addHost( const QString &host )
  43 +{
  44 + QMutexLocker lock( &m_mutList );
  45 + m_data.append( host );
  46 +
  47 + return m_data.size();
  48 +}
  49 +
  50 +int HostBuffer::addHosts( const QStringList &host_list )
  51 +{
  52 + for( QString host : host_list )
  53 + {
  54 + this->addHost( host );
  55 + }
  56 + return m_data.size();
  57 +}
  58 +
  59 +QString HostBuffer::getHost()
  60 +{
  61 + QMutexLocker lock( &m_mutList );
  62 + if( m_data.size() > 0 )
  63 + {
  64 + return m_data.takeFirst();
  65 + }
  66 +
  67 + return QString();
  68 +}
  69 +
  70 +int HostBuffer::count()
  71 +{
  72 + QMutexLocker lock( &m_mutList );
  73 + return m_data.size();
  74 +}
src/hostbuffer.h 0 → 100644
  1 +++ a/src/hostbuffer.h
  1 +/* ****************************************************************************
  2 + * Copyright 2019 Open Systems Development BV *
  3 + * *
  4 + * Permission is hereby granted, free of charge, to any person obtaining a *
  5 + * copy of this software and associated documentation files (the "Software"), *
  6 + * to deal in the Software without restriction, including without limitation *
  7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, *
  8 + * and/or sell copies of the Software, and to permit persons to whom the *
  9 + * Software is furnished to do so, subject to the following conditions: *
  10 + * *
  11 + * The above copyright notice and this permission notice shall be included in *
  12 + * all copies or substantial portions of the Software. *
  13 + * *
  14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
  15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
  16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
  17 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
  18 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *
  19 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *
  20 + * DEALINGS IN THE SOFTWARE. *
  21 + * ***************************************************************************/
  22 +#ifndef OSDEV_COMPONENTS_HOSTBUFFER_H
  23 +#define OSDEV_COMPONENTS_HOSTBUFFER_H
  24 +
  25 +#include <QObject>
  26 +#include <QStringList>
  27 +#include <QMutexLocker>
  28 +#include <QMutex>
  29 +
  30 +namespace osdev {
  31 +namespace components {
  32 +
  33 +class HostBuffer : public QObject
  34 +{
  35 + Q_OBJECT
  36 +
  37 +public:
  38 + /// Default CTor
  39 + HostBuffer( QObject *parent = nullptr );
  40 +
  41 + /// Overloaded constuctor taken a host list during initialisation
  42 + HostBuffer( const QStringList &host_list, QObject *parent = nullptr );
  43 +
  44 + /// Adds a single host to the buffer
  45 + int addHost( const QString &host );
  46 +
  47 + /// Adds a list of hosts. It will not overwrite hosts already present but adds them.
  48 + int addHosts( const QStringList &host_list );
  49 +
  50 + /// Retrieve -a- host from the buffer. It will be removed!
  51 + QString getHost();
  52 +
  53 + /// Get the number of hosts in the buffer
  54 + int count();
  55 +
  56 +private:
  57 + QStringList m_data;
  58 + QMutex m_mutList;
  59 +};
  60 +
  61 +} /* End namespace components */
  62 +} /* End namespace osdev */
  63 +
  64 +#endif /* OSDEV_COMPONENTS_HOSTBUFFER_H */
src/httpclient.cpp 0 → 100644
  1 +++ a/src/httpclient.cpp
  1 +/* ****************************************************************************
  2 + * Copyright 2019 Open Systems Development BV *
  3 + * *
  4 + * Permission is hereby granted, free of charge, to any person obtaining a *
  5 + * copy of this software and associated documentation files (the "Software"), *
  6 + * to deal in the Software without restriction, including without limitation *
  7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, *
  8 + * and/or sell copies of the Software, and to permit persons to whom the *
  9 + * Software is furnished to do so, subject to the following conditions: *
  10 + * *
  11 + * The above copyright notice and this permission notice shall be included in *
  12 + * all copies or substantial portions of the Software. *
  13 + * *
  14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
  15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
  16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
  17 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
  18 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *
  19 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *
  20 + * DEALINGS IN THE SOFTWARE. *
  21 + * ***************************************************************************/
  22 +#include "httpclient.h"
  23 +#include "log.h"
  24 +
  25 +using namespace osdev::components;
  26 +
  27 +HttpClient::HttpClient( QObject *parent )
  28 + : QObject( parent )
  29 + , m_pNetworkManager( new QNetworkAccessManager( this ) )
  30 +{
  31 + this->connectSignalsToSlots();
  32 +}
  33 +
  34 +void HttpClient::connectSignalsToSlots()
  35 +{
  36 + connect( m_pNetworkManager.data(), &QNetworkAccessManager::finished, this, &HttpClient::slotHttpRequestFinished );
  37 +}
  38 +
  39 +void HttpClient::sendRequest( const QString &ip_address, const QString &argument )
  40 +{
  41 + QUrl l_url = QString( "http://" + ip_address + argument );
  42 + m_pNetworkManager->get( QNetworkRequest( l_url ) );
  43 +}
  44 +
  45 +void HttpClient::slotHttpRequestFinished( QNetworkReply *data )
  46 +{
  47 + if( data )
  48 + {
  49 + switch( data->error() )
  50 + {
  51 + case QNetworkReply::NoError:
  52 + {
  53 + QString l_data = data->readAll();
  54 + emit signalDataReceived( data->url().toString(), l_data, this );
  55 + break;
  56 + }
  57 + case QNetworkReply::TimeoutError:
  58 + {
  59 + // Set all data to '0' to indicate the sensor offline
  60 + break;
  61 + }
  62 + case QNetworkReply::ConnectionRefusedError:
  63 + case QNetworkReply::RemoteHostClosedError:
  64 + case QNetworkReply::HostNotFoundError:
  65 + case QNetworkReply::OperationCanceledError:
  66 + case QNetworkReply::SslHandshakeFailedError:
  67 + case QNetworkReply::TemporaryNetworkFailureError:
  68 + case QNetworkReply::NetworkSessionFailedError:
  69 + case QNetworkReply::BackgroundRequestNotAllowedError:
  70 +#if(QT_VERSION > QT_VERSION_CHECK( 5, 6, 0) )
  71 + case QNetworkReply::TooManyRedirectsError:
  72 + case QNetworkReply::InsecureRedirectError:
  73 +#endif
  74 + case QNetworkReply::ProxyConnectionRefusedError:
  75 + case QNetworkReply::ProxyConnectionClosedError:
  76 + case QNetworkReply::ProxyNotFoundError:
  77 + case QNetworkReply::ProxyTimeoutError:
  78 + case QNetworkReply::ProxyAuthenticationRequiredError:
  79 + case QNetworkReply::ContentAccessDenied:
  80 + case QNetworkReply::ContentOperationNotPermittedError:
  81 + case QNetworkReply::ContentNotFoundError:
  82 + case QNetworkReply::AuthenticationRequiredError:
  83 + case QNetworkReply::ContentReSendError:
  84 + case QNetworkReply::ContentConflictError:
  85 + case QNetworkReply::ContentGoneError:
  86 + case QNetworkReply::InternalServerError:
  87 + case QNetworkReply::OperationNotImplementedError:
  88 + case QNetworkReply::ServiceUnavailableError:
  89 + case QNetworkReply::ProtocolUnknownError:
  90 + case QNetworkReply::ProtocolInvalidOperationError:
  91 + case QNetworkReply::UnknownNetworkError:
  92 + case QNetworkReply::UnknownProxyError:
  93 + case QNetworkReply::UnknownContentError:
  94 + case QNetworkReply::ProtocolFailure:
  95 + case QNetworkReply::UnknownServerError:
  96 + {
  97 + LogWarning( "[HttpClient::slotHttpRequestFinished]",
  98 + QString( "The following error occured : %1. Host : %2" )
  99 + .arg( data->errorString() )
  100 + .arg( data->url().host() ) );
  101 + break;
  102 + }
  103 + }
  104 + }
  105 +}
src/httpclient.h 0 → 100644
  1 +++ a/src/httpclient.h
  1 +/* ****************************************************************************
  2 + * Copyright 2019 Open Systems Development BV *
  3 + * *
  4 + * Permission is hereby granted, free of charge, to any person obtaining a *
  5 + * copy of this software and associated documentation files (the "Software"), *
  6 + * to deal in the Software without restriction, including without limitation *
  7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, *
  8 + * and/or sell copies of the Software, and to permit persons to whom the *
  9 + * Software is furnished to do so, subject to the following conditions: *
  10 + * *
  11 + * The above copyright notice and this permission notice shall be included in *
  12 + * all copies or substantial portions of the Software. *
  13 + * *
  14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
  15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
  16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
  17 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
  18 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *
  19 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *
  20 + * DEALINGS IN THE SOFTWARE. *
  21 + * ***************************************************************************/
  22 +#ifndef OSDEV_COMPONENTS_HTTPCLIENT_H
  23 +#define OSDEV_COMPONENTS_HTTPCLIENT_H
  24 +
  25 +#include <QObject>
  26 +#include <QNetworkAccessManager>
  27 +#include <QNetworkReply>
  28 +#include <QNetworkRequest>
  29 +#include <QPointer>
  30 +
  31 +/*_________________________________________
  32 +/ "I got into an elevator at work and \
  33 +| this man followed in after me... I |
  34 +| pushed '1' and he just stood there... I |
  35 +| said 'Hi, where you going?' He said, |
  36 +| 'Phoenix.' So I pushed Phoenix. A few |
  37 +| seconds later the doors opened, two |
  38 +| tumbleweeds blew in... we were in |
  39 +| downtown Phoenix. I looked at him and |
  40 +| said 'You know, you're the kind of guy |
  41 +| I want to hang around with.' We got |
  42 +| into his car and drove out to his shack |
  43 +| in the desert. Then the phone rang. He |
  44 +| said 'You get it.' I picked it up and |
  45 +| said 'Hello?'... the other side said |
  46 +| 'Is this Steven Wright?'... I said |
  47 +| 'Yes...' The guy said 'Hi, I'm Mr. |
  48 +| Jones, the student loan director from |
  49 +| your bank... It seems you have missed |
  50 +| your last 17 payments, and the |
  51 +| university you attended said that they |
  52 +| received none of the $17,000 we loaned |
  53 +| you... we would just like to know what |
  54 +| happened to the money?' I said, 'Mr. |
  55 +| Jones, I'll give it to you straight. I |
  56 +| gave all of the money to my friend |
  57 +| Slick, and with it he built a nuclear |
  58 +| weapon... and I would appreciate it if |
  59 +| you never called me again." |
  60 +| |
  61 +\ -- Steven Wright /
  62 + -----------------------------------------
  63 + \
  64 + \
  65 + .--.
  66 + |o_o |
  67 + |:_/ |
  68 + // \ \
  69 + (| | )
  70 + /'\_ _/`\
  71 + \___)=(___/
  72 +*/
  73 +
  74 +namespace osdev {
  75 +namespace components {
  76 +
  77 +class HttpClient : public QObject
  78 +{
  79 + Q_OBJECT
  80 +
  81 +public:
  82 + /// Default CTor
  83 + explicit HttpClient( QObject *parent = nullptr );
  84 +
  85 +signals:
  86 + /// Triggered when net data comes in
  87 + void signalDataReceived( const QString &ip_address, const QString &data, QObject *client = nullptr ) ;
  88 +
  89 +public slots:
  90 + /*!
  91 + * \brief sendRequest - Sends the request to the ip_address with the argument. ( Full URL ).
  92 + * \param ip_address - The ip_address we send the request to...
  93 + * \param argument - The argument that will complete the URL.
  94 + */
  95 + void sendRequest( const QString &ip_address, const QString &argument = "/" );
  96 +
  97 +private slots:
  98 + void slotHttpRequestFinished( QNetworkReply *data );
  99 +
  100 +private: // Methods
  101 + void connectSignalsToSlots();
  102 +
  103 +private: // Members ( Giggity! )
  104 + QPointer<QNetworkAccessManager> m_pNetworkManager;
  105 +};
  106 +
  107 +} /* End namespace components */
  108 +} /* End namespace osdev */
  109 +
  110 +#endif /* OSDEV_COMPONENTS_HTTPCLIENT_H */
src/httpclientmanager.cpp 0 → 100644
  1 +++ a/src/httpclientmanager.cpp
  1 +/* ****************************************************************************
  2 + * Copyright 2019 Open Systems Development BV *
  3 + * *
  4 + * Permission is hereby granted, free of charge, to any person obtaining a *
  5 + * copy of this software and associated documentation files (the "Software"), *
  6 + * to deal in the Software without restriction, including without limitation *
  7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, *
  8 + * and/or sell copies of the Software, and to permit persons to whom the *
  9 + * Software is furnished to do so, subject to the following conditions: *
  10 + * *
  11 + * The above copyright notice and this permission notice shall be included in *
  12 + * all copies or substantial portions of the Software. *
  13 + * *
  14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
  15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
  16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
  17 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
  18 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *
  19 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *
  20 + * DEALINGS IN THE SOFTWARE. *
  21 + * ***************************************************************************/
  22 +#include "httpclientmanager.h"
  23 +
  24 +
  25 +
  26 +HttpClientManager::HttpClientManager( QObject *parent )
  27 + : QObject( parent )
  28 +{
  29 +
  30 +}
src/httpclientmanager.h 0 → 100644
  1 +++ a/src/httpclientmanager.h
  1 +/* ****************************************************************************
  2 + * Copyright 2019 Open Systems Development BV *
  3 + * *
  4 + * Permission is hereby granted, free of charge, to any person obtaining a *
  5 + * copy of this software and associated documentation files (the "Software"), *
  6 + * to deal in the Software without restriction, including without limitation *
  7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, *
  8 + * and/or sell copies of the Software, and to permit persons to whom the *
  9 + * Software is furnished to do so, subject to the following conditions: *
  10 + * *
  11 + * The above copyright notice and this permission notice shall be included in *
  12 + * all copies or substantial portions of the Software. *
  13 + * *
  14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
  15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
  16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
  17 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
  18 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *
  19 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *
  20 + * DEALINGS IN THE SOFTWARE. *
  21 + * ***************************************************************************/
  22 +#ifndef OSDEV_COMPONENTS_HTTPCLIENTMANAGER_H
  23 +#define OSDEV_COMPONENTS_HTTPCLIENTMANAGER_H
  24 +
  25 +#include <QObject>
  26 +#include <QStringList>
  27 +#include <QList>
  28 +
  29 +#include "httpclientthread.h"
  30 +
  31 +namespace osdev {
  32 +namespace components {
  33 +
  34 +class HttpClientManager : public QObject
  35 +{
  36 + Q_OBJECT
  37 +
  38 +public:
  39 + explicit HttpClientManager( QObject *parent = nullptr );
  40 +
  41 + HttpClientManager( const HttpClientManager& ) = delete;
  42 + HttpClientManager( const HttpClientManager&& ) = delete;
  43 + HttpClientManager& operator=( const HttpClientManager& ) = delete;
  44 + HttpClientManager& operator=( const HttpClientManager&& ) = delete;
  45 +
  46 + virtual ~HttpClientManager();
  47 +
  48 +
  49 +
  50 +signals:
  51 +
  52 +};
  53 +
  54 +} /* End namespace components */
  55 +} /* End namespace osdev */
  56 +
  57 +#endif /* OSDEV_COMPONENTS_HTTPCLIENTMANAGER_H */
src/httpclientthread.cpp 0 → 100644
  1 +++ a/src/httpclientthread.cpp
  1 +/* ****************************************************************************
  2 + * Copyright 2019 Open Systems Development BV *
  3 + * *
  4 + * Permission is hereby granted, free of charge, to any person obtaining a *
  5 + * copy of this software and associated documentation files (the "Software"), *
  6 + * to deal in the Software without restriction, including without limitation *
  7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, *
  8 + * and/or sell copies of the Software, and to permit persons to whom the *
  9 + * Software is furnished to do so, subject to the following conditions: *
  10 + * *
  11 + * The above copyright notice and this permission notice shall be included in *
  12 + * all copies or substantial portions of the Software. *
  13 + * *
  14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
  15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
  16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
  17 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
  18 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *
  19 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *
  20 + * DEALINGS IN THE SOFTWARE. *
  21 + * ***************************************************************************/
  22 +#include "httpclientthread.h"
  23 +
  24 +
  25 +
  26 +HttpClientThread::HttpClientThread()
  27 +{
  28 +
  29 +}
src/httpclientthread.h 0 → 100644
  1 +++ a/src/httpclientthread.h
  1 +/* ****************************************************************************
  2 + * Copyright 2019 Open Systems Development BV *
  3 + * *
  4 + * Permission is hereby granted, free of charge, to any person obtaining a *
  5 + * copy of this software and associated documentation files (the "Software"), *
  6 + * to deal in the Software without restriction, including without limitation *
  7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, *
  8 + * and/or sell copies of the Software, and to permit persons to whom the *
  9 + * Software is furnished to do so, subject to the following conditions: *
  10 + * *
  11 + * The above copyright notice and this permission notice shall be included in *
  12 + * all copies or substantial portions of the Software. *
  13 + * *
  14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
  15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
  16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
  17 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
  18 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *
  19 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *
  20 + * DEALINGS IN THE SOFTWARE. *
  21 + * ***************************************************************************/
  22 +#ifndef OSDEV_COMPONENTS_HTTPCLIENTTHREAD_H
  23 +#define OSDEV_COMPONENTS_HTTPCLIENTTHREAD_H
  24 +
  25 +#include <QThread>
  26 +#include <QString>
  27 +
  28 +namespace osdev {
  29 +namespace components {
  30 +
  31 +class HttpClientThread : public QThread
  32 +{
  33 + Q_OBJECT
  34 +
  35 +public:
  36 + HttpClientThread( const QString &ip_address, const QString &url, QObject *parent = nullptr );
  37 +
  38 + HttpClientThread( const HttpClientThread& ) = delete;
  39 + HttpClientThread( const HttpClientThread&& ) = delete;
  40 + HttpClientThread& operator=( const HttpClientThread& ) = delete;
  41 + HttpClientThread& operator=( const HttpClientThread&& ) = delete;
  42 +
  43 + virtual ~HttpClientThread() {}
  44 +
  45 + void setPriority( QThread::Priority priority = QThread::NormalPriority );
  46 + void run() override;
  47 +
  48 +public:
  49 + void slotStartThread();
  50 +
  51 + void slotThreadFinished();
  52 +
  53 +signals:
  54 + void signalThreadFinished( QThread *thread );
  55 +
  56 +};
  57 +
  58 +} /* End namespace components */
  59 +} /* End namespace osdev */
  60 +
  61 +#endif /* OSDEV_COMPONENTS_HTTPCLIENTTHREAD_H */
src/namesolver.cpp 0 → 100644
  1 +++ a/src/namesolver.cpp
  1 +/* ****************************************************************************
  2 + * Copyright 2019 Open Systems Development BV *
  3 + * *
  4 + * Permission is hereby granted, free of charge, to any person obtaining a *
  5 + * copy of this software and associated documentation files (the "Software"), *
  6 + * to deal in the Software without restriction, including without limitation *
  7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, *
  8 + * and/or sell copies of the Software, and to permit persons to whom the *
  9 + * Software is furnished to do so, subject to the following conditions: *
  10 + * *
  11 + * The above copyright notice and this permission notice shall be included in *
  12 + * all copies or substantial portions of the Software. *
  13 + * *
  14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
  15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
  16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
  17 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
  18 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *
  19 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *
  20 + * DEALINGS IN THE SOFTWARE. *
  21 + * ***************************************************************************/
  22 +// Local
  23 +#include "namesolver.h"
  24 +#include "log.h"
  25 +
  26 +// System
  27 +#include <string.h>
  28 +#include <errno.h>
  29 +
  30 +using namespace osdev::components;
  31 +
  32 +QStringList NameSolver::hostname_to_ip( const QString &host_name )
  33 +{
  34 + QStringList sResult;
  35 +
  36 + char ip_arr[100];
  37 +
  38 + struct addrinfo hints, *servinfo, *p;
  39 + struct sockaddr_in *h;
  40 + int rv;
  41 +
  42 + memset( &hints, 0, sizeof( hints ) );
  43 + hints.ai_family = AF_UNSPEC;
  44 + hints.ai_socktype = SOCK_STREAM;
  45 +
  46 + if( ( rv = getaddrinfo( host_name.toLatin1().data(), nullptr, &hints, &servinfo ) ) != 0 )
  47 + {
  48 + LogInfo( "[NameSolver::hostname_to_ip]", QString( "getaddrinfo : %1" ).arg( gai_strerror( rv ) ) );
  49 + return sResult;
  50 + }
  51 +
  52 + // Loop through all the results and connect to the first we can
  53 + for( p = servinfo; p != nullptr; p = p->ai_next )
  54 + {
  55 + h = reinterpret_cast<struct sockaddr_in *>( p->ai_addr );
  56 + strcpy( ip_arr, inet_ntoa( h->sin_addr ) );
  57 + sResult.append( QString( reinterpret_cast<const char*>( ip_arr ) ) );
  58 + }
  59 +
  60 + freeaddrinfo( servinfo );
  61 + return sResult;
  62 +}
src/namesolver.h 0 → 100644
  1 +++ a/src/namesolver.h
  1 +/* ****************************************************************************
  2 + * Copyright 2019 Open Systems Development BV *
  3 + * *
  4 + * Permission is hereby granted, free of charge, to any person obtaining a *
  5 + * copy of this software and associated documentation files (the "Software"), *
  6 + * to deal in the Software without restriction, including without limitation *
  7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, *
  8 + * and/or sell copies of the Software, and to permit persons to whom the *
  9 + * Software is furnished to do so, subject to the following conditions: *
  10 + * *
  11 + * The above copyright notice and this permission notice shall be included in *
  12 + * all copies or substantial portions of the Software. *
  13 + * *
  14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
  15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
  16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
  17 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
  18 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *
  19 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *
  20 + * DEALINGS IN THE SOFTWARE. *
  21 + * ***************************************************************************/
  22 +#ifndef OSDEV_COMPONENTS_NAMESOLVER_H
  23 +#define OSDEV_COMPONENTS_NAMESOLVER_H
  24 +
  25 +// Qt
  26 +#include <QStringList>
  27 +
  28 +// System
  29 +#include <sys/socket.h>
  30 +#include <netdb.h>
  31 +#include <arpa/inet.h>
  32 +
  33 +namespace osdev {
  34 +namespace components {
  35 +
  36 +class NameSolver
  37 +{
  38 +public:
  39 + explicit NameSolver();
  40 +
  41 + static QStringList hostname_to_ip( const QString &host_name );
  42 +};
  43 +
  44 +} /* End namespace components */
  45 +} /* End namespace osdev */
  46 +
  47 +#endif /* OSDEV_COMPONENTS_NAMESOLVER_H */
src/pingdata.cpp 0 → 100644
  1 +++ a/src/pingdata.cpp
  1 +/* ****************************************************************************
  2 + * Copyright 2019 Open Systems Development BV *
  3 + * *
  4 + * Permission is hereby granted, free of charge, to any person obtaining a *
  5 + * copy of this software and associated documentation files (the "Software"), *
  6 + * to deal in the Software without restriction, including without limitation *
  7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, *
  8 + * and/or sell copies of the Software, and to permit persons to whom the *
  9 + * Software is furnished to do so, subject to the following conditions: *
  10 + * *
  11 + * The above copyright notice and this permission notice shall be included in *
  12 + * all copies or substantial portions of the Software. *
  13 + * *
  14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
  15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
  16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
  17 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
  18 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *
  19 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *
  20 + * DEALINGS IN THE SOFTWARE. *
  21 + * ***************************************************************************/
  22 +// Local
  23 +#include "pingdata.h"
  24 +#include "compatqt514.h"
  25 +
  26 +// Qt
  27 +#include <QtDebug>
  28 +
  29 +using namespace osdev::components;
  30 +
  31 +PingData::PingData()
  32 + : m_time_stamp()
  33 + , m_host_name()
  34 + , m_ip_address()
  35 + , m_packet_loss( 0 )
  36 + , m_rtt_min( 0 )
  37 + , m_rtt_avg( 0 )
  38 + , m_rtt_max( 0 )
  39 + , m_rtt_mdev( 0 )
  40 + , m_available( false )
  41 +{
  42 +
  43 +}
  44 +
  45 +PingData::PingData( const QString &host_name, const QStringList &output_data )
  46 + : m_time_stamp()
  47 + , m_host_name( host_name )
  48 + , m_ip_address()
  49 + , m_packet_loss( 0 )
  50 + , m_rtt_min( 0 )
  51 + , m_rtt_avg( 0 )
  52 + , m_rtt_max( 0 )
  53 + , m_rtt_mdev( 0 )
  54 + , m_available( false )
  55 +{
  56 + parseOutputData( output_data );
  57 +}
  58 +
  59 +PingData::~PingData()
  60 +{
  61 +
  62 +}
  63 +
  64 +void PingData::parseOutputData( const QStringList &output_data )
  65 +{
  66 + m_time_stamp = QDateTime::currentDateTime();
  67 + if( output_data.size() == 5 )
  68 + {
  69 + // -------------------------------------------------------------------------
  70 + // Get the IP-Address from the structure
  71 + // Format of the line : PING osdev.nl (x.x.x.x) 56(84) bytes of data.
  72 + QString ipAddr = output_data.at(1).split( " ", SKIP_EMPTY_PARTS ).at( 2 );
  73 + m_ip_address = ipAddr.replace( "(", "" ).replace( ")", "" );
  74 +
  75 + // -------------------------------------------------------------------------
  76 + // Get the packet losses
  77 + if( output_data.at( 3 ).split( " ", SKIP_EMPTY_PARTS ).size() < 12 )
  78 + {
  79 + QString s_losses = output_data.at( 3 ).split( " ", SKIP_EMPTY_PARTS ).at( 5 );
  80 + m_packet_loss = s_losses.replace( "%", "" ).toInt();
  81 + }
  82 + else if( output_data.at( 3 ).split( " ", SKIP_EMPTY_PARTS ).size() > 2 )
  83 + {
  84 + QString s_losses = output_data.at( 3 ).split( " ", SKIP_EMPTY_PARTS ).at( 7 );
  85 + m_packet_loss = s_losses.replace( "%", "" ).toInt();
  86 + }
  87 +
  88 + // -------------------------------------------------------------------------
  89 + // Get the min/max statistics.
  90 + if( output_data.at( 4 ).split( " ", SKIP_EMPTY_PARTS ).size() > 2 )
  91 + {
  92 + QString s_statline = output_data.at( 4 ).split( " ", SKIP_EMPTY_PARTS ).at( 3 );
  93 + QStringList s_lstData = s_statline.split( "/", SKIP_EMPTY_PARTS );
  94 +
  95 + m_rtt_min = s_lstData.at( 0 ).toFloat();
  96 + m_rtt_avg = s_lstData.at( 1 ).toFloat();
  97 + m_rtt_max = s_lstData.at( 2 ).toFloat();
  98 + m_rtt_mdev = s_lstData.at( 3 ).toFloat();
  99 + }
  100 +
  101 + if( output_data.at( 3 ).contains( "100% packet loss" ) )
  102 + {
  103 + m_available = false;
  104 + }
  105 + else
  106 + {
  107 + m_available = true;
  108 + }
  109 + }
  110 + else if( output_data.size() == 4 )
  111 + {
  112 + // Get the IP-Address
  113 + QString ipAddr = output_data.at( 1 ).split( " ", SKIP_EMPTY_PARTS ).at( 2 );
  114 + m_ip_address = ipAddr.replace( "(", "" ).replace( ")", "" );
  115 +
  116 + // Get the packet losses
  117 + QString s_losses = output_data.at( 3 ).split( " ", SKIP_EMPTY_PARTS ).at( 5 );
  118 + m_packet_loss = s_losses.replace( "%", "" ).toInt();
  119 +
  120 + m_available = false;
  121 + }
  122 +}
  123 +
  124 +
  125 +QString PingData::asString()
  126 +{
  127 + QString sResult;
  128 +
  129 + sResult += QString( "Hostname : %1\n" ).arg( m_host_name );
  130 + sResult += QString( "\t|-> IpAddress : %1\n" ).arg( m_ip_address );
  131 + sResult += QString( "\t|-> Packet loss : %1\n" ).arg( m_packet_loss );
  132 + sResult += QString( "\t|-> RTT min : %1\n" ).arg( m_rtt_min );
  133 + sResult += QString( "\t|-> RTT max : %1\n" ).arg( m_rtt_max );
  134 + sResult += QString( "\t|-> RTT average : %1\n" ).arg( m_rtt_avg );
  135 + sResult += QString( "\t|-> RTT mdev : %1\n" ).arg( m_rtt_mdev );
  136 + sResult += QString( "\t|-> Available : " );
  137 + if( m_available )
  138 + {
  139 + sResult += QString( "yes\n" );
  140 + }
  141 + else
  142 + {
  143 + sResult += QString( "no\n" );
  144 + }
  145 +
  146 + return sResult;
  147 +}
src/pingdata.h 0 → 100644
  1 +++ a/src/pingdata.h
  1 +/* ****************************************************************************
  2 + * Copyright 2019 Open Systems Development BV *
  3 + * *
  4 + * Permission is hereby granted, free of charge, to any person obtaining a *
  5 + * copy of this software and associated documentation files (the "Software"), *
  6 + * to deal in the Software without restriction, including without limitation *
  7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, *
  8 + * and/or sell copies of the Software, and to permit persons to whom the *
  9 + * Software is furnished to do so, subject to the following conditions: *
  10 + * *
  11 + * The above copyright notice and this permission notice shall be included in *
  12 + * all copies or substantial portions of the Software. *
  13 + * *
  14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
  15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
  16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
  17 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
  18 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *
  19 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *
  20 + * DEALINGS IN THE SOFTWARE. *
  21 + * ***************************************************************************/
  22 +#ifndef OSDEV_COMPONENTS_PINGDATA_H
  23 +#define OSDEV_COMPONENTS_PINGDATA_H
  24 +
  25 +#include <QString>
  26 +#include <QStringList>
  27 +#include <QDateTime>
  28 +
  29 +namespace osdev {
  30 +namespace components {
  31 +
  32 +class PingData
  33 +{
  34 +public:
  35 + PingData();
  36 + PingData( const QString &host_name, const QStringList &output_data );
  37 +
  38 + virtual ~PingData();
  39 +
  40 + // All getters and setters.
  41 + void setTimeStamp( const QDateTime &time_stamp ) { m_time_stamp = time_stamp; }
  42 + const QDateTime& timeStamp() { return m_time_stamp; }
  43 +
  44 + void setHostName( const QString &host_name ) { m_host_name = host_name; }
  45 + const QString& hostName() { return m_host_name; }
  46 +
  47 + void setIpAddress( const QString &ip_address ) { m_ip_address = ip_address; }
  48 + const QString& ipAddress() { return m_ip_address; }
  49 +
  50 + void setPacketLoss( const int packet_loss ) { m_packet_loss = packet_loss; }
  51 + int packetLoss() { return m_packet_loss; }
  52 +
  53 + void setRttMin( const float rtt_min ) { m_rtt_min = rtt_min; }
  54 + float rttMin() { return m_rtt_min; }
  55 +
  56 + void setRttAvg( const float rtt_avg ) { m_rtt_avg = rtt_avg; }
  57 + float rttAvg() { return m_rtt_avg; }
  58 +
  59 + void setRttMax( const float rtt_max ) { m_rtt_max = rtt_max; }
  60 + float rttMax() { return m_rtt_max; }
  61 +
  62 + void setRttMdev( const float rtt_mdev ) { m_rtt_mdev = rtt_mdev; }
  63 + float rttMdev() { return m_rtt_mdev; }
  64 +
  65 + bool available() { return m_available; }
  66 +
  67 + QString asString();
  68 +
  69 +private:
  70 + void parseOutputData( const QStringList &output_data );
  71 +
  72 +private:
  73 + QDateTime m_time_stamp;
  74 + QString m_host_name;
  75 + QString m_ip_address;
  76 + int m_packet_loss;
  77 + float m_rtt_min;
  78 + float m_rtt_avg;
  79 + float m_rtt_max;
  80 + float m_rtt_mdev;
  81 + bool m_available;
  82 +};
  83 +
  84 +} /* End namespace components */
  85 +} /* End namespace osdev */
  86 +
  87 +#endif /* OSDEV_COMPONENTS_PINGDATA_H */
src/pingdataqueue.cpp 0 → 100644
  1 +++ a/src/pingdataqueue.cpp
  1 +/* ****************************************************************************
  2 + * Copyright 2019 Open Systems Development BV *
  3 + * *
  4 + * Permission is hereby granted, free of charge, to any person obtaining a *
  5 + * copy of this software and associated documentation files (the "Software"), *
  6 + * to deal in the Software without restriction, including without limitation *
  7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, *
  8 + * and/or sell copies of the Software, and to permit persons to whom the *
  9 + * Software is furnished to do so, subject to the following conditions: *
  10 + * *
  11 + * The above copyright notice and this permission notice shall be included in *
  12 + * all copies or substantial portions of the Software. *
  13 + * *
  14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
  15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
  16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
  17 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
  18 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *
  19 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *
  20 + * DEALINGS IN THE SOFTWARE. *
  21 + * ***************************************************************************/
  22 +#include "pingdataqueue.h"
  23 +#include "log.h"
  24 +
  25 +#include <QCoreApplication>
  26 +
  27 +using namespace osdev::components;
  28 +
  29 +PingDataQueue::PingDataQueue( QObject *parent )
  30 + : QObject( parent )
  31 + , m_qhData()
  32 + , m_mutex()
  33 +{
  34 +
  35 +}
  36 +
  37 +PingDataQueue::~PingDataQueue()
  38 +{
  39 +
  40 +}
  41 +
  42 +void PingDataQueue::setData( PingData *data )
  43 +{
  44 + QMutexLocker lock( &m_mutex );
  45 + if( nullptr != data )
  46 + {
  47 + QUuid newID = QUuid::createUuid();
  48 + m_qhData.insert( newID, data );
  49 + emit signalNewDataReceived( newID );
  50 + QCoreApplication::processEvents();
  51 + }
  52 + else
  53 + {
  54 + LogWarning( "[PingDataQueue::setData]", QString( "There was an error storing data : %1" ).arg( data->hostName() ) );
  55 + }
  56 +}
  57 +
  58 +void PingDataQueue::setData( const QString &host_name, const QStringList &data )
  59 +{
  60 + PingData *l_data = new PingData( host_name, data );
  61 + this->setData( l_data );
  62 +}
  63 +
  64 +int PingDataQueue::num_items()
  65 +{
  66 + return m_qhData.count();
  67 +}
  68 +
  69 +QList<QUuid> PingDataQueue::getIds()
  70 +{
  71 + return m_qhData.keys();
  72 +}
  73 +
  74 +PingData* PingDataQueue::getData( const QUuid &id, bool remove )
  75 +{
  76 + QMutexLocker lock( &m_mutex );
  77 + if( remove )
  78 + return m_qhData.take( id );
  79 + else
  80 + return m_qhData.value( id );
  81 +}
src/pingdataqueue.h 0 → 100644
  1 +++ a/src/pingdataqueue.h
  1 +/* ****************************************************************************
  2 + * Copyright 2019 Open Systems Development BV *
  3 + * *
  4 + * Permission is hereby granted, free of charge, to any person obtaining a *
  5 + * copy of this software and associated documentation files (the "Software"), *
  6 + * to deal in the Software without restriction, including without limitation *
  7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, *
  8 + * and/or sell copies of the Software, and to permit persons to whom the *
  9 + * Software is furnished to do so, subject to the following conditions: *
  10 + * *
  11 + * The above copyright notice and this permission notice shall be included in *
  12 + * all copies or substantial portions of the Software. *
  13 + * *
  14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
  15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
  16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
  17 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
  18 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *
  19 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *
  20 + * DEALINGS IN THE SOFTWARE. *
  21 + * ***************************************************************************/
  22 +#ifndef OSDEV_COMPONENTS_PINGDATAQUEUE_H
  23 +#define OSDEV_COMPONENTS_PINGDATAQUEUE_H
  24 +
  25 +// Local
  26 +#include "pingdata.h"
  27 +
  28 +// Qt
  29 +#include <QObject>
  30 +#include <QHash>
  31 +#include <QUuid>
  32 +#include <QSharedPointer>
  33 +#include <QMutex>
  34 +#include <QMutexLocker>
  35 +
  36 +namespace osdev {
  37 +namespace components {
  38 +
  39 +class PingDataQueue : public QObject
  40 +{
  41 + Q_OBJECT
  42 +
  43 +public:
  44 + PingDataQueue( QObject *parent = nullptr );
  45 +
  46 + PingDataQueue( const PingDataQueue& ) = delete;
  47 + PingDataQueue( const PingDataQueue&& ) = delete;
  48 + PingDataQueue& operator=( const PingDataQueue& ) = delete;
  49 + PingDataQueue& operator=( const PingDataQueue&& ) = delete;
  50 +
  51 + virtual ~PingDataQueue();
  52 +
  53 + void setData( PingData *data );
  54 + void setData( const QString &host_name, const QStringList &data );
  55 + QList<QUuid> getIds();
  56 + PingData* getData( const QUuid &id, bool remove = false );
  57 + int num_items();
  58 +
  59 +signals:
  60 + void signalNewDataReceived( const QUuid &id );
  61 +
  62 +private:
  63 + QHash<QUuid, PingData*> m_qhData;
  64 + QMutex m_mutex;
  65 +};
  66 +
  67 +} /* End namespace components */
  68 +} /* End namespace osdev */
  69 +
  70 +#endif /* OSDEV_COMPONENTS_PINGDATAQUEUE_H */
src/pingmanager.cpp 0 → 100644
  1 +++ a/src/pingmanager.cpp
  1 +/* ****************************************************************************
  2 + * Copyright 2019 Open Systems Development BV *
  3 + * *
  4 + * Permission is hereby granted, free of charge, to any person obtaining a *
  5 + * copy of this software and associated documentation files (the "Software"), *
  6 + * to deal in the Software without restriction, including without limitation *
  7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, *
  8 + * and/or sell copies of the Software, and to permit persons to whom the *
  9 + * Software is furnished to do so, subject to the following conditions: *
  10 + * *
  11 + * The above copyright notice and this permission notice shall be included in *
  12 + * all copies or substantial portions of the Software. *
  13 + * *
  14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
  15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
  16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
  17 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
  18 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *
  19 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *
  20 + * DEALINGS IN THE SOFTWARE. *
  21 + * ***************************************************************************/
  22 +#include "pingmanager.h"
  23 +#include "log.h"
  24 +#include "pingdata.h"
  25 +
  26 +#include <QCoreApplication>
  27 +
  28 +using namespace osdev::components;
  29 +
  30 +PingManager::PingManager( int max_threads, QObject *parent )
  31 + : QObject( parent )
  32 + , m_qhThreads()
  33 + , m_pSharedBuffer()
  34 + , m_pHostBuffer()
  35 + , m_max_threads( max_threads )
  36 +{
  37 + m_pSharedBuffer = new PingDataQueue();
  38 + if( nullptr != m_pSharedBuffer )
  39 + {
  40 + connect( m_pSharedBuffer, &PingDataQueue::signalNewDataReceived, this, &PingManager::slotNewData );
  41 + }
  42 +
  43 + m_pHostBuffer = new HostBuffer();
  44 +
  45 + createThreads();
  46 +}
  47 +
  48 +PingManager::~PingManager()
  49 +{
  50 + // Cleanup the SharedBuffer
  51 + if( nullptr != m_pSharedBuffer )
  52 + {
  53 + delete m_pSharedBuffer;
  54 + m_pSharedBuffer = nullptr;
  55 + }
  56 +
  57 + // Cleanup the HostBuffer
  58 + if( nullptr != m_pHostBuffer )
  59 + {
  60 + delete m_pHostBuffer;
  61 + m_pHostBuffer = nullptr;
  62 + }
  63 +}
  64 +
  65 +void PingManager::createThreads()
  66 +{
  67 + // Create all threads
  68 + for( int threadCounter = 0; threadCounter < m_max_threads; threadCounter++ )
  69 + {
  70 + PingThread *pThread = new PingThread( m_pHostBuffer, m_pSharedBuffer );
  71 + if( nullptr != pThread )
  72 + {
  73 + connect( pThread, &PingThread::signalThreadFinished, this, &PingManager::slotThreadFinished );
  74 + connect( this, &PingManager::signalStartThreads, pThread, &PingThread::slotStartThread );
  75 +
  76 + m_qhThreads.append( pThread );
  77 + }
  78 + else
  79 + {
  80 + LogError( "[PingManager::startPingTests]", QString( "Unable to start threadnumber : %1" ).arg( threadCounter ) );
  81 + }
  82 + }
  83 + LogInfo( "[PingManager::createThreads]", QString( "%1 threads created and ready to run." ).arg( m_qhThreads.count() ) );
  84 +}
  85 +
  86 +bool PingManager::startPingTests()
  87 +{
  88 + bool bResult = false;
  89 +
  90 + if( m_pHostBuffer->count() > 0 )
  91 + {
  92 + LogInfo( "[PingManager::startPingTests]", QString( "Signalling all threads to start checking hosts" ) );
  93 + emit signalStartThreads();
  94 + QCoreApplication::processEvents();
  95 +
  96 + bResult &= true;
  97 + }
  98 + else
  99 + {
  100 + LogInfo( "[PingManager::startPingTests]",
  101 + QString( "No hosts to check." ) );
  102 + }
  103 +
  104 + return bResult;
  105 +}
  106 +
  107 +int PingManager::addHosts( const QStringList &host_list )
  108 +{
  109 + if( nullptr == m_pHostBuffer )
  110 + {
  111 + m_pHostBuffer = new HostBuffer();
  112 + }
  113 +
  114 + m_pHostBuffer->addHosts( host_list );
  115 +
  116 + return m_pHostBuffer->count();
  117 +}
  118 +
  119 +void PingManager::slotNewData( const QUuid &id )
  120 +{
  121 + PingData* pData = m_pSharedBuffer->getData( id );
  122 + if( nullptr != pData )
  123 + {
  124 + QCoreApplication::processEvents();
  125 + }
  126 +}
  127 +
  128 +void PingManager::slotThreadFinished( QThread *thread )
  129 +{
  130 + LogInfo( "[PingManager::slotThreadFinished]", QString( "Thread signalled finished : %1" ).arg( m_qhThreads.indexOf( thread ) ) );
  131 +
  132 + bool running_threads = false;
  133 +
  134 + // Here we check if there are still running threads. If not, we signal the object
  135 + foreach( const auto cur_thread, m_qhThreads )
  136 + {
  137 + running_threads &= cur_thread->isRunning();
  138 + }
  139 +
  140 + if( !running_threads )
  141 + {
  142 + LogInfo( "[PingManager::slotThreadFinished]", QString( "Signalling all Threads finished -> signalAllThreadsFinished()" ) );
  143 + emit signalAllThreadsFinished();
  144 + }
  145 + else
  146 + {
  147 + LogInfo( "[PingManager::slotThreadFinished]", QString( "Still running threads...()" ) );
  148 + }
  149 +}
  150 +
  151 +QStringList PingManager::getActiveIPs()
  152 +{
  153 + QStringList l_result;
  154 +
  155 + for( const auto id : m_pSharedBuffer->getIds() )
  156 + {
  157 + if( m_pSharedBuffer->getData( id )->available() )
  158 + {
  159 + l_result.append( m_pSharedBuffer->getData( id )->ipAddress() );
  160 + }
  161 + }
  162 +
  163 + return l_result;
  164 +}
src/pingmanager.h 0 → 100644
  1 +++ a/src/pingmanager.h
  1 +/* ****************************************************************************
  2 + * Copyright 2019 Open Systems Development BV *
  3 + * *
  4 + * Permission is hereby granted, free of charge, to any person obtaining a *
  5 + * copy of this software and associated documentation files (the "Software"), *
  6 + * to deal in the Software without restriction, including without limitation *
  7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, *
  8 + * and/or sell copies of the Software, and to permit persons to whom the *
  9 + * Software is furnished to do so, subject to the following conditions: *
  10 + * *
  11 + * The above copyright notice and this permission notice shall be included in *
  12 + * all copies or substantial portions of the Software. *
  13 + * *
  14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
  15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
  16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
  17 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
  18 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *
  19 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *
  20 + * DEALINGS IN THE SOFTWARE. *
  21 + * ***************************************************************************/
  22 +#ifndef OSDEV_COMPONENTS_PINGMANAGER_H
  23 +#define OSDEV_COMPONENTS_PINGMANAGER_H
  24 +
  25 +#include <QObject>
  26 +#include <QStringList>
  27 +#include <QList>
  28 +
  29 +#include "pingdataqueue.h"
  30 +#include "pingthread.h"
  31 +#include "hostbuffer.h"
  32 +
  33 +namespace osdev {
  34 +namespace components {
  35 +
  36 +class PingManager : public QObject
  37 +{
  38 + Q_OBJECT
  39 +
  40 +public:
  41 + PingManager( int max_threads = 10, QObject *parent = nullptr );
  42 +
  43 + PingManager( const PingManager& ) = delete;
  44 + PingManager( const PingManager&& ) = delete;
  45 + PingManager& operator=( const PingManager& ) = delete;
  46 + PingManager& operator=( const PingManager&& ) = delete;
  47 +
  48 + virtual ~PingManager();
  49 +
  50 + bool startPingTests();
  51 + bool startPingTests( const QString &host );
  52 +
  53 + int addHosts( const QStringList &host_list );
  54 +
  55 + QStringList getActiveIPs();
  56 +
  57 +
  58 +
  59 +public slots:
  60 + void slotNewData( const QUuid &id );
  61 + void slotThreadFinished( QThread *thread );
  62 +
  63 +signals:
  64 + void signalStartThreads();
  65 + void signalAllThreadsFinished();
  66 +
  67 +private:
  68 + void createThreads();
  69 +
  70 +private: // Members ( Giggity! )
  71 + QList<QThread*> m_qhThreads;
  72 + PingDataQueue *m_pSharedBuffer;
  73 + HostBuffer *m_pHostBuffer;
  74 +
  75 + int m_max_threads;
  76 +};
  77 +
  78 +} /* End namespace components */
  79 +} /* End namespace osdev */
  80 +
  81 +#endif /* OSDEV_COMPONENTS_PINGMANAGER_H */
src/pingrunner.cpp 0 → 100644
  1 +++ a/src/pingrunner.cpp
  1 +/* ****************************************************************************
  2 + * Copyright 2019 Open Systems Development BV *
  3 + * *
  4 + * Permission is hereby granted, free of charge, to any person obtaining a *
  5 + * copy of this software and associated documentation files (the "Software"), *
  6 + * to deal in the Software without restriction, including without limitation *
  7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, *
  8 + * and/or sell copies of the Software, and to permit persons to whom the *
  9 + * Software is furnished to do so, subject to the following conditions: *
  10 + * *
  11 + * The above copyright notice and this permission notice shall be included in *
  12 + * all copies or substantial portions of the Software. *
  13 + * *
  14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
  15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
  16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
  17 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
  18 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *
  19 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *
  20 + * DEALINGS IN THE SOFTWARE. *
  21 + * ***************************************************************************/
  22 +// local
  23 +#include "pingrunner.h"
  24 +#include "log.h"
  25 +#include "compatqt514.h"
  26 +
  27 +// Qt
  28 +#include <QStringList>
  29 +#include <QtDebug>
  30 +
  31 +// std
  32 +#include <iostream>
  33 +
  34 +using namespace osdev::components;
  35 +
  36 +PingRunner::PingRunner( QObject *parent )
  37 + : QObject( parent )
  38 + , m_shrBuf( nullptr )
  39 + , m_host_to_ping( QString() )
  40 +{
  41 + this->connectProcess();
  42 +}
  43 +
  44 +PingRunner::PingRunner( PingDataQueue *l_shrBuffer, QObject *parent )
  45 + : QObject( parent )
  46 + , m_shrBuf( l_shrBuffer )
  47 + , m_host_to_ping( QString() )
  48 +{
  49 + this->connectProcess();
  50 +}
  51 +
  52 +void PingRunner::connectProcess()
  53 +{
  54 + // Use old style connect construction, as overloading in Signal / Slots
  55 + // doesn't work without lambda functions.
  56 +}
  57 +
  58 +PingRunner::~PingRunner()
  59 +{
  60 +}
  61 +
  62 +void PingRunner::setSharedBuffer( PingDataQueue *l_shrBuffer )
  63 +{
  64 + if( nullptr != l_shrBuffer )
  65 + {
  66 + m_shrBuf = l_shrBuffer;
  67 + }
  68 +}
  69 +
  70 +void PingRunner::startPing( const QString &host_to_ping )
  71 +{
  72 + QProcess m_process;
  73 +
  74 + m_host_to_ping = host_to_ping;
  75 + QStringList arguments( { "-n", "-q", "-c", "10", "-i", "0.2", "-W", "2", host_to_ping } );
  76 +
  77 + m_process.start( QString( "ping" ), arguments, QIODevice::ReadOnly );
  78 + if( m_process.waitForFinished() )
  79 + {
  80 + LogInfo( "[PingRunner::startPing]", QString( "Process for host %1 done...." ).arg( m_host_to_ping ) )
  81 + QStringList result;
  82 + result << m_host_to_ping;
  83 + result << QString( m_process.readAll() ).split( "\n", SKIP_EMPTY_PARTS );
  84 +
  85 + if( nullptr != m_shrBuf )
  86 + {
  87 + m_shrBuf->setData( m_host_to_ping, result );
  88 + }
  89 + }
  90 + LogInfo( "[PingRunner::startPing]", QString( "Closing Communicationchannels for host %1 process" ).arg( m_host_to_ping ) )
  91 + m_process.close();
  92 +}
src/pingrunner.h 0 → 100644
  1 +++ a/src/pingrunner.h
  1 +/* ****************************************************************************
  2 + * Copyright 2019 Open Systems Development BV *
  3 + * *
  4 + * Permission is hereby granted, free of charge, to any person obtaining a *
  5 + * copy of this software and associated documentation files (the "Software"), *
  6 + * to deal in the Software without restriction, including without limitation *
  7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, *
  8 + * and/or sell copies of the Software, and to permit persons to whom the *
  9 + * Software is furnished to do so, subject to the following conditions: *
  10 + * *
  11 + * The above copyright notice and this permission notice shall be included in *
  12 + * all copies or substantial portions of the Software. *
  13 + * *
  14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
  15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
  16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
  17 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
  18 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *
  19 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *
  20 + * DEALINGS IN THE SOFTWARE. *
  21 + * ***************************************************************************/
  22 +#ifndef OSDEV_COMPONENTS_PINGER_H
  23 +#define OSDEV_COMPONENTS_PINGER_H
  24 +
  25 +#include <QObject>
  26 +#include <QString>
  27 +#include <QProcess>
  28 +
  29 +#include "pingdataqueue.h"
  30 +
  31 +namespace osdev {
  32 +namespace components {
  33 +
  34 +class PingRunner : public QObject
  35 +{
  36 + Q_OBJECT
  37 +
  38 +public:
  39 + PingRunner( QObject *parent = nullptr );
  40 + PingRunner( PingDataQueue *l_shrBuffer, QObject *parent = nullptr );
  41 + virtual ~PingRunner();
  42 +
  43 + PingRunner( const PingRunner& ) = delete;
  44 + PingRunner( const PingRunner&& ) = delete;
  45 + PingRunner& operator=( const PingRunner& ) = delete;
  46 + PingRunner& operator=( const PingRunner&& ) = delete;
  47 +
  48 + void startPing( const QString &host_to_ping );
  49 +
  50 + void setSharedBuffer( PingDataQueue *l_shrBuffer );
  51 +
  52 +private:
  53 + void connectProcess();
  54 +
  55 +private:
  56 + PingDataQueue *m_shrBuf;
  57 + QString m_host_to_ping;
  58 +
  59 +};
  60 +
  61 +} /* End namespace components */
  62 +} /* End namespace osdev */
  63 +
  64 +#endif /* OSDEV_COMPONENTS_PINGER_H */
src/pingthread.cpp 0 → 100644
  1 +++ a/src/pingthread.cpp
  1 +/* ****************************************************************************
  2 + * Copyright 2019 Open Systems Development BV *
  3 + * *
  4 + * Permission is hereby granted, free of charge, to any person obtaining a *
  5 + * copy of this software and associated documentation files (the "Software"), *
  6 + * to deal in the Software without restriction, including without limitation *
  7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, *
  8 + * and/or sell copies of the Software, and to permit persons to whom the *
  9 + * Software is furnished to do so, subject to the following conditions: *
  10 + * *
  11 + * The above copyright notice and this permission notice shall be included in *
  12 + * all copies or substantial portions of the Software. *
  13 + * *
  14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
  15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
  16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
  17 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
  18 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *
  19 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *
  20 + * DEALINGS IN THE SOFTWARE. *
  21 + * ***************************************************************************/
  22 +#include "pingthread.h"
  23 +#include "pingrunner.h"
  24 +
  25 +#include "log.h"
  26 +
  27 +#include <iostream>
  28 +
  29 +using namespace osdev::components;
  30 +
  31 +PingThread::PingThread( HostBuffer *input_queue, PingDataQueue *ping_buffer )
  32 + : m_pHostBuffer( input_queue )
  33 + , m_pQueue( ping_buffer )
  34 +{
  35 + connect( this, &PingThread::finished, this, &PingThread::slotThreadFinished );
  36 +}
  37 +
  38 +PingThread::~PingThread()
  39 +{
  40 +
  41 +}
  42 +
  43 +void PingThread::setPriority( QThread::Priority priority )
  44 +{
  45 + if( this->isRunning() )
  46 + {
  47 + QThread::setPriority( priority );
  48 + }
  49 +}
  50 +
  51 +void PingThread::run()
  52 +{
  53 + LogInfo( "[PingThread::run]", QString( "Starting thread..." ) )
  54 + QString host_name;
  55 + PingRunner l_pingRunner( m_pQueue );
  56 +
  57 + while( m_pHostBuffer->count() > 0 )
  58 + {
  59 + LogInfo( "[PingThread::run]", QString( "m_pHostBuffer has %1 entries.." ).arg( m_pHostBuffer->count() ) )
  60 + host_name = m_pHostBuffer->getHost();
  61 + LogInfo( "[PingThread::run]", QString( "m_pHostBuffer has %1 entries after getHost()" ).arg( m_pHostBuffer->count() ) )
  62 + if( !host_name.isEmpty() )
  63 + {
  64 + LogInfo( "[PingThread::run]", QString( "[OK] Alive thread for host %1 created." ).arg( host_name ) );
  65 + l_pingRunner.startPing( host_name );
  66 + }
  67 + }
  68 + LogInfo( "[PingThread::run]", QString( "m_pHostBuffer is empty..." ) )
  69 +}
  70 +
  71 +void PingThread::slotStartThread()
  72 +{
  73 + LogInfo( "[PingThread::slotStartThread]", QString( "Running thread." ) );
  74 + this->start();
  75 +}
  76 +
  77 +void PingThread::slotThreadFinished()
  78 +{
  79 + emit signalThreadFinished( this );
  80 +}
src/pingthread.h 0 → 100644
  1 +++ a/src/pingthread.h
  1 +/* ****************************************************************************
  2 + * Copyright 2019 Open Systems Development BV *
  3 + * *
  4 + * Permission is hereby granted, free of charge, to any person obtaining a *
  5 + * copy of this software and associated documentation files (the "Software"), *
  6 + * to deal in the Software without restriction, including without limitation *
  7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, *
  8 + * and/or sell copies of the Software, and to permit persons to whom the *
  9 + * Software is furnished to do so, subject to the following conditions: *
  10 + * *
  11 + * The above copyright notice and this permission notice shall be included in *
  12 + * all copies or substantial portions of the Software. *
  13 + * *
  14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
  15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
  16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *
  17 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
  18 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *
  19 + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *
  20 + * DEALINGS IN THE SOFTWARE. *
  21 + * ***************************************************************************/
  22 +#ifndef OSDEV_COMPONENTS_PINGTHREAD_H
  23 +#define OSDEV_COMPONENTS_PINGTHREAD_H
  24 +
  25 +#include "pingdataqueue.h"
  26 +#include "hostbuffer.h"
  27 +
  28 +#include <QThread>
  29 +#include <QString>
  30 +
  31 +namespace osdev {
  32 +namespace components {
  33 +
  34 +class PingThread : public QThread
  35 +{
  36 + Q_OBJECT
  37 +
  38 +public:
  39 + PingThread( HostBuffer *input_buffer, PingDataQueue *ping_queue );
  40 +
  41 + PingThread( const PingThread& ) = delete;
  42 + PingThread( const PingThread&& ) = delete;
  43 + PingThread& operator=( const PingThread& ) = delete;
  44 + PingThread& operator=( const PingThread&& ) = delete;
  45 +
  46 + virtual ~PingThread();
  47 +
  48 + void setPriority( QThread::Priority priority = QThread::NormalPriority );
  49 + void run() override;
  50 +
  51 +public slots:
  52 + void slotStartThread();
  53 +
  54 + void slotThreadFinished();
  55 +
  56 +signals:
  57 + void signalThreadFinished( QThread *thread );
  58 +
  59 +private:
  60 + HostBuffer *m_pHostBuffer;
  61 + PingDataQueue *m_pQueue;
  62 +};
  63 +
  64 +} /* End namespace components */
  65 +} /* End namespace osdev */
  66 +
  67 +#endif /* OSDEV_COMPONENTS_PINGTHREAD */
tests/CMakeLists.txt 0 → 100644
  1 +++ a/tests/CMakeLists.txt
  1 +cmake_minimum_required(VERSION 3.0)
  2 +LIST(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../cmake)
  3 +
  4 +include(projectheader)
  5 +project_header(test_logutils)
  6 +
  7 +include_directories( SYSTEM
  8 + ${CMAKE_CURRENT_SOURCE_DIR}/../../src
  9 +)
  10 +
  11 +include(compiler)
  12 +set(SRC_LIST
  13 +)
  14 +
  15 +# add_executable( ${PROJECT_NAME}
  16 +# ${SRC_LIST}
  17 +# )
  18 +
  19 +# target_link_libraries(
  20 +# ${PROJECT_NAME}
  21 +# )
  22 +
  23 +# set_target_properties( ${PROJECT_NAME} PROPERTIES
  24 +# RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
  25 +# LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib
  26 +# ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/archive
  27 +# )
  28 +
  29 +# include(installation)
  30 +# install_application()