Salome HOME
updated copyright message
[modules/gui.git] / src / Session / Session_Session_i.cxx
index 6c4af9284523e0898cf51f726ddec393bb27410e..ffa472d58440ebd5146ce3807cc4fa52e5a2fa68 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2019  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2023  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
 #include <unistd.h>
 #endif
 
-/*!
-  constructor
-*/
-SALOME_Session_i::SALOME_Session_i(int argc,
-                                   char ** argv,
-                                   CORBA::ORB_ptr orb,
-                                   PortableServer::POA_ptr poa,
-                                   QMutex* GUIMutex,
-                                   QWaitCondition* GUILauncher)
+SALOME_Session_i::SALOME_Session_i(int argc, char ** argv, CORBA::ORB_ptr orb, PortableServer::POA_ptr poa, QMutex* GUIMutex, QWaitCondition* GUILauncher):
+_argc(argc),_argv(argv),_isGUI(false),_GUIMutex(GUIMutex),_GUILauncher(GUILauncher),
+_orb(CORBA::ORB::_duplicate(orb)),_poa(PortableServer::POA::_duplicate(poa)),_isShuttingDown(false)
+{
+  _NS.reset(new SALOME_NamingService(_orb));
+}
+
+SALOME_Session_i::SALOME_Session_i(int argc, char ** argv, CORBA::ORB_ptr orb, PortableServer::POA_ptr poa, QMutex* GUIMutex, QWaitCondition* GUILauncher, SALOME_NamingService_Abstract *NS):
+_argc(argc),_argv(argv),_isGUI(false),_GUIMutex(GUIMutex),_GUILauncher(GUILauncher),
+_orb(CORBA::ORB::_duplicate(orb)),_poa(PortableServer::POA::_duplicate(poa)),_isShuttingDown(false)
 {
-  _argc = argc ;
-  _argv = argv ;
-  _isGUI = false ;
-  _orb = CORBA::ORB::_duplicate(orb) ;
-  _poa = PortableServer::POA::_duplicate(poa) ;
-  _GUIMutex = GUIMutex;
-  _GUILauncher = GUILauncher;
-  _NS = new SALOME_NamingService(_orb);
-  _isShuttingDown = false;
-  //MESSAGE("constructor end");
+  _NS.reset(NS);
 }
 
 /*!
@@ -79,13 +71,14 @@ SALOME_Session_i::SALOME_Session_i(int argc,
 */
 Engines::EngineComponent_ptr SALOME_Session_i::GetComponent(const char* theLibraryName)
 {
-  typedef Engines::EngineComponent_ptr TGetImpl(CORBA::ORB_ptr,
-                                                PortableServer::POA_ptr,
-                                                SALOME_NamingService*,QMutex*);
+  using TGetImpl = Engines::EngineComponent_ptr (*)(CORBA::ORB_ptr, PortableServer::POA_ptr, SALOME_NamingService*,QMutex*);
   OSD_SharedLibrary aSharedLibrary(const_cast<char*>(theLibraryName));
   if (aSharedLibrary.DlOpen(OSD_RTLD_LAZY)) {
     if (OSD_Function anOSDFun = aSharedLibrary.DlSymb("GetImpl"))
-      return ((TGetImpl (*)) anOSDFun)(_orb,_poa,_NS,_GUIMutex);
+    {
+      Engines::EngineComponent_ptr ret = ((TGetImpl) anOSDFun)(_orb,_poa,dynamic_cast<SALOME_NamingService*>(_NS.get()),_GUIMutex);
+      return ret;
+    }
   }
   CORBA::Object_var obj = SalomeApp_Engine_i::EngineForComponent(theLibraryName, true);
   if (!CORBA::is_nil(obj)){
@@ -100,7 +93,6 @@ Engines::EngineComponent_ptr SALOME_Session_i::GetComponent(const char* theLibra
 */
 SALOME_Session_i::~SALOME_Session_i()
 {
-  delete _NS;
   //MESSAGE("destructor end");
 }
 
@@ -136,6 +128,8 @@ void SALOME_Session_i::NSunregister()
   try
     {
       _NS->Destroy_Name("/Kernel/Session");
+      _NS->Destroy_Directory("/Kernel");
+      deleteContainersinNS();
     }
   catch (ServiceUnreachable&)
     {
@@ -341,3 +335,30 @@ SALOME::StringSeq* SALOME_Session_i::getSelection()
   _GUIMutex->unlock();
   return selection._retn();
 }
+
+void SALOME_Session_i::deleteContainersinNS()
+{
+// destroy of all containers and modules
+  _NS->Change_Directory("/Containers");
+  std::vector<std::string> machines = _NS->list_subdirs();
+  for(int i=0;i<(int)machines.size();i++){
+    _NS->Change_Directory(machines[i].c_str());
+    std::vector<std::string> toto = _NS->list_directory();
+    for(int j=0;j<(int)toto.size();j++)
+      _NS->Destroy_Name(toto[j].c_str());
+    std::vector<std::string> containers = _NS->list_subdirs();
+    for(int j=0;j<(int)containers.size();j++){
+      _NS->Change_Directory(containers[j].c_str());
+      std::vector<std::string> modules = _NS->list_directory();
+      for(int k=0;k<(int)modules.size();k++)
+        _NS->Destroy_Name(modules[k].c_str());
+      _NS->Change_Directory("/Containers");
+      _NS->Change_Directory(machines[i].c_str());
+      _NS->Destroy_Directory(containers[j].c_str());
+    }
+    _NS->Change_Directory("/Containers");
+    _NS->Destroy_Directory(machines[i].c_str());
+  }
+  _NS->Change_Directory("/");
+  _NS->Destroy_Directory("/Containers");
+}