X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSession%2FSALOME_Session_Server.cxx;h=27e56ff20335723bbc49642a32e6da3352afc602;hb=b2df0ed4f0edde04e03b929672d0787fd2a5769b;hp=fccdaa2abb561dabec784052f0ebc46e96568a26;hpb=49fbb17ff8c4e647c7c7f8423dbdec69bf9804eb;p=modules%2Fgui.git diff --git a/src/Session/SALOME_Session_Server.cxx b/src/Session/SALOME_Session_Server.cxx index fccdaa2ab..27e56ff20 100755 --- a/src/Session/SALOME_Session_Server.cxx +++ b/src/Session/SALOME_Session_Server.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -6,7 +6,7 @@ // 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. +// 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 @@ -30,8 +30,6 @@ #include #include -#include - #include #include #include @@ -54,7 +52,9 @@ #include #include +#ifdef USE_SALOME_STYLE #include +#endif // USE_SALOME_STYLE #include "GUI_version.h" #include @@ -68,6 +68,12 @@ #include CORBA_SERVER_HEADER(SALOME_Session) #include CORBA_SERVER_HEADER(SALOMEDS) +#ifdef WIN32 +#define sleep _sleep +#endif + +#include + #include #include #include @@ -93,46 +99,28 @@ * - stop Session ( must be idle ) * - get session state */ - +#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) void MessageOutput( QtMsgType type, const char* msg ) +#else +void MessageOutput( QtMsgType type, const QMessageLogContext &context, const QString &msg ) +#endif { switch ( type ) { case QtDebugMsg: - //MESSAGE( "Debug: " << msg ); +#ifdef QT_DEBUG_MESSAGE + MESSAGE( "Debug: " << qPrintable( QString(msg) ) ); +#endif break; case QtWarningMsg: - MESSAGE( "Warning: " << msg ); + MESSAGE( "Warning: " << qPrintable( QString(msg) ) ); break; case QtFatalMsg: - MESSAGE( "Fatal: " << msg ); + MESSAGE( "Fatal: " << qPrintable( QString(msg) ) ); break; } } -/* XPM */ -static const char* pixmap_not_found_xpm[] = { -"16 16 3 1", -" c None", -". c #000000", -"+ c #A80000", -" ", -" ", -" . . ", -" .+. .+. ", -" .+++. .+++. ", -" .+++.+++. ", -" .+++++. ", -" .+++. ", -" .+++++. ", -" .+++.+++. ", -" .+++. .+++. ", -" .+. .+. ", -" . . ", -" ", -" ", -" "}; - QString salomeVersion() { return GUI_VERSION_STR; @@ -145,7 +133,6 @@ public: { setCurrentFormat( "xml" ); setOption( "translators", QString( "%P_msg_%L.qm|%P_icons.qm|%P_images.qm" ) ); - setDefaultPixmap( QPixmap( pixmap_not_found_xpm ) ); } static void initResourceMgr() { @@ -228,36 +215,10 @@ protected: // for backward compatibility we also check files prepended with "." with lower priority QRegExp exp( QString( "\\.?%1rc\\.([a-zA-Z0-9.]+)" ).arg( myExtAppName ) ); #endif - QRegExp vers_exp( "^([0-9]+)([A-Z]|RC)?([0-9]*)", Qt::CaseInsensitive ); - QString fname = QFileInfo( _fname ).fileName(); - if( exp.exactMatch( fname ) ) { - QStringList vers = exp.cap( 1 ).split( ".", QString::SkipEmptyParts ); - int major=0, minor=0; - int release = 0, dev1 = 0, dev2 = 0; - if ( vers.count() > 0 ) major = vers[0].toInt(); - if ( vers.count() > 1 ) minor = vers[1].toInt(); - if ( vers.count() > 2 ) { - if ( vers_exp.indexIn( vers[2] ) != -1 ) { - release = vers_exp.cap( 1 ).toInt(); - QString tag = vers_exp.cap( 2 ).toLower(); - if ( !tag.isEmpty() ) { - if ( tag == "rc" ) // release candidate - dev1 = 49; // 'rc'=49 - else // a, b, c, ... - dev1 = (int)( tag[ 0 ].toLatin1() ) - (int)( QChar('a').toLatin1() ) + 1; // 'a'=1, 'b'=2, ..., 'z'=26 - } - if ( !vers_exp.cap( 3 ).isEmpty() ) - dev2 = vers_exp.cap( 3 ).toInt(); - } - } - - int dev = dev1*100+dev2; - id = major; - id*=100; id+=minor; - id*=100; id+=release; - id*=10000; - if ( dev > 0 ) id-=dev; + if ( exp.exactMatch( fname ) ) { + long fid = Qtx::versionToId( exp.cap( 1 ) ); + if ( fid > 0 ) id = fid; } } return id; @@ -274,10 +235,10 @@ QString SALOME_ResourceMgr::myExtAppVersion = QString(); class SALOME_Session : public SUIT_Session { public: - SALOME_Session() : SUIT_Session() {} + SALOME_Session( int argc, char** argv ) : SUIT_Session( argc, argv ) {} virtual ~SALOME_Session() {} -protected: +public: virtual SUIT_ResourceMgr* createResourceMgr( const QString& appName ) const { SALOME_ResourceMgr::initResourceMgr(); @@ -297,7 +258,8 @@ public: SALOME_QApplication( int& argc, char** argv ) : TestApplication( argc, argv ), myHandler ( 0 ) {} #else SALOME_QApplication( int& argc, char** argv ) -#ifndef WIN32 +// TODO (QT5 PORTING) Below is a temporary solution, to allow compiling with Qt 5 +#if !defined WIN32 && QT_VERSION < QT_VERSION_CHECK(5, 0, 0) // san: Opening an X display and choosing a visual most suitable for 3D visualization // in order to make SALOME viewers work with non-native X servers : QApplication( (Display*)Qtx::getDisplay(), argc, argv, Qtx::getVisual() ), @@ -309,19 +271,6 @@ public: virtual bool notify( QObject* receiver, QEvent* e ) { -#if OCC_VERSION_LARGE < 0x06010100 - // Disable GUI user actions while python command is executed - if (SUIT_Session::IsPythonExecuted()) { - // Disable mouse and keyboard events - QEvent::Type aType = e->type(); - if (aType == QEvent::MouseButtonPress || aType == QEvent::MouseButtonRelease || - aType == QEvent::MouseButtonDblClick || aType == QEvent::MouseMove || - aType == QEvent::Wheel || aType == QEvent::ContextMenu || - aType == QEvent::KeyPress || aType == QEvent::KeyRelease || - aType == QEvent::Accel || aType == QEvent::AccelOverride) - return false; - } -#endif #ifdef ENABLE_TESTRECORDER return myHandler ? myHandler->handle( receiver, e ) : @@ -400,19 +349,40 @@ void shutdownServers( SALOME_NamingService* theNS ) int main( int argc, char **argv ) { // Install Qt debug messages handler +#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) qInstallMsgHandler( MessageOutput ); +#else + qInstallMessageHandler( MessageOutput ); +#endif +// TODO (QT5 PORTING) Below is a temporary solution, to allow compiling with Qt 5 +#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) //Set a "native" graphic system in case if application runs on the remote host QString remote(getenv("REMOTEHOST")); QString client(getenv("SSH_CLIENT")); if(remote.length() > 0 || client.length() > 0 ) { QApplication::setGraphicsSystem(QLatin1String("native")); } - - // add $QTDIR/plugins to the pluins search path for image plugins - QString qtdir( ::getenv( "QTDIR" ) ); +#endif + + // add /plugins dir to the pluins search path for image plugins + QString qtdir = Qtx::qtDir( "plugins" ); if ( !qtdir.isEmpty() ) - QApplication::addLibraryPath( QDir( qtdir ).absoluteFilePath( "plugins" ) ); + QApplication::addLibraryPath( qtdir ); + + // set "C" locale if requested via preferences + { + SALOME_Session stmp( argc, argv ); + QApplication::setApplicationName( "salome" ); + SUIT_ResourceMgr* resMgr = stmp.createResourceMgr( "SalomeApp" ); + bool isCloc = resMgr->booleanValue( "language", "locale", true ); + if ( isCloc ) { + QLocale::setDefault( QLocale::c() ); + } + else { + QLocale::setDefault( QLocale::system() ); + } + } // Create Qt application instance; // this should be done the very first! @@ -422,7 +392,7 @@ int main( int argc, char **argv ) _qappl.setApplicationVersion( salomeVersion() ); // Add application library path (to search style plugin etc...) - QString path = QDir::convertSeparators( SUIT_Tools::addSlash( QString( ::getenv( "GUI_ROOT_DIR" ) ) ) + QString( "bin/salome" ) ); + QString path = QDir::toNativeSeparators( SUIT_Tools::addSlash( QString( ::getenv( "GUI_ROOT_DIR" ) ) ) + QString( "bin/salome" ) ); _qappl.addLibraryPath( path ); bool isGUI = isFound( "GUI", argc, argv ); @@ -602,16 +572,18 @@ int main( int argc, char **argv ) } // SUIT_Session creation - aGUISession = new SALOME_Session(); + aGUISession = new SALOME_Session( argc, argv ); // Load SalomeApp dynamic library MESSAGE( "creation SUIT_Application" ); SUIT_Application* aGUIApp = aGUISession->startApplication( "SalomeApp", 0, 0 ); if ( aGUIApp ) { +#ifdef USE_SALOME_STYLE Style_Salome::initialize( aGUIApp->resourceMgr() ); if ( aGUIApp->resourceMgr()->booleanValue( "Style", "use_salome_style", true ) ) Style_Salome::apply(); +#endif // USE_SALOME_STYLE if ( !isFound( "noexcepthandler", argc, argv ) ) _qappl.setHandler( aGUISession->handler() ); // after loading SalomeApp application @@ -691,15 +663,34 @@ int main( int argc, char **argv ) abort(); //abort program to avoid deadlock in destructors or atexit when shutdown has been interrupted } - PyGILState_Ensure(); - //Destroy orb from python (for chasing memory leaks) + //Destroy orb from python (for chasing memory leaks) //PyRun_SimpleString("from omniORB import CORBA"); //PyRun_SimpleString("orb=CORBA.ORB_init([''], CORBA.ORB_ID)"); //PyRun_SimpleString("orb.destroy()"); - Py_Finalize(); + + // Destroy the ORB: + sleep(2); + //std::cout << "@@@@@ Explicitely destroying the ORB (hoping to kill omniORB threads ...)\n"; + ORB_INIT * init = SINGLETON_::Instance(); + if (init) + init->explicit_destroy(); + //std::cout << "@@@@@ ORB destroyed\n"; + + // After ORB destruction + if(Py_IsInitialized()) + { + PyGILState_Ensure(); + //std::cout << "@@@@@ About to PyFinalize\n"; + Py_Finalize(); + //std::cout << "@@@@@ DONE PyFinalize\n"; + } if ( shutdownAll ) - killOmniNames(); + { + //std::cout << "@@@@@ About to kill omni\n"; + killOmniNames(); + //std::cout << "@@@@@ DONE kill omni\n"; + } MESSAGE( "Salome_Session_Server:endofserver" ); return result;