1 // Copyright (C) 2007-2008 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.
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
22 // SALOME Utils : general SALOME's definitions and tools
23 // File : Utils_DESTRUCTEUR_GENERIQUE.hxx
24 // Author : Antoine YESSAYAN, EDF
28 # if !defined( __DESTRUCTEUR_GENERIQUE__H__ )
29 # define __DESTRUCTEUR_GENERIQUE__H__
31 #include <SALOMEconfig.h>
33 #include "SALOME_Utils.hxx"
37 #include <omniORB4/CORBA.h>
39 //# include "utilities.h"
41 /*!\class DESTRUCTEUR_GENERIQUE_
45 * The DESTRUCTEUR_GENERIQUE_ abstract class describes the comportement of any destruction object.
46 * Tis type is used to create a list of miscellaneous destruction object.
50 * The only way to use the DESTRUCTEUR_GENERIQUE_ class is inheritance :
51 * class DESTRUCTEUR_SPECIFIQUE_ : public DESTRUCTEUR_GENERIQUE_
53 * <B>Design description</B>
55 * A generic destructor supply two functionalities :
56 * -# a static method to add a destruction (objetct) to be performed DESTRUCTEUR_GENERIQUE_::Ajout(
57 * DESTRUCTEUR_GENERIQUE_ &objet) ;
58 * The Destruction object is stored in a list of pointer to DESTRUCTEUR_GENERIQUE_ objects.
59 * -# an object method to execute the destruction : operator()().
62 class UTILS_EXPORT DESTRUCTEUR_GENERIQUE_
65 static std::list<DESTRUCTEUR_GENERIQUE_*> *Destructeurs;
67 virtual ~DESTRUCTEUR_GENERIQUE_() {}//!< virtual destructor
68 static const int Ajout( DESTRUCTEUR_GENERIQUE_ &objet );//!< adds a destruction object to the list of destructions
69 virtual void operator()( void )=0 ;//!< performs the destruction
73 /*!\class DESTRUCTEUR_DE_
77 * The DESTRUCTEUR_DE_ class allows the user to program - at any moment - the destruction of an object
78 * at the end of the process.
82 * In this example the POINT_ ptrPoint will be destroyed at the end of the process (atexit).
84 * POINT_ *ptrPoint = new POINT_ ;<BR>
85 * DESTRUCTEUR_DE_<POINT_> *ptrDestruction = new DESTRUCTEUR_DE_<POINT_>( *ptrPoint ) ;
87 * Note that neither ptrPoint, nor ptrDestruction should be destroyed by the user.
89 * <B>Design description</B>
91 * The destruction object must be created dynamicaly because it suscribes himself in the list of
92 * destruction to be performed at the end of the process.
95 template <class TYPE> class DESTRUCTEUR_DE_ : public DESTRUCTEUR_GENERIQUE_
98 /* Programs the destruction at the end of the process, of the object objet.
99 This method records in _PtrObjet the address of an object to be destroyed
100 at the end of the process
102 DESTRUCTEUR_DE_(TYPE &objet):
105 assert(DESTRUCTEUR_GENERIQUE_::Ajout( *this ) >= 0) ;
108 /* Performs the destruction of the object.
109 This method really destroys the object pointed by _PtrObjet.
110 It should be called at the end of the process (i.e. at exit).
112 virtual void operator()(void){
113 typedef PortableServer::ServantBase TServant;
115 if(dynamic_cast<TServant*>(_PtrObjet)){
116 // std::cerr << "WARNING: automatic destruction for servant is no more used. It's too late in exit. Use explicit call" << std::endl;
118 if(TServant* aServant = dynamic_cast<TServant*>(_PtrObjet)){
119 PortableServer::POA_var aPOA = aServant->_default_POA();
120 PortableServer::ObjectId_var anObjectId = aPOA->servant_to_id(aServant);
121 aPOA->deactivate_object(anObjectId.in());
122 aServant->_remove_ref();
125 //cerr << "DESTRUCTEUR_GENERIQUE_::operator() deleting _PtrObjet" << endl;
126 TYPE* aPtr = static_cast<TYPE*>(_PtrObjet);
133 virtual ~DESTRUCTEUR_DE_(){
142 # endif /* # if !defined( __DESTRUCTEUR_GENERIQUE__H__ ) */