2 //=============================================================================
3 // File : SALOME_Session_i.cxx
4 // Created : mar jun 19 14:02:45 CEST 2001
5 // Author : Paul RASCLE, EDF
7 // Copyright : EDF 2001
9 //=============================================================================
11 #include "utilities.h"
13 #include "SALOME_Session_i.hxx"
14 #include "SALOME_NamingService.hxx"
15 #include "SALOME_Session_QThread.hxx"
17 #include "QAD_Application.h"
18 #include "QAD_Desktop.h"
19 #include <qapplication.h>
21 // Open CASCADE Includes
22 #include <OSD_SharedLibrary.hxx>
23 #include <OSD_LoadMode.hxx>
24 #include <OSD_Function.hxx>
26 //=============================================================================
30 //=============================================================================
32 SALOME_Session_i::SALOME_Session_i(int argc, char ** argv, CORBA::ORB_ptr orb, PortableServer::POA_ptr poa)
36 _IAPPThread = new SALOME_Session_QThread(_argc, _argv) ;
39 _orb = CORBA::ORB::_duplicate(orb) ;
40 _poa = PortableServer::POA::_duplicate(poa) ;
41 MESSAGE("constructor end");
44 //***//VISU::VISU_Gen_ptr SALOME_Session_i::GetVisuGen(){
45 //***// typedef VISU::VISU_Gen_ptr VisuGen(CORBA::ORB_var,PortableServer::POA_var,QMutex*);
46 //***// MESSAGE("SALOME_Session_i::GetVisuGen");
47 //***// OSD_SharedLibrary visuSharedLibrary("libVisuEngine.so");
48 //***// if(visuSharedLibrary.DlOpen(OSD_RTLD_LAZY))
49 //***// if(OSD_Function osdFun = visuSharedLibrary.DlSymb("GetVisuGen"))
50 //***// return ((VisuGen (*)) osdFun)(_orb,_poa,&_GUIMutex);
51 //***// return VISU::VISU_Gen::_nil();
54 typedef Engines::Component_ptr VisuGen(CORBA::ORB_var,PortableServer::POA_ptr,QMutex*);
55 Engines::Component_ptr SALOME_Session_i::GetVisuComponent() {
56 MESSAGE("SALOME_Session_i::GetVisuGen");
57 OSD_SharedLibrary visuSharedLibrary("libVISUEngine.so");
58 if(visuSharedLibrary.DlOpen(OSD_RTLD_LAZY))
59 if(OSD_Function osdFun = visuSharedLibrary.DlSymb("GetVisuGen"))
60 return ((VisuGen (*)) osdFun)(_orb,_poa,&_GUIMutex);
63 return Engines::Component::_nil();
66 //=============================================================================
70 //=============================================================================
72 SALOME_Session_i::~SALOME_Session_i()
74 MESSAGE("destructor end");
77 //=============================================================================
79 * tries to find the Corba Naming Service and to register the session,
80 * gives naming service interface to _IAPPThread
82 //=============================================================================
84 void SALOME_Session_i::NSregister()
86 SALOME::Session_ptr pSession = SALOME::Session::_narrow(_this());
89 _NS = new SALOME_NamingService(_orb);
90 _NS->Register(pSession, "/Kernel/Session");
91 _IAPPThread->setNamingService(_NS);
93 catch (ServiceUnreachable&)
95 INFOS("Caught exception: Naming Service Unreachable");
100 INFOS("Caught unknown exception from Naming Service");
102 MESSAGE("NSregister end");
105 //=============================================================================
107 * Launches the GUI if there is none.
108 * The Corba method is oneway (corba client does'nt wait for GUI completion)
110 //=============================================================================
112 void SALOME_Session_i::GetInterface()
114 _GUIMutex.lock() ; // get access to boolean _isGUI
115 _isGUI = _IAPPThread->running();
118 _IAPPThread->start() ;
120 _GUIMutex.unlock() ; // release access to boolean _isGUI
123 //=============================================================================
125 * Kills the session if there are no active studies nore GUI
127 //=============================================================================
129 void SALOME_Session_i::StopSession()
132 QAD_Application::getDesktop()->closeDesktop( true );
135 _GUIMutex.lock(); // get access to boolean _isGUI
136 if ((! _isGUI) && (! _runningStudies))
138 MESSAGE("Ask for Session Kill, OK");
143 _GUIMutex.unlock() ; // release access to boolean _isGUI
144 MESSAGE("Ask for Session Kill, NOK");
145 if (_isGUI) throw SALOME::Session::GUIActive();
146 if (_runningStudies) throw SALOME::Session::RunningStudies();
151 //=============================================================================
153 * Send a SALOME::StatSession structure (see idl) to the client
154 * (number of running studies and presence of GUI)
156 //=============================================================================
158 SALOME::StatSession SALOME_Session_i::GetStatSession()
160 // update Session state
162 _isGUI = _IAPPThread->running();
166 if ( QAD_Application::getDesktop() && QAD_Application::getDesktop()->getActiveApp() )
167 _runningStudies = QAD_Application::getDesktop()->getActiveApp()->getStudies().count();
172 SALOME::StatSession_var myStats = new SALOME::StatSession ;
174 myStats->state = SALOME::running ;
176 myStats->state = SALOME::asleep ;
177 myStats->runningStudies = _runningStudies ;
178 myStats->activeGUI = _isGUI ;
179 return myStats._retn() ;