1 // Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
24 //#ifndef DISABLE_PYCONSOLE
25 //#define DISABLE_PYCONSOLE
27 //#else //#if defined WIN32
28 //#ifdef DISABLE_PYCONSOLE
29 // NOTE: DO NOT DELETE THIS DEFINITION ON LINUX
30 // or make sure Python is initialized in main() in any case
31 // Otherwise, application based on light SALOME and using Python
32 // are unlikely to work properly.
33 //#undef DISABLE_PYCONSOLE
37 #ifndef DISABLE_PYCONSOLE
38 #include "SUITApp_init_python.hxx"
41 //#endif //#if defined WIN32
43 #include "GUI_version.h"
44 #include "SUITApp_Application.h"
45 #include "SUIT_Desktop.h"
46 #include "SUIT_LicenseDlg.h"
47 #include "SUIT_ResourceMgr.h"
48 #include "SUIT_Session.h"
49 #ifdef USE_SALOME_STYLE
50 #include "Style_Salome.h"
51 #endif // USE_SALOME_STYLE
52 #include "QtxSplash.h"
59 #include <QStringList>
67 static QString salomeVersion()
69 return GUI_VERSION_STR;
72 static QString getAppName( const QString& libName )
74 QString appName = QFileInfo( libName ).baseName();
75 if ( appName.startsWith( "lib" ) ) appName = appName.mid( 3 );
79 // static void MessageOutput( QtMsgType type, const char* msg )
85 // printf( "Debug: %s\n", msg );
90 // printf( "Warning: %s\n", msg );
95 // printf( "Fatal: %s\n", msg );
103 class SUITApp_Session: public SUIT_Session
106 SUITApp_Session( bool theIniFormat, int argc, char** argv ) : SUIT_Session( argc, argv ), myIniFormat ( theIniFormat ) {}
107 virtual ~SUITApp_Session() {}
109 virtual SUIT_ResourceMgr* createResourceMgr( const QString& appName ) const
111 SUIT_ResourceMgr* resMgr = 0;
114 resMgr = new SUIT_ResourceMgr( appName, QString( "%1Config" ) );
115 resMgr->setCurrentFormat( "ini" );
119 resMgr = new SUIT_ResourceMgr( appName, QString( "%1Config" ) );
120 resMgr->setVersion( salomeVersion() );
121 resMgr->setCurrentFormat( "xml" );
126 resMgr->setOption( "translators", QString( "%P_msg_%L.qm|%P_icons.qm|%P_images.qm" ) );
135 int main( int argc, char* argv[] )
137 //#ifndef DISABLE_PYCONSOLE
138 // // First of all initialize Python, as in complex multi-component applications
139 // // someone else might initialize it some way unsuitable for light SALOME!
140 // Py_SetProgramName( argv[0] );
141 // Py_Initialize(); // Initialize the interpreter
142 // PySys_SetArgv( argc, argv );
143 // PyEval_InitThreads(); // Create (and acquire) the interpreter lock
144 // PyEval_ReleaseLock(); // Let the others use Python API until we need it again
147 //qInstallMsgHandler( MessageOutput );
150 bool noExceptHandling = false;
151 bool iniFormat = false;
152 bool noSplash = false;
153 bool useLicense = false;
154 for ( int i = 1; i < argc; i++ )
156 if ( !strcmp( argv[i], "--noexcepthandling" ) )
157 noExceptHandling = true;
158 else if ( !strcmp( argv[i], "--format=ini") )
160 else if ( !strcmp( argv[i], "--nosplash") )
162 else if ( !strcmp( argv[i], "--uselicense" ) )
165 argList.append( QString( argv[i] ) );
168 // set "C" locale if requested via preferences
170 SUITApp_Session stmp( iniFormat, argc, argv );
171 QApplication::setApplicationName( "salome" );
172 SUIT_ResourceMgr* resMgr = stmp.createResourceMgr( "LightApp" );
173 bool isCloc = resMgr->booleanValue( "language", "locale", true );
175 QLocale::setDefault( QLocale::c() );
178 QLocale::setDefault( QLocale::system() );
182 // add <qtdir>/plugins directory to the pluins search path for image plugins
183 QString qtdir = Qtx::qtDir( "plugins" );
184 if ( !qtdir.isEmpty() )
185 QApplication::addLibraryPath( qtdir );
187 // TODO (QT5 PORTING) Below is a temporary solution, to allow compiling with Qt 5
188 #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
189 //Set a "native" graphic system in case if application runs on the remote host
190 QString remote(::getenv("REMOTEHOST"));
191 QString client(::getenv("SSH_CLIENT"));
192 if(remote.length() > 0 || client.length() > 0 ) {
193 QApplication::setGraphicsSystem(QLatin1String("native"));
197 SUITApp_Application app( argc, argv );
198 QString cfgAppName = getAppName( argList.isEmpty() ? QString() : argList.first() );
199 // hard-coding for LightApp :( no other way to this for the moment
200 if ( cfgAppName == "LightApp" ) {
201 app.setOrganizationName( "salome" );
202 app.setApplicationName( "salome" );
203 app.setApplicationVersion( salomeVersion() );
215 HANDLE hProcess = GetCurrentProcess();
216 OpenProcessToken(hProcess,TOKEN_QUERY,&aToken);
217 if( GetUserProfileDirectory( aToken, aStr, &aLen ) )
221 if ( ::getenv( "HOME" ) )
222 env = ::getenv( "HOME" );
225 QFile file( env + "/ReadLicense.log" ); // Read the text from a file
226 if( !file.exists() ) {
227 SUIT_LicenseDlg aLicense;
228 if ( aLicense.exec() != QDialog::Accepted )
233 if ( !argList.isEmpty() )
235 SUITApp_Session aSession( iniFormat, argc, argv );
236 QtxSplash* splash = 0;
237 SUIT_ResourceMgr* resMgr = aSession.createResourceMgr( argList.first() );
242 resMgr->loadLanguage();
244 splash = QtxSplash::splash( QPixmap() );
245 splash->readSettings( resMgr );
246 if ( splash->pixmap().isNull() ) {
251 QString appName = QObject::tr( "APP_NAME" ).trimmed();
252 QString appVersion = QObject::tr( "APP_VERSION" ).trimmed();
253 if ( appVersion == "APP_VERSION" )
255 if ( appName == "APP_NAME" || appName.toLower() == "salome" )
256 appVersion = salomeVersion();
260 splash->setOption( "%A", appName );
261 splash->setOption( "%V", QObject::tr( "ABOUT_VERSION" ).arg( appVersion ) );
262 splash->setOption( "%L", QObject::tr( "ABOUT_LICENSE" ) );
263 splash->setOption( "%C", QObject::tr( "ABOUT_COPYRIGHT" ) );
265 QApplication::instance()->processEvents();
270 #ifndef DISABLE_PYCONSOLE
271 //...Initialize python
273 char* _argv[] = {(char*)""};
274 SUIT_PYTHON::init_python(_argc,_argv);
277 SUIT_Application* theApp = aSession.startApplication( argList.first() );
280 #ifdef USE_SALOME_STYLE
281 Style_Salome::initialize( theApp->resourceMgr() );
282 if ( theApp->resourceMgr()->booleanValue( "Style", "use_salome_style", true ) )
283 Style_Salome::apply();
284 #endif // USE_SALOME_STYLE
286 if ( !noExceptHandling )
287 app.setHandler( aSession.handler() );
290 splash->finish( theApp->desktop() );