00001
00034 #include "daemon.h"
00035
00036
00037 #include <iostream>
00038 #include <QtCore/QDateTime>
00039
00040 #include "exceptionhandler.h"
00041
00042 using namespace AlarmNotifications;
00043
00044 Daemon& Daemon::instance()
00045 {
00046 try
00047 {
00048 static Daemon global_instance;
00049 return global_instance;
00050 }
00051 catch ( std::exception& e )
00052 {
00053 ExceptionHandler ( e, "while starting the AlarmNotifications daemon.", true );
00054 exit ( 1 );
00055
00056 }
00057 catch ( ... )
00058 {
00059 ExceptionHandler ( "while starting the AlarmNotifications daemon.", true );
00060 exit ( 1 );
00061
00062 }
00063 }
00064
00065 Daemon::Daemon()
00066 : _run ( true )
00067 {
00068 hsigint = signal ( SIGINT, &signalReceiver );
00069 hsighup = signal ( SIGHUP, &signalReceiver );
00070 hsigquit = signal ( SIGQUIT, &signalReceiver );
00071 hsigusr1 = signal ( SIGUSR1, &signalReceiver );
00072 hsigusr2 = signal ( SIGUSR2, &signalReceiver );
00073 hsigterm = signal ( SIGTERM, &signalReceiver );
00074 std::cout << QDateTime::currentDateTime().toString ( QString::fromUtf8 ( "dd. MMM yyyy hh:mm:ss" ) ).toStdString() << ": Starting AlarmNotifications daemon..." << std::endl;
00075 }
00076
00077 Daemon::~Daemon()
00078 {
00079 std::cout << QDateTime::currentDateTime().toString ( QString::fromUtf8 ( "dd. MMM yyyy hh:mm:ss" ) ).toStdString() << ": Stopping AlarmNotifications daemon..." << std::endl;
00080 }
00081
00082 void Daemon::run()
00083 {
00084 try
00085 {
00086 while ( _run )
00087 {
00088 sleep ( DaemonSleepTimeout );
00089 std::cout << QDateTime::currentDateTime().toString ( QString::fromUtf8 ( "dd. MMM yyyy hh:mm:ss" ) ).toStdString() << ": ";
00090 if ( _asc.getNumberOfAlarms() == 0 )
00091 std::cout << "No alarms active.";
00092 else
00093 std::cout << "Number of active alarms: " << _asc.getNumberOfAlarms();
00094 std::cout << std::endl;
00095 }
00096 }
00097 catch ( std::exception& e )
00098 {
00099 ExceptionHandler ( e, "while running the AlarmNotifications daemon.", true );
00100 }
00101 catch ( ... )
00102 {
00103 ExceptionHandler ( "while running the AlarmNotifications daemon.", true );
00104 }
00105 }
00106
00107 void Daemon::signalReceiver ( int signum )
00108 {
00109 if ( signum != SIGINT && signum != SIGHUP && signum != SIGQUIT && signum != SIGUSR1 && signum != SIGUSR2 && signum != SIGTERM )
00110 return;
00111 instance()._run = false;
00112 signal ( SIGINT, instance().hsigint );
00113 signal ( SIGHUP, instance().hsighup );
00114 signal ( SIGQUIT, instance().hsigquit );
00115 signal ( SIGUSR1, instance().hsigusr1 );
00116 signal ( SIGUSR2, instance().hsigusr2 );
00117 signal ( SIGTERM, instance().hsigterm );
00118 }