//################################################################################################## // // Custom Visualization Core library // Copyright (C) 2011-2013 Ceetron AS // // This library may be used under the terms of either the GNU General Public License or // the GNU Lesser General Public License as follows: // // GNU General Public License Usage // This library is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This library is distributed in the hope that it will be useful, but WITHOUT ANY // WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. // // See the GNU General Public License at <> // for more details. // // GNU Lesser General Public License Usage // This library is free software; you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation; either version 2.1 of the License, or // (at your option) any later version. // // This library is distributed in the hope that it will be useful, but WITHOUT ANY // WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. // // See the GNU Lesser General Public License at <> // for more details. // //################################################################################################## #include "cafUiProcess.h" #include namespace caf { //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- UiProcess::UiProcess( QObject* parent ) : QProcess( parent ) { connect( this, SIGNAL( started() ), SLOT( slotProcStarted() ) ); connect( this, SIGNAL( error( QProcess::ProcessError ) ), SLOT( slotProcError( QProcess::ProcessError ) ) ); connect( this, SIGNAL( finished( int, QProcess::ExitStatus ) ), SLOT( slotProcFinished( int, QProcess::ExitStatus ) ) ); connect( this, SIGNAL( stateChanged( QProcess::ProcessState ) ), SLOT( slotProcStateChanged( QProcess::ProcessState ) ) ); connect( this, SIGNAL( readyReadStandardError() ), SLOT( slotUpdateStatusMessage() ) ); connect( this, SIGNAL( readyReadStandardOutput() ), SLOT( slotUpdateStatusMessage() ) ); // Use a one sec timer to make sure the status message is updated at least every second QTimer* timer = new QTimer( this ); connect( timer, SIGNAL( timeout() ), this, SLOT( slotUpdateStatusMessage() ) ); timer->start( 1000 ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void UiProcess::doEmitStatusMsg( const QString& msg, int statusMsgType ) { QString simpleMsg = msg; QString formattedMsg = simpleMsg; if ( statusMsgType == PROCESS_STATE_RUNNING ) formattedMsg = QString( "%1" ).arg( simpleMsg ); else if ( statusMsgType == PROCESS_STATE_ERROR ) formattedMsg = QString( "%1" ).arg( simpleMsg ); emit signalStatusMsg( simpleMsg, statusMsgType ); emit signalFormattedStatusMsg( formattedMsg ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void UiProcess::slotProcStarted() { m_timer.start(); doEmitStatusMsg( "Started", PROCESS_STATE_NORMAL ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void UiProcess::slotProcError( QProcess::ProcessError error ) { QString msg = "UNKNOWN"; switch ( error ) { case QProcess::FailedToStart: msg = "Failed to start"; break; case QProcess::Crashed: msg = "Crashed"; break; case QProcess::Timedout: msg = "Timed out"; break; case QProcess::WriteError: msg = "Write error"; break; case QProcess::ReadError: msg = "Read error"; break; case QProcess::UnknownError: msg = "Unknown error"; break; } doEmitStatusMsg( msg, PROCESS_STATE_ERROR ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void UiProcess::slotProcFinished( int exitCode, QProcess::ExitStatus exitStatus ) { if ( exitStatus == QProcess::CrashExit ) { doEmitStatusMsg( "Crashed or aborted", PROCESS_STATE_ERROR ); } else if ( exitStatus == QProcess::NormalExit ) { if ( exitCode == 0 ) { doEmitStatusMsg( "Finished OK", PROCESS_STATE_NORMAL ); } else { QString msg = QString( "Error exit (code %1)" ).arg( exitCode ); doEmitStatusMsg( msg, PROCESS_STATE_ERROR ); } } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void UiProcess::slotProcStateChanged( QProcess::ProcessState newState ) { int statusMsgType = PROCESS_STATE_ERROR; QString msg = "UNKNOWN"; switch ( newState ) { case QProcess::NotRunning: msg = "Not running"; statusMsgType = PROCESS_STATE_NORMAL; break; case QProcess::Starting: msg = "Starting..."; statusMsgType = PROCESS_STATE_NORMAL; break; case QProcess::Running: msg = "Running"; statusMsgType = PROCESS_STATE_RUNNING; break; } doEmitStatusMsg( msg, statusMsgType ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void UiProcess::slotUpdateStatusMessage() { if ( state() == QProcess::Running ) { // Use this as a sign that the process is alive and kicking // Emit a message with the current run time to signify progress double timeRunning = m_timer.elapsed() / 1000.0; QString msg = QString( "Running (%1 s)" ).arg( timeRunning, 0, 'f', 1 ); doEmitStatusMsg( msg, PROCESS_STATE_RUNNING ); } } } // namespace caf