From 2fe432b43d688f58df262de32593c38c6093ef4a Mon Sep 17 00:00:00 2001 From: jonjenssen Date: Tue, 15 Oct 2024 00:34:51 +0200 Subject: [PATCH] Make sure launching external processes works after switch to qt6 --- .../RicRunFaultReactModelingFeature.cpp | 2 +- .../RicRunWellIntegrityAnalysisFeature.cpp | 2 +- .../RicImportSeismicFeature.cpp | 2 +- .../ProcessControl/RimProcess.cpp | 62 ++++++++++++------- .../ProcessControl/RimProcess.h | 5 +- 5 files changed, 48 insertions(+), 25 deletions(-) diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicRunFaultReactModelingFeature.cpp b/ApplicationLibCode/Commands/GeoMechCommands/RicRunFaultReactModelingFeature.cpp index f989e847fd..87b449dee7 100644 --- a/ApplicationLibCode/Commands/GeoMechCommands/RicRunFaultReactModelingFeature.cpp +++ b/ApplicationLibCode/Commands/GeoMechCommands/RicRunFaultReactModelingFeature.cpp @@ -94,7 +94,7 @@ void RicRunFaultReactModelingFeature::onActionTriggered( bool isChecked ) RimProcess process; process.setCommand( command ); - process.setParameters( parameters ); + process.addParameters( parameters ); if ( !process.execute() ) { diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicRunWellIntegrityAnalysisFeature.cpp b/ApplicationLibCode/Commands/GeoMechCommands/RicRunWellIntegrityAnalysisFeature.cpp index 7f97e2ea08..a8c974c356 100644 --- a/ApplicationLibCode/Commands/GeoMechCommands/RicRunWellIntegrityAnalysisFeature.cpp +++ b/ApplicationLibCode/Commands/GeoMechCommands/RicRunWellIntegrityAnalysisFeature.cpp @@ -107,7 +107,7 @@ void RicRunWellIntegrityAnalysisFeature::onActionTriggered( bool isChecked ) RimProcess process; process.setCommand( command ); - process.setParameters( parameters ); + process.addParameters( parameters ); if ( !process.execute() ) { diff --git a/ApplicationLibCode/Commands/SeismicCommands/RicImportSeismicFeature.cpp b/ApplicationLibCode/Commands/SeismicCommands/RicImportSeismicFeature.cpp index 5a6e56bea0..da7a610467 100644 --- a/ApplicationLibCode/Commands/SeismicCommands/RicImportSeismicFeature.cpp +++ b/ApplicationLibCode/Commands/SeismicCommands/RicImportSeismicFeature.cpp @@ -174,7 +174,7 @@ bool RicImportSeismicFeature::runSEGYConversion( RimSEGYConvertOptions* options } process.setCommand( command ); - process.setParameters( parameters ); + process.addParameters( parameters ); bool showStdOut = false; bool showStdErr = true; diff --git a/ApplicationLibCode/ProjectDataModel/ProcessControl/RimProcess.cpp b/ApplicationLibCode/ProjectDataModel/ProcessControl/RimProcess.cpp index 770b6f3684..ac37b69776 100644 --- a/ApplicationLibCode/ProjectDataModel/ProcessControl/RimProcess.cpp +++ b/ApplicationLibCode/ProjectDataModel/ProcessControl/RimProcess.cpp @@ -27,14 +27,6 @@ #include #include -// Disable deprecation warning for QProcess::start() -#ifdef _MSC_VER -#pragma warning( disable : 4996 ) -#endif -#ifdef __GNUC__ -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif - CAF_PDM_SOURCE_INIT( RimProcess, "RimProcess" ); int RimProcess::m_nextProcessId = 1; @@ -83,9 +75,8 @@ void RimProcess::addParameter( QString paramStr ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimProcess::setParameters( QStringList parameterList ) +void RimProcess::addParameters( QStringList parameterList ) { - m_arguments.clear(); for ( int i = 0; i < parameterList.size(); i++ ) { addParameter( parameterList[i] ); @@ -97,7 +88,16 @@ void RimProcess::setParameters( QStringList parameterList ) //-------------------------------------------------------------------------------------------------- void RimProcess::setCommand( QString cmdStr ) { - m_command = cmdStr; + m_command = cmdStr.trimmed(); + + QString shell = optionalCommandInterpreter(); + if ( shell.isEmpty() ) return; + + QString preParam = optionalPreParameters(); + if ( !preParam.isEmpty() ) m_arguments.append( preParam ); + + m_arguments.append( cmdStr.trimmed() ); + m_command = shell; } //-------------------------------------------------------------------------------------------------- @@ -156,7 +156,8 @@ bool RimProcess::execute( bool enableStdOut, bool enableStdErr ) } proc->setProcessEnvironment( env ); - proc->start( cmd ); + proc->start( m_command, m_arguments ); + auto error = proc->errorString(); if ( proc->waitForStarted( -1 ) ) { while ( !proc->waitForFinished( 500 ) ) @@ -167,7 +168,7 @@ bool RimProcess::execute( bool enableStdOut, bool enableStdErr ) } else { - RiaLogging::error( QString( "Failed to start process %1." ).arg( m_id ) ); + RiaLogging::error( QString( "Failed to start process %1. %2." ).arg( m_id ).arg( error ) ); } proc->deleteLater(); @@ -182,17 +183,17 @@ QString RimProcess::optionalCommandInterpreter() const { if ( m_command.value().isNull() ) return ""; - if ( m_command.value().endsWith( ".cmd", Qt::CaseInsensitive ) || m_command.value().endsWith( ".bat", Qt::CaseInsensitive ) ) + if ( isWindowsBatchFile() ) { - return "cmd.exe /c "; + return "cmd.exe"; } if ( m_command.value().endsWith( ".sh", Qt::CaseInsensitive ) ) { - return "bash "; + return "bash"; } if ( m_command.value().endsWith( ".csh", Qt::CaseInsensitive ) ) { - return "csh "; + return "csh"; } return ""; } @@ -200,13 +201,32 @@ QString RimProcess::optionalCommandInterpreter() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -QString RimProcess::commandLine() const +QString RimProcess::optionalPreParameters() const { - QString cmdline; + if ( m_command.value().isNull() ) return ""; + + if ( isWindowsBatchFile() ) + { + return "/c"; + } + + return ""; +} - cmdline += optionalCommandInterpreter(); +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimProcess::isWindowsBatchFile() const +{ + return ( m_command.value().endsWith( ".cmd", Qt::CaseInsensitive ) || m_command.value().endsWith( ".bat", Qt::CaseInsensitive ) ); +} - cmdline += handleSpaces( m_command ); +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimProcess::commandLine() const +{ + QString cmdline = handleSpaces( m_command ); for ( int i = 0; i < m_arguments.size(); i++ ) { diff --git a/ApplicationLibCode/ProjectDataModel/ProcessControl/RimProcess.h b/ApplicationLibCode/ProjectDataModel/ProcessControl/RimProcess.h index 67ef910e8d..979f8b7050 100644 --- a/ApplicationLibCode/ProjectDataModel/ProcessControl/RimProcess.h +++ b/ApplicationLibCode/ProjectDataModel/ProcessControl/RimProcess.h @@ -40,7 +40,7 @@ class RimProcess : public caf::PdmObject void setDescription( QString desc ); void setCommand( QString cmdStr ); void addParameter( QString paramStr ); - void setParameters( QStringList parameterList ); + void addParameters( QStringList parameterList ); void addEnvironmentVariable( QString name, QString value ); @@ -57,8 +57,11 @@ class RimProcess : public caf::PdmObject private: QString optionalCommandInterpreter() const; + QString optionalPreParameters() const; QString handleSpaces( QString argument ) const; + bool isWindowsBatchFile() const; + caf::PdmField m_command; QStringList m_arguments; caf::PdmField m_description;