// Author : Vadim SANDLER, Open CASCADE SAS (vadim.sandler@opencascade.com)
// Project : SALOME
// Module : Installation Wizard
-// Copyright : 2002-2008 CEA
+// Copyright : 2002-2010 CEA
#include "globals.h"
QString tmpDirName() { return QString( "/INSTALLWORK" ) + QString::number( getpid() ); }
#define TEMPDIRNAME tmpDirName()
+// uncomment next line to redirect all shell output (usually for errors) to /dev/null device
+// #define USE_DEV_NULL
+
// ================================================================
/*!
* Script
if ( !fi.exists() ) {
// VSR: Create directory and set permissions to allow other users to remove it
Script script;
- script << "mkdir" << QUOTE( fi.absFilePath() ) << ">& /dev/null" << "&&";
- script << "chmod 777" << QUOTE( fi.absFilePath() ) << ">& /dev/null";
+ script << "mkdir" << QUOTE( fi.absFilePath() );
+#ifdef USE_DEV_NULL
+ script << ">& /dev/null";
+#endif
+ script << "&&";
+ script << "chmod 777" << QUOTE( fi.absFilePath() );
+#ifdef USE_DEV_NULL
+ script << ">& /dev/null";
+#endif
___MESSAGE___( "script = " << script.script().latin1() );
if ( system( script.script().latin1() ) )
return false;
if ( !QFileInfo( aDir ).exists() ) {
// VSR: Create directory, other users should NOT have possibility to remove it!!!
Script script;
- script << "mkdir" << QUOTE( aDir ) << ">& /dev/null";
+ script << "mkdir" << QUOTE( aDir );
+#ifdef USE_DEV_NULL
+ script << ">& /dev/null";
+#endif
___MESSAGE___( "script = " << script.script().latin1() );
if ( system( script.script().latin1() ) )
return false;
.arg( __IW_VERSION_MINOR__ ) \
.arg( __IW_VERSION_PATCH__ ) );
QLabel* copyright = new QLabel( this, "copyright" );
- copyright->setText( "<b>Copyright</b> © 2007-2009 CEA/DEN" );
+ copyright->setText( "<b>Copyright</b> © 2007-2011 CEA/DEN" );
QFont font = title->font();
font.setPointSize( (int)( font.pointSize() * 1.8 ) );
title->setFont( font );
addLogo( pixmap( pxLogo ) );
// set defaults
- setVersion( "5.1.0" );
+ setVersion( "6.3.0" );
setCaption( tr( "SALOME %1" ).arg( myVersion ) );
- setCopyright( tr( "<h5>Copyright © 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE<br></h5>"
+ setCopyright( tr( "<h5>Copyright © 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE<br></h5>"
"<h5>Copyright © 2003-2007 OPEN CASCADE,<br>EADS/CCR, LIP6, CEA/DEN, CEDRAT, EDF R&D,<br>LEG, PRINCIPIA R&D, BUREAU VERITAS</h5>" ));
setLicense( tr( "<h5>GNU LGPL</h5>" ) );
int PID = (int)shellProcess->processIdentifier();
if ( PID > 0 ) {
Script script;
- script << "kill -9" << QString::number( PID ) << ">& /dev/null";
+ script << "kill -9" << QString::number( PID );
+#ifdef USE_DEV_NULL
+ script << ">& /dev/null";
+#endif
___MESSAGE___( "script: " << script.script().latin1() );
if ( system( script.script().latin1() ) ) {
// error
progressView = new ProgressView( widget );
progressView->setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Expanding ) );
progressView->setMinimumSize( 100, 10 );
+ // possibility to ignore all errors
+ ignoreErrCBox = new QCheckBox( tr( "Ignore errors" ), widget );
+ setAboutInfo( ignoreErrCBox, tr( "Check this option if you want to proceed installation \nprocess even there will be some errors" ) );
+ ignoreErrCBox->setChecked( false );
+ // product installation status bar
statusLab = new QLabel( widget );
statusLab->setFrameShape( QButtonGroup::LineEditPanel );
setAboutInfo( progressView, tr( "Installation status on the selected products" ) );
// layouting
layout->addRowSpacing( 0, 6 );
- layout->addWidget( resultLab, 1, 0 );
- layout->addWidget( progressView, 2, 0 );
- layout->addWidget( statusLab, 3, 0 );
+ layout->addWidget( resultLab, 1, 0 );
+ layout->addWidget( progressView, 2, 0 );
+ layout->addWidget( ignoreErrCBox, 3, 0 );
+ layout->addWidget( statusLab, 4, 0 );
// layouting
pageLayout->addWidget( splitter, 0, 0 );
// adding page
QMessageBox::NoButton );
// enable <Next> button
setNextEnabled( true );
- nextButton()->setText( tr( "&Start" ) );
- setAboutInfo( nextButton(), tr( "Start installation process" ) );
- // reconnect Next button - to use it as Start button
- disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
- disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
+ doPostActions( tr( "&Start" ), tr( "Start installation process" ) );
connect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
// enable <Back> button
setBackEnabled( true );
// ================================================================
/*!
* SALOME_InstallWizard::runCheckFLib
- * Run the Fortran libraries checking
+ * Run the Fortran and other required libraries checking
*/
// ================================================================
void SALOME_InstallWizard::runCheckFLib()
// Check Fortran libraries
checkFLibProc->clearArguments();
// ... update status label
- statusLab->setText( tr( "Check Fortran libraries..." ) );
+ statusLab->setText( tr( "Check Fortran and other required libraries..." ) );
// ... search "not found" libraries
checkFLibProc->setWorkingDirectory( QDir( rootDirPath() ).filePath( "config_files" ) );
checkFLibProc->addArgument( "checkFortran.sh" );
// ================================================================
/*!
* SALOME_InstallWizard::checkFLibResult
- * Slot to take result of Fortran libraries checking
+ * Slot to take result of Fortran and other required libraries checking
*/
// ================================================================
void SALOME_InstallWizard::checkFLibResult()
{
if ( checkFLibProc->normalExit() && checkFLibProc->exitStatus() == 1 ) {
- QStringList notFoundLibsList;
+ QStringList notFoundLibsList, notFoundOptLibsList;
QString record = "";
+ QStringList prefOptLibs = getOptionalLibs();
+ // create list of strings with all 'not found' libraries
while ( checkFLibProc->canReadLineStdout() ) {
- record = checkFLibProc->readLineStdout();
- if ( !record.isEmpty() && !notFoundLibsList.contains( record ) )
- notFoundLibsList.append( record );
- }
- QMessageBox::warning( this,
- tr( "Warning" ),
- tr( "The following libraries are absent on current system:\n"
- "%1").arg( notFoundLibsList.join( "\n" ) ),
- QMessageBox::Ok,
- QMessageBox::NoButton,
- QMessageBox::NoButton );
+ record = checkFLibProc->readLineStdout().stripWhiteSpace();
+ if ( !record.isEmpty() ) {
+ record = QStringList::split( " ", record )[0];
+ if ( !notFoundLibsList.contains( record ) &&
+ !notFoundOptLibsList.contains( record ) ) {
+ bool isOptional = false;
+ QStringList::Iterator it_opt;
+ for ( it_opt = prefOptLibs.begin(); it_opt != prefOptLibs.end(); ++it_opt )
+ if ( record.startsWith( (*it_opt).stripWhiteSpace(), false ) ) {
+ isOptional = true;
+ break;
+ }
+ isOptional ? notFoundOptLibsList.append( record ) \
+ : notFoundLibsList.append( record );
+ }
+ }
+ }
+ QString msg = tr( "Some libraries are absent!<br><br>" );
+ if ( !notFoundLibsList.isEmpty() ) {
+ msg += tr( "One or several <b>mandatory</b> libraries listed below are not found. SALOME <u>may not work</u> properly.<br>" );
+ msg += notFoundLibsList.join( "<br>" );
+ msg += "<br><br>";
+ }
+ if ( !notFoundOptLibsList.isEmpty() ) {
+ msg += tr( "One or several <b>optional</b> libraries listed below are not found. This <u>does not affect</u> on the correct work of SALOME platform.<br>" );
+ msg += notFoundOptLibsList.join( "<br>" );
+ }
+ if ( !notFoundLibsList.isEmpty() )
+ QMessageBox::warning( this,
+ tr( "Warning" ),
+ msg,
+ QMessageBox::Ok,
+ QMessageBox::NoButton,
+ QMessageBox::NoButton );
+ else if ( !notFoundOptLibsList.isEmpty() )
+ QMessageBox::information( this,
+ tr( "Information" ),
+ msg,
+ QMessageBox::Ok,
+ QMessageBox::NoButton,
+ QMessageBox::NoButton );
}
// Update GUI and check installation errors
completeInstallation();
}
return;
}
+
+ // else try to find aborted product
+ prodProc = progressView->findStatus( Aborted );
+ if ( !prodProc.isNull() )
+ return; // installation has been aborted
+
___MESSAGE___( "All products have been installed successfully" );
// all products are installed successfully
MapProducts::Iterator mapIter;
statusLab->setText( tr( "Installation completed" ) );
// <Next> button
setNextEnabled( true );
- nextButton()->setText( tr( "&Next >" ) );
- setAboutInfo( nextButton(), tr( "Move to the next step of the installation procedure" ) );
- disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
- disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
+ doPostActions( tr( "&Next >" ), tr( "Move to the next step of the installation procedure" ) );
connect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
// <Back> button
setBackEnabled( true );
if ( hasErrors ) {
if ( QMessageBox::warning( this,
tr( "Warning" ),
- tr( "There were some errors and/or warnings during the installation.\n"
+ tr( "There were some errors during the installation.\n"
"Do you want to save the installation log?" ),
tr( "&Save" ),
tr( "&Cancel" ),
script << (*it).script() << "execute";
script << QUOTE( QFileInfo( QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ) ).absFilePath() );
script << QUOTE( QFileInfo( QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + TEMPDIRNAME ).absFilePath() );
+#ifdef USE_DEV_NULL
script << ">& /dev/null";
+#endif
___MESSAGE___( "script: " << script.script().latin1() );
if ( (*it).script().isEmpty() || system( script.script().latin1() ) ) {
QMessageBox::warning( this,
script << "cd" << QUOTE( rd.filePath( "config_files" ) ) << ";";
script << "remove_tmp.sh" << QUOTE( tempFolder->text().stripWhiteSpace() + TEMPDIRNAME );
script << QUOTE( getAllProducts( productsMap ) );
+#ifdef USE_DEV_NULL
script << ">& /dev/null";
+#endif
___MESSAGE___( "script = " << script.script().latin1() );
if ( system( script.script().latin1() ) ) {
// error
if ( rmDir && !tmpCreated.isNull() ) {
script.clear();
script << "rm -rf" << QUOTE( tmpCreated );
+#ifdef USE_DEV_NULL
script << ">& /dev/null";
+#endif
if ( system( script.script().latin1() ) ) {
// error
}
// ================================================================
void SALOME_InstallWizard::pageChanged( const QString & mytitle)
{
- nextButton()->setText( tr( "&Next >" ) );
- setAboutInfo( nextButton(), tr( "Move to the next step of the installation procedure" ) );
- disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
- disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
+ doPostActions( tr( "&Next >" ), tr( "Move to the next step of the installation procedure" ) );
connect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
cancelButton()->disconnect();
connect( cancelButton(), SIGNAL( clicked()), this, SLOT( reject() ) );
}
// add extra products to install list
extraProducts.clear();
- extraProducts.insert( "gcc", "gcc-common.sh" );
+ //extraProducts.insert( "gcc", "gcc-common.sh" );
if ( refPlatform == commonPlatform && installType == Binaries )
extraProducts.insert( "DebianLibsForSalome", "DEBIANFORSALOME-3.1.sh" );
}
passedParams->clear();
passedParams->setEnabled( false );
QFont f = parametersLab->font(); f.setBold( false ); parametersLab->setFont( f );
- nextButton()->setText( tr( "&Start" ) );
- setAboutInfo( nextButton(), tr( "Start installation process" ) );
- // reconnect Next button - to use it as Start button
- disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
- disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
+ doPostActions( tr( "&Start" ), tr( "Start installation process" ) );
connect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
setNextEnabled( true );
// reconnect Cancel button to terminate process
script << (*it).script() << "check_enabled";
script << QUOTE( QFileInfo( QDir::cleanDirPath( targetFolder->text().stripWhiteSpace() ) ).absFilePath() );
script << QUOTE( QFileInfo( QDir::cleanDirPath( tempFolder->text().stripWhiteSpace() ) + TEMPDIRNAME ).absFilePath() );
+#ifdef USE_DEV_NULL
script << ">& /dev/null";
+#endif
___MESSAGE___( "script: " << script.script().latin1() );
(*it).button()->setEnabled( !(*it).script().isEmpty() && !system( script.script().latin1() ) );
}
installInfo->setFinished( false );
passedParams->clear();
passedParams->setEnabled( false );
+ // disable 'Ignore errors' checkbox during installation process
+ ignoreErrCBox->setEnabled( false );
QFont f = parametersLab->font(); f.setBold( false ); parametersLab->setFont( f );
// update status label
item = (QCheckListItem*)( item->nextSibling() );
}
// if something at all is selected
- if ( (int)toInstall.count() > 1 ) {
+ if ( (int)toInstall.count() > 0 ) {
if ( installType == Compile ) {
// update status label
statusLab->setText( tr( "Installation has been aborted" ) );
// enable <Next> button
setNextEnabled( true );
- nextButton()->setText( tr( "&Start" ) );
- setAboutInfo( nextButton(), tr( "Start installation process" ) );
- // reconnect Next button - to use it as Start button
- disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
- disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
+ doPostActions( tr( "&Start" ), tr( "Start installation process" ) );
connect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
// enable <Back> button
setBackEnabled( true );
// installation aborted
abort();
statusLab->setText( tr( "Installation has been aborted by user" ) );
- // enable <Next> button
+ // update <Next> button
setNextEnabled( true );
- nextButton()->setText( tr( "&Start" ) );
- setAboutInfo( nextButton(), tr( "Start installation process" ) );
- // reconnect Next button - to use it as Start button
- disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
- disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
+ doPostActions( tr( "&Start" ), tr( "Start installation process" ) );
connect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
// enable <Back> button
setBackEnabled( true );
installInfo->setFinished( true );
// enable <Next> button
setNextEnabled( true );
- nextButton()->setText( tr( "&Start" ) );
- setAboutInfo( nextButton(), tr( "Start installation process" ) );
- // reconnect Next button - to use it as Start button
- disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
- disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
+ doPostActions( tr( "&Start" ), tr( "Start installation process" ) );
connect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
- //nextButton()->setText( tr( "&Next >" ) );
- //setAboutInfo( nextButton(), tr( "Move to the next step of the installation procedure" ) );
- //disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
- //disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
+ //doPostActions( tr( "&Next >" ), tr( "Move to the next step of the installation procedure" ) );
//connect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
// enable <Back> button
setBackEnabled( true );
installInfo->scrollToBottom();
hasErrors = true;
}
+
+ // stop or proceed installation process
+ manageInstProc();
+
// VSR: 10/11/05 - disable answer mode ==>
// passedParams->setEnabled( true );
// passedParams->setFocus();
// VSR: 10/11/05 - disable answer mode <==
}
// ================================================================
+/*!
+ * SALOME_InstallWizard::manageInstProc
+ * QProcess slot: -->stop installation if there is an error in stderr
+ */
+// ================================================================
+void SALOME_InstallWizard::manageInstProc()
+{
+ if ( !hasErrors || ignoreErrCBox->isChecked() )
+ return; //proceed installation process
+
+ // abort the current installation
+ statusLab->setText( tr( "Aborting installation..." ) );
+ abort();
+ statusLab->setText( tr( "Installation has been aborted because some errors" ) );
+ if ( QMessageBox::critical( this,
+ tr( "Error" ),
+ tr( "Installation process has been stopped, because an error occured \n"
+ "during an installation of the current product!\n"
+ "Please see the installation progress view for more details about the error.\n\n"
+ "Do you want to save the installation log?" ),
+ tr( "&Save" ),
+ tr( "&Cancel" ),
+ QString::null,
+ 0,
+ 1 ) == 0 )
+ saveLog();
+ // enable <Next> button
+ setNextEnabled( true );
+ doPostActions( tr( "&Start" ), tr( "Start installation process" ) );
+ connect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
+ // enable <Back> button
+ setBackEnabled( true );
+ installInfo->setFinished( true );
+}
+// ================================================================
/*!
* SALOME_InstallWizard::setDependancies
* Sets dependancies for the product item
productsMap[item] = dep;
}
// ================================================================
+/*!
+ * SALOME_InstallWizard::doPostActions
+ * Executes some actions after finish of installation process (successful or not)
+ */
+// ================================================================
+void SALOME_InstallWizard::doPostActions( const QString& btnText,
+ const QString& btnAboutInfo )
+{
+ // update <Next> button
+ nextButton()->setText( btnText );
+ setAboutInfo( nextButton(), btnAboutInfo );
+ // reconnect Next button - to use it as Start button
+ disconnect( this, SIGNAL( nextClicked() ), this, SLOT( next() ) );
+ disconnect( this, SIGNAL( nextClicked() ), this, SLOT( onStart() ) );
+ // enable 'Ignore errors' checkbox
+ ignoreErrCBox->setEnabled( true );
+}
+// ================================================================
/*!
* SALOME_InstallWizard::addFinishButton
* Add button for the <Finish> page.