Commit 19eefb3c2c33c54602a43ce12eeccfd5bf164e0f
0 parents
Initial commit. dependencies not resolved yet.
Showing
9 changed files
with
544 additions
and
0 deletions
.gitignore
0 → 100644
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_jobscheduler) | |
| 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}/../../../external/hsoa_create_version_include/cmake) | |
| 3 | +include(projectheader) | |
| 4 | +project_header(jobscheduler) | |
| 5 | + | |
| 6 | +find_package( Qt5Core REQUIRED ) | |
| 7 | +find_package( Qt5Sql REQUIRED ) | |
| 8 | + | |
| 9 | +include_directories( SYSTEM | |
| 10 | + ${Qt5Core_INCLUDE_DIRS} | |
| 11 | +) | |
| 12 | + | |
| 13 | +include(compiler) | |
| 14 | + | |
| 15 | +include_directories( | |
| 16 | + ${CMAKE_CURRENT_SOURCE_DIR}/../logutils | |
| 17 | + ${CMAKE_CURRENT_SOURCE_DIR}/../config | |
| 18 | + ${CMAKE_CURRENT_SOURCE_DIR}/../dcxml | |
| 19 | + ${CMAKE_CURRENT_SOURCE_DIR}/../global | |
| 20 | +) | |
| 21 | + | |
| 22 | +set(SRC_LIST | |
| 23 | + ${CMAKE_CURRENT_SOURCE_DIR}/jobscheduler.cpp | |
| 24 | + ${CMAKE_CURRENT_SOURCE_DIR}/jobtimer.cpp | |
| 25 | +) | |
| 26 | + | |
| 27 | +include(qtmoc) | |
| 28 | +create_mocs( SRC_LIST MOC_LIST | |
| 29 | + ${CMAKE_CURRENT_SOURCE_DIR}/jobscheduler.h | |
| 30 | + ${CMAKE_CURRENT_SOURCE_DIR}/jobtimer.h | |
| 31 | +) | |
| 32 | + | |
| 33 | +set_source_files_properties( | |
| 34 | + ${MOC_LIST} | |
| 35 | + PROPERTIES | |
| 36 | + COMPILE_FLAGS -Wno-undefined-reinterpret-cast | |
| 37 | +) | |
| 38 | + | |
| 39 | +link_directories( | |
| 40 | + ${CMAKE_BINARY_DIR}/lib | |
| 41 | +) | |
| 42 | + | |
| 43 | +include(library) | |
| 44 | +add_libraries( | |
| 45 | + ${Qt5Core_LIBRARIES} | |
| 46 | + logutils | |
| 47 | + global | |
| 48 | + config | |
| 49 | +) | |
| 50 | + | |
| 51 | +include(installation) | |
| 52 | +install_component() | ... | ... |
src/jobscheduler.cpp
0 → 100644
| 1 | +++ a/src/jobscheduler.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 | + | |
| 23 | +#include "jobscheduler.h" | |
| 24 | +#include "log.h" | |
| 25 | + | |
| 26 | +using namespace osdev::components; | |
| 27 | + | |
| 28 | +JobScheduler::JobScheduler( QObject *_parent ) | |
| 29 | + : QObject( _parent ) | |
| 30 | + , m_jobSchedule() | |
| 31 | +{ | |
| 32 | + | |
| 33 | +} | |
| 34 | + | |
| 35 | +JobScheduler::JobScheduler( const QList<JobData>& lstJobs, QObject *_parent ) | |
| 36 | + : QObject( _parent ) | |
| 37 | + , m_jobSchedule() | |
| 38 | +{ | |
| 39 | + for( const auto& jobItem : lstJobs ) | |
| 40 | + { | |
| 41 | + this->createJob( jobItem ); | |
| 42 | + } | |
| 43 | +} | |
| 44 | + | |
| 45 | +void JobScheduler::slotRunJob( const QString& jobName ) | |
| 46 | +{ | |
| 47 | + LogInfo( "JobScheduler::slotRunJob", QString( "SlotRunJob fired for job : %1" ).arg( jobName ) ); | |
| 48 | + if( m_jobSchedule.contains( jobName ) ) | |
| 49 | + { | |
| 50 | + emit signalRunJob( m_jobSchedule.value( jobName )->jobData() ); | |
| 51 | + } | |
| 52 | + | |
| 53 | + this->rescheduleJob( jobName ); | |
| 54 | +} | |
| 55 | + | |
| 56 | +void JobScheduler::scheduleJob( const QString& _job_name, | |
| 57 | + const QHash<QString, QVariant>& _param_list, | |
| 58 | + const int _interval, | |
| 59 | + const QString& _target_object, | |
| 60 | + const QTime& _run_time, | |
| 61 | + const QDate& _run_date ) | |
| 62 | +{ | |
| 63 | + | |
| 64 | + // Get the corresponding job from the map. | |
| 65 | + QPointer<JobTimer> schedJob = m_jobSchedule.value( _job_name ); | |
| 66 | + if( nullptr == schedJob ) | |
| 67 | + { | |
| 68 | + LogInfo( "[JobScheduler::scheduleJob]", QString( "Job %1 not added to the an unknown error." ).arg( _job_name ) ); | |
| 69 | + return; | |
| 70 | + } | |
| 71 | + | |
| 72 | + // Scheduling is done within 24 Hours. After each timer-fire we check if the rundate is equal to the currentDate. | |
| 73 | + // If so.. Run the job. If not, reschedule for the next 24 hours. | |
| 74 | + if( _run_time.isValid() || _run_date.isValid() ) | |
| 75 | + { | |
| 76 | + QDateTime schedDT( QDate::currentDate(), _run_time ); | |
| 77 | + | |
| 78 | + if( QDateTime::currentDateTime().secsTo( schedDT ) <= 0 ) | |
| 79 | + { | |
| 80 | + // Add one day from today. | |
| 81 | + schedDT = schedDT.addDays( 1 ); | |
| 82 | + } | |
| 83 | + | |
| 84 | + // Check if the jobName already exists. If so, re-schedule the existing job. If not, create the job. | |
| 85 | + if( !m_jobSchedule.contains( _job_name ) ) | |
| 86 | + { | |
| 87 | + this->createJob( JobData( _job_name, _param_list, _run_time, _interval, _target_object, _run_date ) ); | |
| 88 | + } | |
| 89 | + | |
| 90 | + if( 0 == _interval ) | |
| 91 | + { | |
| 92 | + qint64 secondsToRun = QDateTime::currentDateTime().secsTo( schedDT ); | |
| 93 | + schedJob->start( static_cast<int>( secondsToRun * 1000 ) ); | |
| 94 | + } | |
| 95 | + } | |
| 96 | + else if( 0 < _interval ) | |
| 97 | + { | |
| 98 | + schedJob->start( _interval * 1000 ); | |
| 99 | + } | |
| 100 | + | |
| 101 | + if( schedJob->isActive() ) | |
| 102 | + { | |
| 103 | + LogInfo( "[JobScheduler::scheduleJob]", QString( "Job : %1 scheduled to run in %2 seconds ( Date : %3, Time : %4 )" ) | |
| 104 | + .arg( _job_name ) | |
| 105 | + .arg( schedJob->remainingTime() / 1000 ) | |
| 106 | + .arg( QDateTime::currentDateTime().addSecs( schedJob->remainingTime() / 1000 ).date().toString() ) | |
| 107 | + .arg( QDateTime::currentDateTime().addSecs( schedJob->remainingTime() / 1000 ).time().toString() ) ); | |
| 108 | + } | |
| 109 | + else | |
| 110 | + { | |
| 111 | + LogError( "[JobScheduler::scheduleJob]", QString( "Job : %1 failed to schedule." ) | |
| 112 | + .arg( _job_name ) ); | |
| 113 | + | |
| 114 | + } | |
| 115 | +} | |
| 116 | + | |
| 117 | +void JobScheduler::rescheduleJob ( const QString& _job_name ) | |
| 118 | +{ | |
| 119 | + if( m_jobSchedule.contains( _job_name ) ) | |
| 120 | + { | |
| 121 | + QPointer<JobTimer> schedJob = m_jobSchedule.value( _job_name ); | |
| 122 | + if( nullptr == schedJob ) | |
| 123 | + { | |
| 124 | + LogInfo( "[JobScheduler::rescheduleJob]", QString( "Job %1 not rescheduled to the an unknown error." ).arg( _job_name ) ); | |
| 125 | + return; | |
| 126 | + } | |
| 127 | + | |
| 128 | + this->scheduleJob( _job_name, | |
| 129 | + schedJob->jobData().paramList(), | |
| 130 | + schedJob->jobData().runInterval(), | |
| 131 | + schedJob->jobData().targetObject(), | |
| 132 | + schedJob->jobData().runTime(), | |
| 133 | + schedJob->jobData().runDate() ); | |
| 134 | + } | |
| 135 | + else | |
| 136 | + { | |
| 137 | + LogError( "[JobScheduler::scheduleJob]", QString( "Unable to re-schedule job %1 as it is unknown." ).arg( _job_name ) ); | |
| 138 | + } | |
| 139 | +} | |
| 140 | + | |
| 141 | +void JobScheduler::createJob( const JobData& _jobItem ) | |
| 142 | +{ | |
| 143 | + QPointer<JobTimer> newJob = new JobTimer( _jobItem, this ); // Create a new job | |
| 144 | + m_jobSchedule.insert( _jobItem.jobName(), newJob ); // Add to the list | |
| 145 | + QObject::connect( newJob.data(), &JobTimer::signalRunJob, this, &JobScheduler::slotRunJob ); | |
| 146 | +} | |
| 147 | + | |
| 148 | +void JobScheduler::start() | |
| 149 | +{ | |
| 150 | + // Schedule all stored jobs. | |
| 151 | + for( const QString& _jobName : QStringList( m_jobSchedule.keys() ) ) | |
| 152 | + { | |
| 153 | + this->rescheduleJob( _jobName ); | |
| 154 | + } | |
| 155 | +} | ... | ... |
src/jobscheduler.h
0 → 100644
| 1 | +++ a/src/jobscheduler.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 | + | |
| 23 | +#ifndef OSDEV_COMPONENTS_JOBSCHEDULER_H | |
| 24 | +#define OSDEV_COMPONENTS_JOBSCHEDULER_H | |
| 25 | + | |
| 26 | +#include "jobdata.h" | |
| 27 | +#include "jobtimer.h" | |
| 28 | + | |
| 29 | +#include <QObject> | |
| 30 | +#include <QUuid> | |
| 31 | +#include <QHash> | |
| 32 | +#include <QString> | |
| 33 | +#include <QPointer> | |
| 34 | + | |
| 35 | +namespace osdev { | |
| 36 | +namespace components { | |
| 37 | +/* | |
| 38 | + * ________________________________________ | |
| 39 | + * / Real computer scientists despise the \ | |
| 40 | + * | idea of actual hardware. Hardware has | | |
| 41 | + * | limitations, software doesn't. It's a | | |
| 42 | + * | real shame that Turing machines are so | | |
| 43 | + * \ poor at I/O. / | |
| 44 | + * ---------------------------------------- | |
| 45 | + * \ | |
| 46 | + * \ | |
| 47 | + * .--. | |
| 48 | + * |o_o | | |
| 49 | + * |:_/ | | |
| 50 | + * // \ \ | |
| 51 | + * (| | ) | |
| 52 | + * /'\_ _/`\ | |
| 53 | + * \___)=(___/ | |
| 54 | + *//*! | |
| 55 | + * \brief Schedule jobs to be executed on a specific Date / Time or on a regular interval. | |
| 56 | + * At this moment, it will schedule in intervals of 24 hours, if the date is set in the past. | |
| 57 | + * If the dat is in the future, it will be run for the first time on that specific date / Time | |
| 58 | + * and after that every 24 hours. | |
| 59 | + */ | |
| 60 | +class JobScheduler : public QObject | |
| 61 | +{ | |
| 62 | + Q_OBJECT | |
| 63 | + | |
| 64 | +public: | |
| 65 | + /*! | |
| 66 | + * \brief JobScheduler Constructor. | |
| 67 | + * \param _parent - The object creating the JobScheduler. | |
| 68 | + * By adding this pointer, we use the cascade deletion construction that comes with Qt. | |
| 69 | + */ | |
| 70 | + JobScheduler( QObject *_parent = nullptr ); | |
| 71 | + | |
| 72 | + /*! | |
| 73 | + * \brief JobScheduler Constructor | |
| 74 | + * \param lstJobs - The list of jobs, coming from the configuration that we want to have scheduled. | |
| 75 | + * \param _parent - The object creating the JobScheduler. | |
| 76 | + * By adding this pointer, we use the cascade deletion construction that comes with Qt. | |
| 77 | + */ | |
| 78 | + JobScheduler( const QList < osdev::components::JobData > &lstJobs, QObject * _parent = nullptr ); | |
| 79 | + | |
| 80 | + /*! | |
| 81 | + * \brief Schedule the job based on the parameters and settings. | |
| 82 | + * \param _job_name - The name of this job used for registration | |
| 83 | + * \param _param_list - Parameters by the job. | |
| 84 | + * \param _interval - The interval this job should be scheduled to. | |
| 85 | + * \param _target_object - The plugin or object this job is intended for. Used as input to the pluginmanager. | |
| 86 | + * \param _run_time - The time this job should run. Empty or '*' if interval based. | |
| 87 | + * \param _run_date - The date this job should run. Empty or '*' if daily. | |
| 88 | + */ | |
| 89 | + void scheduleJob( const QString& _job_name, | |
| 90 | + const QHash<QString, QVariant>& _param_list, | |
| 91 | + const int _interval, | |
| 92 | + const QString& _target_object, | |
| 93 | + const QTime& _run_time, | |
| 94 | + const QDate& _run_date = QDate::currentDate() ); | |
| 95 | + | |
| 96 | + /*! | |
| 97 | + * \brief Added for convenience. It will search for the given name and try to reschedule the job. | |
| 98 | + */ | |
| 99 | + void rescheduleJob( const QString& _jobName ); | |
| 100 | + | |
| 101 | + /*! | |
| 102 | + * \brief Start and initialize the jobscheduler. | |
| 103 | + * All configured Jobs are started and reported to the logfile. | |
| 104 | + */ | |
| 105 | + void start(); | |
| 106 | + | |
| 107 | +private: | |
| 108 | + /*! | |
| 109 | + * \brief Create the requested job and add it to the Schedule list. | |
| 110 | + * \param _jobItem - Structure containing the data needed for this job. | |
| 111 | + */ | |
| 112 | + void createJob( const JobData& _jobItem ); | |
| 113 | + | |
| 114 | + QHash<QString, QPointer<JobTimer>> m_jobSchedule; ///< The scheduler list | |
| 115 | + | |
| 116 | +private slots: | |
| 117 | + /*! | |
| 118 | + * \brief Called by the TimerObjects. It's identification (jobName) is used to determine | |
| 119 | + * which job has to be run | |
| 120 | + */ | |
| 121 | + void slotRunJob( const QString& jobName ); | |
| 122 | + | |
| 123 | +signals: | |
| 124 | + void signalRunJob( const JobData& data ); | |
| 125 | + | |
| 126 | +}; | |
| 127 | + | |
| 128 | +} /* End namespace components */ | |
| 129 | +} /* End namespace osdev */ | |
| 130 | + | |
| 131 | +#endif /* OSDEV_COMPONENTS_JOBSCHEDULER_H */ | ... | ... |
src/jobtimer.cpp
0 → 100644
| 1 | +++ a/src/jobtimer.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 | + | |
| 23 | +#include "jobtimer.h" | |
| 24 | + | |
| 25 | +using namespace osdev::components; | |
| 26 | + | |
| 27 | +JobTimer::JobTimer( const JobData& _jobData, QObject *_parent ) | |
| 28 | + : QTimer( _parent ) | |
| 29 | + , m_jobData( _jobData ) | |
| 30 | +{ | |
| 31 | + this->setTimerType( Qt::PreciseTimer ); ///< 1 millisecond accuracy | |
| 32 | + this->setSingleShot( true ); ///< Fire once. This timer has to be rescheduled. | |
| 33 | + | |
| 34 | + connectSignalsSlots(); | |
| 35 | +} | |
| 36 | + | |
| 37 | +JobTimer::~JobTimer() | |
| 38 | +{ | |
| 39 | +} | |
| 40 | + | |
| 41 | +void JobTimer::connectSignalsSlots() | |
| 42 | +{ | |
| 43 | + QObject::connect( this, &QTimer::timeout, this, &JobTimer::slotTimeOut ); | |
| 44 | +} | |
| 45 | + | |
| 46 | +void JobTimer::slotTimeOut() | |
| 47 | +{ | |
| 48 | + emit JobTimer::signalRunJob( m_jobData.jobName() ); | |
| 49 | +} | ... | ... |
src/jobtimer.h
0 → 100644
| 1 | +++ a/src/jobtimer.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 | + | |
| 23 | +#ifndef OSDEV_COMPONENTS_JOBTIMER_H | |
| 24 | +#define OSDEV_COMPONENTS_JOBTIMER_H | |
| 25 | + | |
| 26 | +#include <QTimer> | |
| 27 | +#include <QObject> | |
| 28 | +#include <QDateTime> | |
| 29 | +#include <QHash> | |
| 30 | +#include <QString> | |
| 31 | +#include <QVariant> | |
| 32 | +#include <QSharedPointer> | |
| 33 | + | |
| 34 | +#include "jobdata.h" | |
| 35 | + | |
| 36 | +namespace osdev { | |
| 37 | +namespace components { | |
| 38 | + | |
| 39 | +/* ______________________________________ | |
| 40 | + * / Got a dictionary? I want to know the \ | |
| 41 | + * \ meaning of life. / | |
| 42 | + * -------------------------------------- | |
| 43 | + * \ | |
| 44 | + * \ | |
| 45 | + * .--. | |
| 46 | + * |o_o | | |
| 47 | + * |:_/ | | |
| 48 | + * // \ \ | |
| 49 | + * (| | ) | |
| 50 | + * /'\_ _/`\ | |
| 51 | + * \___)=(___/ | |
| 52 | + *//*! | |
| 53 | + * \brief Instead of using separate timers, The job *is* the timer. | |
| 54 | + */ | |
| 55 | +class JobTimer : public QTimer | |
| 56 | +{ | |
| 57 | + Q_OBJECT | |
| 58 | +public: | |
| 59 | + /*! | |
| 60 | + * \brief C'tor taking a jobdata structure to initialize the jobTimer. | |
| 61 | + */ | |
| 62 | + JobTimer( const JobData& _jobData, QObject *_parent = nullptr ); | |
| 63 | + | |
| 64 | + /*! | |
| 65 | + * \brief D'tor | |
| 66 | + */ | |
| 67 | + virtual ~JobTimer(); | |
| 68 | + | |
| 69 | + /*! | |
| 70 | + * \brief Get the jobData as a structure from the scheduled object. | |
| 71 | + * \return The data as object. Empty if no data was set. | |
| 72 | + */ | |
| 73 | + JobData jobData() const { return m_jobData; } | |
| 74 | + | |
| 75 | +private: | |
| 76 | + /*! | |
| 77 | + * \brief Connect all internal signals and slots. | |
| 78 | + */ | |
| 79 | + void connectSignalsSlots(); | |
| 80 | + | |
| 81 | + JobData m_jobData; ///< Structure to hold all jobInformation. | |
| 82 | + | |
| 83 | +signals: | |
| 84 | + /*! | |
| 85 | + * \brief Send the requested job by its name to all connected libraries. | |
| 86 | + */ | |
| 87 | + void signalRunJob( const QString& jobName ); | |
| 88 | + | |
| 89 | +private slots: | |
| 90 | + /*! | |
| 91 | + * \brief Will be called by the parent object (QTimer) times out. | |
| 92 | + */ | |
| 93 | + void slotTimeOut(); | |
| 94 | + | |
| 95 | +}; | |
| 96 | + | |
| 97 | +} /* End namespace components */ | |
| 98 | +} /* End namespace osdev */ | |
| 99 | + | |
| 100 | +#endif /* OSDEV_COMPONENTS_JOBTIMER_H */ | ... | ... |
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() | ... | ... |