Version: 9.15.0
CalciumCxxInterface.hxx
Go to the documentation of this file.
1 // Copyright (C) 2007-2025 CEA, EDF, OPEN CASCADE
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19 
20 // File : CalciumCxxInterface.hxx
21 // Author : Eric Fayolle (EDF)
22 // Module : KERNEL
23 // Modified by : $LastChangedBy$
24 // Date : $LastChangedDate: 2007-03-01 13:27:58 +0100 (jeu, 01 mar 2007) $
25 // Id : $Id$
26 //
27 #ifndef _CALCIUM_CXXINTERFACE_HXX_
28 #define _CALCIUM_CXXINTERFACE_HXX_
29 
30 #if defined(__CONST_H) || defined(__CALCIUM_H)
31 #error "The header CalciumCxxInterface.hxx must be included before calcium.h"
32 #endif
33 
34 #include <string>
35 #include <vector>
36 #include <iostream>
37 #include "Superv_Component_i.hxx"
38 #include "CalciumException.hxx"
39 #include "CalciumTypes.hxx"
41 #include "Copy2UserSpace.hxx"
42 #include "Copy2CorbaSpace.hxx"
43 #include "CalciumPortTraits.hxx"
44 
45 #include <stdio.h>
46 
47 #include <typeinfo>
48 
49 template <typename T1, typename T2>
50 struct IsSameType {
51  static const bool value = false;
52 };
53 template <typename T1>
54 struct IsSameType<T1,T1> {
55  static const bool value = true;
56 };
57 
58 extern const char * CPMESSAGE[];
59 
60 
61 #include <boost/type_traits/remove_all_extents.hpp>
62 
63 namespace CalciumInterface {
64 
65  /********************* CONNECTION INTERFACE *****************/
66 
67  static inline void
68  ecp_cd (Superv_Component_i & component, std::string & instanceName)
69  {
70  /* TODO : Trouver le nom de l'instance SALOME*/
71  CORBA::String_var componentName=component.instanceName();
72  std::string containerName=component.getContainerName();
73  if (instanceName.empty()) instanceName=componentName;
74  Engines_DSC_interface::writeEvent("CP_CD",containerName,componentName,"","","");
75  }
76 
77  static inline void
78  ecp_fin (Superv_Component_i & component, bool provideLastGivenValue)
79  {
80  CORBA::String_var componentName=component.instanceName();
81  std::string containerName=component.getContainerName();
82  Engines_DSC_interface::writeEvent("CP_FIN",containerName,componentName,"","","");
83 
84  std::vector<std::string> usesPortNames;
85  std::vector<std::string>::const_iterator it;
86  component.get_uses_port_names(usesPortNames);
87 
88  //Récupérer le type de réel du port est un peu difficile
89  //car l'interface ne donne aucune indication
90 
91  // uses_port *myUsesPort;
92  calcium_uses_port* myCalciumUsesPort;
93 
94  for (it=usesPortNames.begin(); it != usesPortNames.end(); ++it)
95  {
96  try
97  {
98  myCalciumUsesPort= component.Superv_Component_i::get_port< calcium_uses_port >((*it).c_str());
99 
100 // component.Superv_Component_i::get_port(myUsesPort,(*it).c_str());
101 // calcium_uses_port* myCalciumUsesPort=
102 // dynamic_cast<calcium_uses_port*>(myUsesPort);
103 
104  if (SALOME::VerbosityActivated())
105  {
106  std::cerr << "-------- CalciumInterface(ecp_fin) MARK 1 -|" << *it << "|----" <<
107  //typeid(myUsesPort).name() <<"-------------" <<
108  typeid(myCalciumUsesPort).name() << "-------------" << std::endl;
109  }
110 
111 // if ( !myCalciumUsesPort )
112 // throw Superv_Component_i::BadCast(LOC(OSS()<<"Impossible de convertir le port "
113 // << *it << " en port de type calcium_uses_port." ));
114 
115  myCalciumUsesPort->disconnect(provideLastGivenValue);
116  }
117  catch ( const Superv_Component_i::BadCast & ex)
118  {
121  }
122  catch ( const DSC_Exception & ex)
123  {
125  // Exception venant de SupervComponent :
126  // PortNotDefined(CPNMVR), PortNotConnected(CPLIEN)
127  // ou du port uses : Dsc_Exception
128  // On continue à traiter la deconnexion des autres ports uses
129  }
130  catch (...)
131  {
132  Engines_DSC_interface::writeEvent("CP_FIN",containerName,componentName,"",CPMESSAGE[CalciumTypes::CPATAL],"Unexpected exception");
133  throw (CalciumException(CalciumTypes::CPATAL,"Unexpected exception"));
134  // En fonction du mode de gestion des erreurs throw;
135  }
136  }
137  }
138 
139 
140  /********************* INTERFACES DE DESALLOCATION *****************/
141 
142  // Uniquement appelé par l'utilisateur s'il utilise la 0 copie
143  // ( pointeur de données data==NULL à l'appel de ecp_lecture )
144  // Une désallocation aura lieu uniquement si un buffer intermédiaire
145  // était necessaire (type utilisateur et corba diffférent)
146  // La propriété du buffer est rendue à CORBA sinon
147  template <typename T1, typename T2> static void
148  ecp_free ( T1 * dataPtr )
149  {
150  typedef typename ProvidesPortTraits<T2>::PortType PortType;
151  typedef typename PortType::DataManipulator DataManipulator;
152  typedef typename DataManipulator::Type DataType; // Attention != T1
153  typedef typename DataManipulator::InnerType InnerType;
154 
155  DeleteTraits<IsSameType<T1,InnerType>::value, DataManipulator >::apply(dataPtr);
156  }
157 
158  template <typename T1> static void
159  ecp_free ( T1 * dataPtr )
160  {
161  ecp_free<T1,T1> ( dataPtr );
162  }
163 
164 
165  /********************* READING INTERFACE *****************/
166 
167 
168  // T1 est le type de données
169  // T2 est un <nom> de type Calcium permettant de sélectionner le port CORBA correspondant
170  // T1 et T2 sont dissociés pour discriminer par exemple le cas des nombres complexes
171  // -> Les données des nombres complexes sont de type float mais
172  // le port à utiliser est le port cplx
173  template <typename T1, typename T2 > static void
175  int const & dependencyType,
176  double & ti,
177  double const & tf,
178  long & i,
179  const std::string & nomVar,
180  size_t bufferLength,
181  size_t & nRead,
182  T1 * &data )
183  {
184 
185  assert(&component);
186  CORBA::String_var componentName=component.instanceName();
187  std::string containerName=component.getContainerName();
188 
189  typedef typename ProvidesPortTraits<T2>::PortType PortType;
190  typedef typename PortType::DataManipulator DataManipulator;
191  typedef typename DataManipulator::Type CorbaDataType; // Attention != T1
192  typedef typename DataManipulator::InnerType InnerType;
193  CalciumTypes::DependencyType _dependencyType=
195 
196  CorbaDataType corbaData;
197 
198  if (SALOME::VerbosityActivated())
199  std::cerr << "-------- CalciumInterface(ecp_lecture) MARK 1 ------------------" << std::endl;
200 
201  if (nomVar.empty())
202  {
204  throw CalciumException(CalciumTypes::CPNMVR, LOC("Empty variable name"));
205  }
206  PortType * port;
207 
208  if (SALOME::VerbosityActivated())
209  {
210  std::cout << "-------- CalciumInterface(lecture) MARK 2 --"<<typeid(port).name()<<"----------------" << std::endl;
211  T1 t1;
212  T2 t2;
213  std::cout << "-------- CalciumInterface(lecture) MARK 2b1 -----" << typeid(t1).name() << "-------------" << std::endl;
214  std::cout << "-------- CalciumInterface(lecture) MARK 2b2 -----" << typeid(t2).name() << "-------------" << std::endl;
215  }
216 
217  try
218  {
219  port = component.Superv_Component_i::get_port< PortType > (nomVar.c_str());
220  if (SALOME::VerbosityActivated())
221  std::cout << "-------- CalciumInterface(ecp_lecture) MARK 3 ------------------" << std::endl;
222  }
223  catch ( const Superv_Component_i::PortNotDefined & ex)
224  {
225  Engines_DSC_interface::writeEvent("BEGIN_READ",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPNMVR],ex.what());
227  }
228  catch ( const Superv_Component_i::PortNotConnected & ex)
229  {
230  Engines_DSC_interface::writeEvent("BEGIN_READ",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPLIEN],ex.what());
232  // VERIFIER LES CAS DES CODES : CPINARRET, CPSTOPSEQ, CPCTVR, CPLIEN
233  }
234  catch ( const Superv_Component_i::BadCast & ex)
235  {
236  Engines_DSC_interface::writeEvent("BEGIN_READ",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPTPVR],ex.what());
238  }
239 
240  // mode == mode du port
241  CalciumTypes::DependencyType portDependencyType = port->getDependencyType();
242 
243  if ( portDependencyType == CalciumTypes::UNDEFINED_DEPENDENCY )
244  {
245  Engines_DSC_interface::writeEvent("BEGIN_READ",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPIT],"Dependency mode is undefined");
246  throw CalciumException(CalciumTypes::CPIT, LOC(OSS()<<"Dependency mode of variable " << nomVar << " is undefined."));
247  }
248 
249  if ( ( portDependencyType != _dependencyType ) && ( _dependencyType != CalciumTypes::SEQUENCE_DEPENDENCY ) )
250  {
251  Engines_DSC_interface::writeEvent("BEGIN_READ",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPIT],
252  "Dependency mode is not the same as the required one");
253  throw CalciumException(CalciumTypes::CPITVR, LOC(OSS()<<"Dependency mode of variable " << nomVar << ": "
254  << portDependencyType << " is not the same as the required one."));
255  }
256 
257 
258  std::stringstream msgout,msg;
259  if ( _dependencyType == CalciumTypes::TIME_DEPENDENCY )
260  {
261  try
262  {
263  double tt=ti;
264  msg << "ti=" << ti << ", tf=" << tf ;
265  Engines_DSC_interface::writeEvent("BEGIN_READ",containerName,componentName,nomVar.c_str(),"",msg.str().c_str());
266  corbaData = port->get(tt,tf, 0);
267  msgout << "read t=" << tt ;
268 
269  if (SALOME::VerbosityActivated())
270  std::cout << "-------- CalciumInterface(ecp_lecture) MARK 5 ------------------" << std::endl;
271  }
272  catch ( const DSC_Exception & ex)
273  {
274  Engines_DSC_interface::writeEvent("END_READ",containerName,componentName,nomVar.c_str(),"",ex.what());
275  throw;
276  }
277  }
278  else if ( _dependencyType == CalciumTypes::ITERATION_DEPENDENCY )
279  {
280  try
281  {
282  msg << "i=" << i ;
283  Engines_DSC_interface::writeEvent("BEGIN_READ",containerName,componentName,nomVar.c_str(),"",msg.str().c_str());
284  corbaData = port->get(0, i);
285  msgout << "read i=" << i ;
286 
287  if (SALOME::VerbosityActivated())
288  std::cout << "-------- CalciumInterface(ecp_lecture) MARK 6 ------------------" << std::endl;
289  }
290  catch ( const DSC_Exception & ex)
291  {
292  Engines_DSC_interface::writeEvent("END_READ",containerName,componentName,nomVar.c_str(),"",ex.what());
293  throw;
294  }
295  }
296  else
297  {
298  // Sequential read
299  try
300  {
301  if (SALOME::VerbosityActivated())
302  std::cout << "-------- CalciumInterface(ecp_lecture) MARK 7 ------------------" << std::endl;
303 
304  Engines_DSC_interface::writeEvent("BEGIN_READ",containerName,componentName,nomVar.c_str(),"","Sequential read");
305  corbaData = port->next(ti,i);
306  msgout << "read ";
307  if(i==0)msgout<< "t=" <<ti;
308  else msgout<< "i=" <<i;
309  }
310  catch ( const DSC_Exception & ex)
311  {
312  Engines_DSC_interface::writeEvent("END_READ",containerName,componentName,nomVar.c_str(),"",ex.what());
313  throw;
314  }
315  }
316 
317  if (SALOME::VerbosityActivated())
318  std::cout << "-------- CalciumInterface(ecp_lecture) MARK 8 ------------------" << std::endl;
319 
320  size_t corbaDataSize = DataManipulator::size(corbaData);
321 
322  if (SALOME::VerbosityActivated())
323  std::cout << "-------- CalciumInterface(ecp_lecture) corbaDataSize : " << corbaDataSize << std::endl;
324 
325  // Vérifie si l'utilisateur demande du 0 copie
326  if ( data == NULL )
327  {
328  if ( bufferLength != 0 )
329  {
330  MESSAGE("bufferLength devrait valoir 0 pour l'utilisation du mode sans copie (data==NULL)");
331  }
332  nRead = corbaDataSize;
333  // Si les types T1 et InnerType sont différents, il faudra effectuer tout de même une recopie
334  if (!IsSameType<T1,InnerType>::value) data = new T1[nRead];
335 
336  if (SALOME::VerbosityActivated())
337  std::cout << "-------- CalciumInterface(ecp_lecture) MARK 9 ------------------" << std::endl;
338 
339  // On essaye de faire du 0 copy si les types T1 et InnerType sont les mêmes.
340  // Copy2UserSpace :
341  // La raison d'être du foncteur Copy2UserSpace est qu'il n'est pas possible de compiler
342  // une expression d'affectation sur des types incompatibles ; même
343  // si cette expression se trouve dans une branche non exécuté d'un test
344  // portant sur la compatibilité des types.
345  // En utilisant le foncteur Copy2UserSpace, seule la spécialisation en adéquation
346  // avec la compatibilité des types sera compilée
347  Copy2UserSpace< IsSameType<T1,InnerType>::value, DataManipulator >::apply(data,corbaData,nRead);
348 
349  if (SALOME::VerbosityActivated())
350  std::cout << "-------- CalciumInterface(ecp_lecture) MARK 10 ------------------" << std::endl;
351 
352  // Attention : Seul CalciumCouplingPolicy via eraseDataId doit décider de supprimer ou non
353  // la donnée corba associée à un DataId ! Ne pas effectuer la desallocation suivante :
354  // DataManipulator::delete_data(corbaData);
355  // ni DataManipulator::getPointer(corbaData,true); qui détruit la sequence lorsque l'on
356  // prend la propriété du buffer
357  // old : Dans les deux cas la structure CORBA n'est plus utile
358  // old : Si !IsSameType<T1,InnerType>::value l'objet CORBA est détruit avec son contenu
359  // old : Dans l'autre cas seul la coquille CORBA est détruite
360  // L'utilisateur devra appeler ecp_free qui déterminera s'il est necessaire
361  // de désallouer un buffer intermédiaire ( types différents) ou de rendre la propriété } else { nRead = std::min < size_t > (corbaDataSize,bufferLength); if (SALOME::VerbosityActivated()) std::cout << "-------- CalciumInterface(ecp_lecture) MARK 11 ------------------" << std::endl; Copy2UserSpace<false, DataManipulator >::apply(data,corbaData,nRead); //Déjà fait ci-dessus : //DataManipulator::copy(corbaData,data,nRead); if (SALOME::VerbosityActivated()) std::cout << "-------- CalciumInterface(ecp_lecture) MARK 12 ------------------" << std::endl; } if (SALOME::VerbosityActivated()) { std::cout << "-------- CalciumInterface(ecp_lecture), Valeur de data : " << std::endl; std::copy(data,data+nRead,std::ostream_iterator<T1>(std::cout," ")); std::cout << "Ptr :" << data << std::endl; std::cout << "-------- CalciumInterface(ecp_lecture) MARK 13 ------------------" << std::endl; } Engines_DSC_interface::writeEvent("END_READ",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPOK],msgout.str().c_str()); return; } // T1 is the data type template <typename T1 > static void ecp_lecture ( Superv_Component_i & component, int const & dependencyType, double & ti, double const & tf, long & i, const std::string & nomVar, size_t bufferLength, size_t & nRead, T1 * &data ) { ecp_lecture<T1,T1> (component,dependencyType,ti,tf, i,nomVar,bufferLength,nRead,data); } /********************* WRITING INTERFACE *****************/ // T1 : DataType // T2 : PortType template <typename T1, typename T2> static void ecp_ecriture ( Superv_Component_i & component, int const & dependencyType, double const & t, long const & i, const std::string & nomVar, size_t bufferLength, T1 const & data ) { assert(&component); CORBA::String_var componentName=component.instanceName(); std::string containerName=component.getContainerName(); //typedef typename StarTrait<TT>::NonStarType T; typedef typename boost::remove_all_extents< T1 >::type T1_without_extent; typedef typename boost::remove_all_extents< T2 >::type T2_without_extent; typedef typename UsesPortTraits <T2_without_extent>::PortType UsesPortType; typedef typename ProvidesPortTraits<T2_without_extent>::PortType ProvidesPortType;// pour obtenir un manipulateur de données typedef typename ProvidesPortType::DataManipulator DataManipulator; // Verifier que l'on peut définir UsesPortType::DataManipulator // typedef typename PortType::DataManipulator DataManipulator; typedef typename DataManipulator::Type CorbaDataType; // Attention != T1 typedef typename DataManipulator::InnerType InnerType; T1_without_extent const & _data = data; CalciumTypes::DependencyType _dependencyType= static_cast<CalciumTypes::DependencyType>(dependencyType); if (SALOME::VerbosityActivated()) std::cerr << "-------- CalciumInterface(ecriture) MARK 1 ------------------" << std::endl; if ( nomVar.empty() ) { Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,"",CPMESSAGE[CalciumTypes::CPNMVR],""); throw CalciumException(CalciumTypes::CPNMVR, LOC("Empty variable name")); } UsesPortType * port; if (SALOME::VerbosityActivated()) { std::cout << "-------- CalciumInterface(ecriture) MARK 2 ---"<<typeid(port).name()<<"---------------" << std::endl; T1 t1; T2 t2; std::cout << "-------- CalciumInterface(ecriture) MARK 2b1 -----" << typeid(t1).name() << "-------------" << std::endl; std::cout << "-------- CalciumInterface(ecriture) MARK 2b2 -----" << typeid(t2).name() << "-------------" << std::endl; } try { port = component.Superv_Component_i::get_port< UsesPortType > (nomVar.c_str()); if (SALOME::VerbosityActivated()) std::cout << "-------- CalciumInterface(ecriture) MARK 3 ------------------" << std::endl; } catch ( const Superv_Component_i::PortNotDefined & ex) { Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPNMVR],ex.what()); throw (CalciumException(CalciumTypes::CPNMVR,ex)); } catch ( const Superv_Component_i::PortNotConnected & ex) { Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPLIEN],ex.what()); throw (CalciumException(CalciumTypes::CPLIEN,ex)); // VERIFIER LES CAS DES CODES : CPINARRET, CPSTOPSEQ, CPCTVR, CPLIEN } catch ( const Superv_Component_i::BadCast & ex) { Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPTPVR],ex.what()); throw (CalciumException(CalciumTypes::CPTPVR,ex)); } // mode == mode du port // On pourrait créer la méthode CORBA dans le mode de Couplage CALCIUM. // et donc ajouter cette cette méthode uniquement dans l'IDL calcium ! // CalciumTypes::DependencyType portDependencyType; // try { // portDependencyType = port->getDependencyType(); // std::cout << "-------- CalciumInterface(ecriture) MARK 4 ------------------" << std::endl; // } catch ( const DSC_Exception & ex ) { // std::cerr << ex.what() << std::endl;; // throw (CalciumException(CalciumTypes::CPIT,ex)); // } if ( _dependencyType == CalciumTypes::UNDEFINED_DEPENDENCY ) { Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPIT],"Dependency mode is undefined"); throw CalciumException(CalciumTypes::CPIT, LOC(OSS()<<"Dependency mode of variable " << nomVar << " is undefined.")); } if ( _dependencyType == CalciumTypes::SEQUENCE_DEPENDENCY ) { Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPIT], "SEQUENCE_DEPENDENCY mode is not possible when writing"); throw CalciumException(CalciumTypes::CPIT, LOC(OSS()<<"Dependency mode SEQUENCE_DEPENDENCY for variable " << nomVar << " is not possible when writing.")); } // Il faudrait que le port provides génère une exception si le mode donnée n'est pas // le bon. La seule façon de le faire est d'envoyer -1 en temps si on n'est en itération // et vice-versa pour informer les provides port du mode dans lequel on est. Sinon il faut // modifier l'interface IDL pour y ajouter un mode de dépendance ! // ----> // if ( portDependencyType != _dependencyType ) // throw CalciumException(CalciumTypes::CPITVR, // LOC(OSS()<<"Le mode de dépendance de la variable " // << nomVar << " ne correspond pas au mode demandé.")); if ( bufferLength < 1 ) { Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPNTNULL],"Buffer to send is empty"); throw CalciumException(CalciumTypes::CPNTNULL, LOC(OSS()<<"Buffer to send is empty")); } CorbaDataType corbaData; if (SALOME::VerbosityActivated()) std::cout << "-------- CalciumInterface(ecriture) MARK 4 ------------------" << std::endl; // Si les types Utilisateurs et CORBA sont différents // il faut effectuer une recopie sinon on utilise directement le // buffer data pour constituer la séquence // TODO : // - Attention en mode asynchrone il faudra eventuellement // faire une copie des données même si elles sont de même type. // - OLD : En cas de collocalisation (du port provide et du port uses) // OLD : il est necessaire d'effectuer une recopie du buffer car la // OLD : séquence est envoyée au port provide par une référence sur // OLD : la séquence locale. Or la méthode put récupère le buffer directement // OLD : qui est alors le buffer utilisateur. Il pourrait alors arriver que : // OLD : * Le recepteur efface le buffer emetteur // OLD : * Le port lui-même efface le buffer de l'utilisateur ! // OLD : Cette copie est effectuée dans GenericPortUses::put // OLD : en fonction de la collocalisation ou non. // - OLD :En cas de connection multiples d'un port uses distant vers plusieurs port provides // OLD : collocalisés les ports provides partagent la même copie de la donnée ! // OLD : Il faut effectuer une copie dans le port provides. // OLD : Cette copie est effectuée dans GenericPortUses::put // OLD : en fonction de la collocalisation ou non. if (SALOME::VerbosityActivated()) { T1_without_extent t1b; InnerType t2b; std::cout << "-------- CalciumInterface(ecriture) MARK 4b1 -----" << typeid(t1b).name() << "-------------" << std::endl; std::cout << "-------- CalciumInterface(ecriture) MARK 4b2 -----" << typeid(t2b).name() << "-------------" << std::endl; } Copy2CorbaSpace<IsSameType<T1_without_extent,InnerType>::value, DataManipulator >::apply(corbaData,_data,bufferLength); //TODO : GERER LES EXCEPTIONS ICI : ex le port n'est pas connecte if ( _dependencyType == CalciumTypes::TIME_DEPENDENCY ) { try { port->put(*corbaData,t, -1); std::stringstream msg; msg << "t=" << t ; Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPOK],msg.str().c_str()); } catch ( const DSC_Exception & ex) { Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPATAL],ex.what()); throw (CalciumException(CalciumTypes::CPATAL,ex.what())); } //Le -1 peut être traité par le cst DataIdContainer et transformé en 0 //Etre obligé de mettre une étoile ds (*corbadata) va poser des pb pour les types <> seq if (SALOME::VerbosityActivated()) std::cout << "-------- CalciumInterface(ecriture) MARK 5 ------------------" << std::endl; } else if ( _dependencyType == CalciumTypes::ITERATION_DEPENDENCY ) { try { port->put(*corbaData,-1, i); std::stringstream msg; msg << "i=" << i ; Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPOK],msg.str().c_str()); } catch ( const DSC_Exception & ex) { Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPATAL],ex.what()); throw (CalciumException(CalciumTypes::CPATAL,ex.what())); } if (SALOME::VerbosityActivated()) std::cout << "-------- CalciumInterface(ecriture) MARK 6 ------------------" << std::endl; } if (SALOME::VerbosityActivated()) { std::cout << "-------- CalciumInterface(ecriture), Valeur de corbaData : " << std::endl; for (int i = 0; i < corbaData->length(); ++i) std::cout << "-------- CalciumInterface(ecriture), corbaData[" << i << "] = " << (*corbaData)[i] << std::endl; } // if ( !IsSameType<T1,InnerType>::value ) delete corbaData; // Supprime l'objet CORBA avec eventuellement les données qu'il contient (cas de la recopie) delete corbaData; if (SALOME::VerbosityActivated()) std::cout << "-------- CalciumInterface(ecriture) MARK 7 ------------------" << std::endl; return; } template <typename T1> static void ecp_ecriture ( Superv_Component_i & component, int const & dependencyType, double const & t, long const & i, const std::string & nomVar, size_t bufferLength, T1 const & data ) { ecp_ecriture<T1,T1> (component,dependencyType,t,i,nomVar,bufferLength,data); } static inline void ecp_fini(Superv_Component_i & component,const std::string & nomVar,long const & i) { CORBA::String_var componentName=component.instanceName(); std::string containerName=component.getContainerName(); if (nomVar.empty()) { Engines_DSC_interface::writeEvent("CP_FINI",containerName,componentName,"",CPMESSAGE[CalciumTypes::CPNMVR],""); throw CalciumException(CalciumTypes::CPNMVR, LOC("Empty variable name")); } calcium_provides_port* port; try { port = component.Superv_Component_i::get_port< calcium_provides_port >(nomVar.c_str()); } catch ( const Superv_Component_i::PortNotDefined & ex) { Engines_DSC_interface::writeEvent("CP_FINI",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPNMVR],ex.what()); throw (CalciumException(CalciumTypes::CPNMVR,ex)); } catch ( const Superv_Component_i::PortNotConnected & ex) { Engines_DSC_interface::writeEvent("CP_FINI",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPLIEN],ex.what()); throw (CalciumException(CalciumTypes::CPLIEN,ex)); } catch ( const Superv_Component_i::BadCast & ex) { Engines_DSC_interface::writeEvent("CP_FINI",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPTPVR],ex.what()); throw (CalciumException(CalciumTypes::CPTPVR,ex)); } // get dependency mode CalciumTypes::DependencyType portDependencyType = port->getDependencyType(); if ( portDependencyType == CalciumTypes::UNDEFINED_DEPENDENCY ) { Engines_DSC_interface::writeEvent("CP_FINI",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPIT],"Dependency mode is undefined"); throw CalciumException(CalciumTypes::CPIT, LOC(OSS()<<"Dependency mode of variable " << nomVar << " is undefined.")); } if ( portDependencyType != CalciumTypes::ITERATION_DEPENDENCY ) { Engines_DSC_interface::writeEvent("CP_FINI",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPIT], "Dependency mode must be iteration mode"); throw CalciumException(CalciumTypes::CPITVR, LOC(OSS()<<"Dependency mode of variable " << nomVar << ": " << portDependencyType << " must be iteration mode.")); } port->calcium_erase(0., i,true); std::stringstream msg; msg << "i<=" << i ; Engines_DSC_interface::writeEvent("CP_FINI",containerName,componentName,nomVar.c_str(),"",msg.str().c_str()); } static inline void ecp_fint(Superv_Component_i & component,const std::string & nomVar,double const & t) { CORBA::String_var componentName=component.instanceName(); std::string containerName=component.getContainerName(); if (nomVar.empty()) { Engines_DSC_interface::writeEvent("CP_FINT",containerName,componentName,"",CPMESSAGE[CalciumTypes::CPNMVR],""); throw CalciumException(CalciumTypes::CPNMVR, LOC("Empty variable name")); } calcium_provides_port* port; try { port = component.Superv_Component_i::get_port< calcium_provides_port >(nomVar.c_str()); } catch ( const Superv_Component_i::PortNotDefined & ex) { Engines_DSC_interface::writeEvent("CP_FINT",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPNMVR],ex.what()); throw (CalciumException(CalciumTypes::CPNMVR,ex)); } catch ( const Superv_Component_i::PortNotConnected & ex) { Engines_DSC_interface::writeEvent("CP_FINT",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPLIEN],ex.what()); throw (CalciumException(CalciumTypes::CPLIEN,ex)); } catch ( const Superv_Component_i::BadCast & ex) { Engines_DSC_interface::writeEvent("CP_FINT",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPTPVR],ex.what()); throw (CalciumException(CalciumTypes::CPTPVR,ex)); } // get dependency mode CalciumTypes::DependencyType portDependencyType = port->getDependencyType(); if ( portDependencyType == CalciumTypes::UNDEFINED_DEPENDENCY ) { Engines_DSC_interface::writeEvent("CP_FINT",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPIT],"Dependency mode is undefined"); throw CalciumException(CalciumTypes::CPIT, LOC(OSS()<<"Dependency mode of variable " << nomVar << " is undefined.")); } if ( portDependencyType != CalciumTypes::TIME_DEPENDENCY ) { Engines_DSC_interface::writeEvent("CP_FINT",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPIT], "Dependency mode must be time mode"); throw CalciumException(CalciumTypes::CPITVR, LOC(OSS()<<"Dependency mode of variable " << nomVar << ": " << portDependencyType << " must be time mode.")); } port->calcium_erase(t, 0,true); std::stringstream msg; msg << "t<=" << t ; Engines_DSC_interface::writeEvent("CP_FINT",containerName,componentName,nomVar.c_str(),"",msg.str().c_str()); } static inline void ecp_effi(Superv_Component_i & component,const std::string & nomVar,long const & i) { CORBA::String_var componentName=component.instanceName(); std::string containerName=component.getContainerName(); if (nomVar.empty()) { Engines_DSC_interface::writeEvent("CP_EFFI",containerName,componentName,"",CPMESSAGE[CalciumTypes::CPNMVR],""); throw CalciumException(CalciumTypes::CPNMVR, LOC("Empty variable name")); } calcium_provides_port* port; try { port = component.Superv_Component_i::get_port< calcium_provides_port >(nomVar.c_str()); } catch ( const Superv_Component_i::PortNotDefined & ex) { Engines_DSC_interface::writeEvent("CP_EFFI",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPNMVR],ex.what()); throw (CalciumException(CalciumTypes::CPNMVR,ex)); } catch ( const Superv_Component_i::PortNotConnected & ex) { Engines_DSC_interface::writeEvent("CP_EFFI",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPLIEN],ex.what()); throw (CalciumException(CalciumTypes::CPLIEN,ex)); } catch ( const Superv_Component_i::BadCast & ex) { Engines_DSC_interface::writeEvent("CP_EFFI",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPTPVR],ex.what()); throw (CalciumException(CalciumTypes::CPTPVR,ex)); } // get dependency mode CalciumTypes::DependencyType portDependencyType = port->getDependencyType(); if ( portDependencyType == CalciumTypes::UNDEFINED_DEPENDENCY ) { Engines_DSC_interface::writeEvent("CP_EFFI",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPIT],"Dependency mode is undefined"); throw CalciumException(CalciumTypes::CPIT, LOC(OSS()<<"Dependency mode of variable " << nomVar << " is undefined.")); } if ( portDependencyType != CalciumTypes::ITERATION_DEPENDENCY ) { Engines_DSC_interface::writeEvent("CP_EFFI",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPIT], "Dependency mode must be iteration mode"); throw CalciumException(CalciumTypes::CPITVR, LOC(OSS()<<"Dependency mode of variable " << nomVar << ": " << portDependencyType << " must be iteration mode.")); } port->calcium_erase(0., i,false); std::stringstream msg; msg << "i>=" << i ; Engines_DSC_interface::writeEvent("CP_EFFI",containerName,componentName,nomVar.c_str(),"",msg.str().c_str()); } static inline void ecp_efft(Superv_Component_i & component,const std::string & nomVar,double const & t) { CORBA::String_var componentName=component.instanceName(); std::string containerName=component.getContainerName(); if (nomVar.empty()) { Engines_DSC_interface::writeEvent("CP_EFFT",containerName,componentName,"",CPMESSAGE[CalciumTypes::CPNMVR],""); throw CalciumException(CalciumTypes::CPNMVR, LOC("Empty variable name")); } calcium_provides_port* port; try { port = component.Superv_Component_i::get_port< calcium_provides_port >(nomVar.c_str()); } catch ( const Superv_Component_i::PortNotDefined & ex) { Engines_DSC_interface::writeEvent("CP_EFFT",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPNMVR],ex.what()); throw (CalciumException(CalciumTypes::CPNMVR,ex)); } catch ( const Superv_Component_i::PortNotConnected & ex) { Engines_DSC_interface::writeEvent("CP_EFFT",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPLIEN],ex.what()); throw (CalciumException(CalciumTypes::CPLIEN,ex)); } catch ( const Superv_Component_i::BadCast & ex) { Engines_DSC_interface::writeEvent("CP_EFFT",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPTPVR],ex.what()); throw (CalciumException(CalciumTypes::CPTPVR,ex)); } // get dependency mode CalciumTypes::DependencyType portDependencyType = port->getDependencyType(); if ( portDependencyType == CalciumTypes::UNDEFINED_DEPENDENCY ) { Engines_DSC_interface::writeEvent("CP_EFFT",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPIT],"Dependency mode is undefined"); throw CalciumException(CalciumTypes::CPIT, LOC(OSS()<<"Dependency mode of variable " << nomVar << " is undefined.")); } if ( portDependencyType != CalciumTypes::TIME_DEPENDENCY ) { Engines_DSC_interface::writeEvent("CP_EFFT",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPIT], "Dependency mode must be time mode"); throw CalciumException(CalciumTypes::CPITVR, LOC(OSS()<<"Dependency mode of variable " << nomVar << ": " << portDependencyType << " must be time mode.")); } port->calcium_erase(t, 0,false); std::stringstream msg; msg << "t>=" << t ; Engines_DSC_interface::writeEvent("CP_EFFT",containerName,componentName,nomVar.c_str(),"",msg.str().c_str()); } } #endif
362  }
363  else
364  {
365  nRead = std::min < size_t > (corbaDataSize,bufferLength);
366 
367  if (SALOME::VerbosityActivated())
368  std::cout << "-------- CalciumInterface(ecp_lecture) MARK 11 ------------------" << std::endl;
369 
371  //Déjà fait ci-dessus :
372  //DataManipulator::copy(corbaData,data,nRead);
373 
374  if (SALOME::VerbosityActivated())
375  std::cout << "-------- CalciumInterface(ecp_lecture) MARK 12 ------------------" << std::endl;
376  }
377 
378  if (SALOME::VerbosityActivated())
379  {
380  std::cout << "-------- CalciumInterface(ecp_lecture), Valeur de data : " << std::endl;
381  std::copy(data,data+nRead,std::ostream_iterator<T1>(std::cout," "));
382  std::cout << "Ptr :" << data << std::endl;
383  std::cout << "-------- CalciumInterface(ecp_lecture) MARK 13 ------------------" << std::endl;
384  }
385 
386  Engines_DSC_interface::writeEvent("END_READ",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPOK],msgout.str().c_str());
387  return;
388  }
389 
390  // T1 is the data type
391  template <typename T1 > static void
393  int const & dependencyType,
394  double & ti,
395  double const & tf,
396  long & i,
397  const std::string & nomVar,
398  size_t bufferLength,
399  size_t & nRead,
400  T1 * &data )
401  {
402  ecp_lecture<T1,T1> (component,dependencyType,ti,tf,
403  i,nomVar,bufferLength,nRead,data);
404 
405  }
406 
407  /********************* WRITING INTERFACE *****************/
408 
409  // T1 : DataType
410  // T2 : PortType
411  template <typename T1, typename T2> static void
413  int const & dependencyType,
414  double const & t,
415  long const & i,
416  const std::string & nomVar,
417  size_t bufferLength,
418  T1 const & data )
419  {
420 
421  assert(&component);
422  CORBA::String_var componentName=component.instanceName();
423  std::string containerName=component.getContainerName();
424 
425  //typedef typename StarTrait<TT>::NonStarType T;
426  typedef typename boost::remove_all_extents< T1 >::type T1_without_extent;
427  typedef typename boost::remove_all_extents< T2 >::type T2_without_extent;
428  typedef typename UsesPortTraits <T2_without_extent>::PortType UsesPortType;
429  typedef typename ProvidesPortTraits<T2_without_extent>::PortType ProvidesPortType;// pour obtenir un manipulateur de données
430  typedef typename ProvidesPortType::DataManipulator DataManipulator;
431  // Verifier que l'on peut définir UsesPortType::DataManipulator
432  // typedef typename PortType::DataManipulator DataManipulator;
433  typedef typename DataManipulator::Type CorbaDataType; // Attention != T1
434  typedef typename DataManipulator::InnerType InnerType;
435 
436  T1_without_extent const & _data = data;
437 
438  CalciumTypes::DependencyType _dependencyType=
440 
441  if (SALOME::VerbosityActivated())
442  std::cerr << "-------- CalciumInterface(ecriture) MARK 1 ------------------" << std::endl;
443 
444  if ( nomVar.empty() )
445  {
447  throw CalciumException(CalciumTypes::CPNMVR, LOC("Empty variable name"));
448  }
449  UsesPortType * port;
450 
451  if (SALOME::VerbosityActivated())
452  {
453  std::cout << "-------- CalciumInterface(ecriture) MARK 2 ---"<<typeid(port).name()<<"---------------" << std::endl;
454  T1 t1;
455  T2 t2;
456  std::cout << "-------- CalciumInterface(ecriture) MARK 2b1 -----" << typeid(t1).name() << "-------------" << std::endl;
457  std::cout << "-------- CalciumInterface(ecriture) MARK 2b2 -----" << typeid(t2).name() << "-------------" << std::endl;
458  }
459 
460  try
461  {
462  port = component.Superv_Component_i::get_port< UsesPortType > (nomVar.c_str());
463 
464  if (SALOME::VerbosityActivated())
465  std::cout << "-------- CalciumInterface(ecriture) MARK 3 ------------------" << std::endl;
466  }
467  catch ( const Superv_Component_i::PortNotDefined & ex)
468  {
469  Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPNMVR],ex.what());
471  }
472  catch ( const Superv_Component_i::PortNotConnected & ex)
473  {
474  Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPLIEN],ex.what());
476  // VERIFIER LES CAS DES CODES : CPINARRET, CPSTOPSEQ, CPCTVR, CPLIEN
477  }
478  catch ( const Superv_Component_i::BadCast & ex)
479  {
480  Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPTPVR],ex.what());
482  }
483 
484  // mode == mode du port
485  // On pourrait créer la méthode CORBA dans le mode de Couplage CALCIUM.
486  // et donc ajouter cette cette méthode uniquement dans l'IDL calcium !
487 
488 // CalciumTypes::DependencyType portDependencyType;
489 // try {
490 // portDependencyType = port->getDependencyType();
491 // std::cout << "-------- CalciumInterface(ecriture) MARK 4 ------------------" << std::endl;
492 // } catch ( const DSC_Exception & ex ) {
493 // std::cerr << ex.what() << std::endl;;
494 // throw (CalciumException(CalciumTypes::CPIT,ex));
495 // }
496 
497  if ( _dependencyType == CalciumTypes::UNDEFINED_DEPENDENCY )
498  {
499  Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPIT],"Dependency mode is undefined");
500  throw CalciumException(CalciumTypes::CPIT, LOC(OSS()<<"Dependency mode of variable " << nomVar << " is undefined."));
501  }
502 
503  if ( _dependencyType == CalciumTypes::SEQUENCE_DEPENDENCY )
504  {
505  Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPIT],
506  "SEQUENCE_DEPENDENCY mode is not possible when writing");
507  throw CalciumException(CalciumTypes::CPIT, LOC(OSS()<<"Dependency mode SEQUENCE_DEPENDENCY for variable " << nomVar
508  << " is not possible when writing."));
509  }
510 
511  // Il faudrait que le port provides génère une exception si le mode donnée n'est pas
512  // le bon. La seule façon de le faire est d'envoyer -1 en temps si on n'est en itération
513  // et vice-versa pour informer les provides port du mode dans lequel on est. Sinon il faut
514  // modifier l'interface IDL pour y ajouter un mode de dépendance !
515  // ---->
516 // if ( portDependencyType != _dependencyType )
517 // throw CalciumException(CalciumTypes::CPITVR,
518 // LOC(OSS()<<"Le mode de dépendance de la variable "
519 // << nomVar << " ne correspond pas au mode demandé."));
520 
521 
522  if ( bufferLength < 1 )
523  {
524  Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPNTNULL],"Buffer to send is empty");
525  throw CalciumException(CalciumTypes::CPNTNULL, LOC(OSS()<<"Buffer to send is empty"));
526  }
527 
528  CorbaDataType corbaData;
529 
530  if (SALOME::VerbosityActivated())
531  std::cout << "-------- CalciumInterface(ecriture) MARK 4 ------------------" << std::endl;
532 
533  // Si les types Utilisateurs et CORBA sont différents
534  // il faut effectuer une recopie sinon on utilise directement le
535  // buffer data pour constituer la séquence
536  // TODO :
537  // - Attention en mode asynchrone il faudra eventuellement
538  // faire une copie des données même si elles sont de même type.
539  // - OLD : En cas de collocalisation (du port provide et du port uses)
540  // OLD : il est necessaire d'effectuer une recopie du buffer car la
541  // OLD : séquence est envoyée au port provide par une référence sur
542  // OLD : la séquence locale. Or la méthode put récupère le buffer directement
543  // OLD : qui est alors le buffer utilisateur. Il pourrait alors arriver que :
544  // OLD : * Le recepteur efface le buffer emetteur
545  // OLD : * Le port lui-même efface le buffer de l'utilisateur !
546  // OLD : Cette copie est effectuée dans GenericPortUses::put
547  // OLD : en fonction de la collocalisation ou non.
548  // - OLD :En cas de connection multiples d'un port uses distant vers plusieurs port provides
549  // OLD : collocalisés les ports provides partagent la même copie de la donnée !
550  // OLD : Il faut effectuer une copie dans le port provides.
551  // OLD : Cette copie est effectuée dans GenericPortUses::put
552  // OLD : en fonction de la collocalisation ou non.
553  if (SALOME::VerbosityActivated())
554  {
555  T1_without_extent t1b;
556  InnerType t2b;
557  std::cout << "-------- CalciumInterface(ecriture) MARK 4b1 -----" << typeid(t1b).name() << "-------------" << std::endl;
558  std::cout << "-------- CalciumInterface(ecriture) MARK 4b2 -----" << typeid(t2b).name() << "-------------" << std::endl;
559  }
560 
561  Copy2CorbaSpace<IsSameType<T1_without_extent,InnerType>::value, DataManipulator >::apply(corbaData,_data,bufferLength);
562 
563  //TODO : GERER LES EXCEPTIONS ICI : ex le port n'est pas connecte
564  if ( _dependencyType == CalciumTypes::TIME_DEPENDENCY )
565  {
566  try
567  {
568  port->put(*corbaData,t, -1);
569  std::stringstream msg;
570  msg << "t=" << t ;
571  Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPOK],msg.str().c_str());
572  }
573  catch ( const DSC_Exception & ex)
574  {
575  Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPATAL],ex.what());
577  }
578  //Le -1 peut être traité par le cst DataIdContainer et transformé en 0
579  //Etre obligé de mettre une étoile ds (*corbadata) va poser des pb pour les types <> seq
580  if (SALOME::VerbosityActivated())
581  std::cout << "-------- CalciumInterface(ecriture) MARK 5 ------------------" << std::endl;
582  }
583  else if ( _dependencyType == CalciumTypes::ITERATION_DEPENDENCY )
584  {
585  try
586  {
587  port->put(*corbaData,-1, i);
588  std::stringstream msg;
589  msg << "i=" << i ;
590  Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPOK],msg.str().c_str());
591  }
592  catch ( const DSC_Exception & ex)
593  {
594  Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPATAL],ex.what());
596  }
597 
598  if (SALOME::VerbosityActivated())
599  std::cout << "-------- CalciumInterface(ecriture) MARK 6 ------------------" << std::endl;
600  }
601 
602  if (SALOME::VerbosityActivated())
603  {
604  std::cout << "-------- CalciumInterface(ecriture), Valeur de corbaData : " << std::endl;
605  for (int i = 0; i < corbaData->length(); ++i)
606  std::cout << "-------- CalciumInterface(ecriture), corbaData[" << i << "] = " << (*corbaData)[i] << std::endl;
607  }
608 
609  // if ( !IsSameType<T1,InnerType>::value ) delete corbaData;
610  // Supprime l'objet CORBA avec eventuellement les données qu'il contient (cas de la recopie)
611  delete corbaData;
612 
613  if (SALOME::VerbosityActivated())
614  std::cout << "-------- CalciumInterface(ecriture) MARK 7 ------------------" << std::endl;
615 
616  return;
617  }
618 
619  template <typename T1> static void
621  int const & dependencyType,
622  double const & t,
623  long const & i,
624  const std::string & nomVar,
625  size_t bufferLength,
626  T1 const & data )
627  {
628  ecp_ecriture<T1,T1> (component,dependencyType,t,i,nomVar,bufferLength,data);
629  }
630 
631  static inline void
632  ecp_fini(Superv_Component_i & component,const std::string & nomVar,long const & i)
633  {
634  CORBA::String_var componentName=component.instanceName();
635  std::string containerName=component.getContainerName();
636 
637  if (nomVar.empty())
638  {
640  throw CalciumException(CalciumTypes::CPNMVR, LOC("Empty variable name"));
641  }
642 
644 
645  try
646  {
647  port = component.Superv_Component_i::get_port< calcium_provides_port >(nomVar.c_str());
648  }
649  catch ( const Superv_Component_i::PortNotDefined & ex)
650  {
651  Engines_DSC_interface::writeEvent("CP_FINI",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPNMVR],ex.what());
653  }
654  catch ( const Superv_Component_i::PortNotConnected & ex)
655  {
656  Engines_DSC_interface::writeEvent("CP_FINI",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPLIEN],ex.what());
658  }
659  catch ( const Superv_Component_i::BadCast & ex)
660  {
661  Engines_DSC_interface::writeEvent("CP_FINI",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPTPVR],ex.what());
663  }
664 
665  // get dependency mode
666  CalciumTypes::DependencyType portDependencyType = port->getDependencyType();
667 
668  if ( portDependencyType == CalciumTypes::UNDEFINED_DEPENDENCY )
669  {
670  Engines_DSC_interface::writeEvent("CP_FINI",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPIT],"Dependency mode is undefined");
671  throw CalciumException(CalciumTypes::CPIT, LOC(OSS()<<"Dependency mode of variable " << nomVar << " is undefined."));
672  }
673 
674  if ( portDependencyType != CalciumTypes::ITERATION_DEPENDENCY )
675  {
676  Engines_DSC_interface::writeEvent("CP_FINI",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPIT],
677  "Dependency mode must be iteration mode");
678  throw CalciumException(CalciumTypes::CPITVR, LOC(OSS()<<"Dependency mode of variable " << nomVar << ": "
679  << portDependencyType << " must be iteration mode."));
680  }
681 
682  port->calcium_erase(0., i,true);
683 
684  std::stringstream msg;
685  msg << "i<=" << i ;
686  Engines_DSC_interface::writeEvent("CP_FINI",containerName,componentName,nomVar.c_str(),"",msg.str().c_str());
687 
688  }
689 
690  static inline void
691  ecp_fint(Superv_Component_i & component,const std::string & nomVar,double const & t)
692  {
693  CORBA::String_var componentName=component.instanceName();
694  std::string containerName=component.getContainerName();
695 
696  if (nomVar.empty())
697  {
699  throw CalciumException(CalciumTypes::CPNMVR, LOC("Empty variable name"));
700  }
701 
703 
704  try
705  {
706  port = component.Superv_Component_i::get_port< calcium_provides_port >(nomVar.c_str());
707  }
708  catch ( const Superv_Component_i::PortNotDefined & ex)
709  {
710  Engines_DSC_interface::writeEvent("CP_FINT",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPNMVR],ex.what());
712  }
713  catch ( const Superv_Component_i::PortNotConnected & ex)
714  {
715  Engines_DSC_interface::writeEvent("CP_FINT",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPLIEN],ex.what());
717  }
718  catch ( const Superv_Component_i::BadCast & ex)
719  {
720  Engines_DSC_interface::writeEvent("CP_FINT",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPTPVR],ex.what());
722  }
723 
724  // get dependency mode
725  CalciumTypes::DependencyType portDependencyType = port->getDependencyType();
726 
727  if ( portDependencyType == CalciumTypes::UNDEFINED_DEPENDENCY )
728  {
729  Engines_DSC_interface::writeEvent("CP_FINT",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPIT],"Dependency mode is undefined");
730  throw CalciumException(CalciumTypes::CPIT, LOC(OSS()<<"Dependency mode of variable " << nomVar << " is undefined."));
731  }
732 
733  if ( portDependencyType != CalciumTypes::TIME_DEPENDENCY )
734  {
735  Engines_DSC_interface::writeEvent("CP_FINT",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPIT],
736  "Dependency mode must be time mode");
737  throw CalciumException(CalciumTypes::CPITVR, LOC(OSS()<<"Dependency mode of variable " << nomVar << ": "
738  << portDependencyType << " must be time mode."));
739  }
740 
741  port->calcium_erase(t, 0,true);
742 
743  std::stringstream msg;
744  msg << "t<=" << t ;
745  Engines_DSC_interface::writeEvent("CP_FINT",containerName,componentName,nomVar.c_str(),"",msg.str().c_str());
746 
747  }
748 
749  static inline void
750  ecp_effi(Superv_Component_i & component,const std::string & nomVar,long const & i)
751  {
752  CORBA::String_var componentName=component.instanceName();
753  std::string containerName=component.getContainerName();
754 
755  if (nomVar.empty())
756  {
758  throw CalciumException(CalciumTypes::CPNMVR, LOC("Empty variable name"));
759  }
760 
762 
763  try
764  {
765  port = component.Superv_Component_i::get_port< calcium_provides_port >(nomVar.c_str());
766  }
767  catch ( const Superv_Component_i::PortNotDefined & ex)
768  {
769  Engines_DSC_interface::writeEvent("CP_EFFI",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPNMVR],ex.what());
771  }
772  catch ( const Superv_Component_i::PortNotConnected & ex)
773  {
774  Engines_DSC_interface::writeEvent("CP_EFFI",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPLIEN],ex.what());
776  }
777  catch ( const Superv_Component_i::BadCast & ex)
778  {
779  Engines_DSC_interface::writeEvent("CP_EFFI",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPTPVR],ex.what());
781  }
782 
783  // get dependency mode
784  CalciumTypes::DependencyType portDependencyType = port->getDependencyType();
785 
786  if ( portDependencyType == CalciumTypes::UNDEFINED_DEPENDENCY )
787  {
788  Engines_DSC_interface::writeEvent("CP_EFFI",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPIT],"Dependency mode is undefined");
789  throw CalciumException(CalciumTypes::CPIT, LOC(OSS()<<"Dependency mode of variable " << nomVar << " is undefined."));
790  }
791 
792  if ( portDependencyType != CalciumTypes::ITERATION_DEPENDENCY )
793  {
794  Engines_DSC_interface::writeEvent("CP_EFFI",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPIT],
795  "Dependency mode must be iteration mode");
796  throw CalciumException(CalciumTypes::CPITVR, LOC(OSS()<<"Dependency mode of variable " << nomVar << ": "
797  << portDependencyType << " must be iteration mode."));
798  }
799 
800  port->calcium_erase(0., i,false);
801 
802  std::stringstream msg;
803  msg << "i>=" << i ;
804  Engines_DSC_interface::writeEvent("CP_EFFI",containerName,componentName,nomVar.c_str(),"",msg.str().c_str());
805 
806  }
807 
808  static inline void
809  ecp_efft(Superv_Component_i & component,const std::string & nomVar,double const & t)
810  {
811  CORBA::String_var componentName=component.instanceName();
812  std::string containerName=component.getContainerName();
813 
814  if (nomVar.empty())
815  {
817  throw CalciumException(CalciumTypes::CPNMVR, LOC("Empty variable name"));
818  }
819 
821 
822  try
823  {
824  port = component.Superv_Component_i::get_port< calcium_provides_port >(nomVar.c_str());
825  }
826  catch ( const Superv_Component_i::PortNotDefined & ex)
827  {
828  Engines_DSC_interface::writeEvent("CP_EFFT",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPNMVR],ex.what());
830  }
831  catch ( const Superv_Component_i::PortNotConnected & ex)
832  {
833  Engines_DSC_interface::writeEvent("CP_EFFT",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPLIEN],ex.what());
835  }
836  catch ( const Superv_Component_i::BadCast & ex)
837  {
838  Engines_DSC_interface::writeEvent("CP_EFFT",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPTPVR],ex.what());
840  }
841 
842  // get dependency mode
843  CalciumTypes::DependencyType portDependencyType = port->getDependencyType();
844 
845  if ( portDependencyType == CalciumTypes::UNDEFINED_DEPENDENCY )
846  {
847  Engines_DSC_interface::writeEvent("CP_EFFT",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPIT],"Dependency mode is undefined");
848  throw CalciumException(CalciumTypes::CPIT, LOC(OSS()<<"Dependency mode of variable " << nomVar << " is undefined."));
849  }
850 
851  if ( portDependencyType != CalciumTypes::TIME_DEPENDENCY )
852  {
853  Engines_DSC_interface::writeEvent("CP_EFFT",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPIT],
854  "Dependency mode must be time mode");
855  throw CalciumException(CalciumTypes::CPITVR, LOC(OSS()<<"Dependency mode of variable " << nomVar << ": "
856  << portDependencyType << " must be time mode."));
857  }
858 
859  port->calcium_erase(t, 0,false);
860 
861  std::stringstream msg;
862  msg << "t>=" << t ;
863  Engines_DSC_interface::writeEvent("CP_EFFT",containerName,componentName,nomVar.c_str(),"",msg.str().c_str());
864 
865  }
866 
867 }
868 
869 #endif
const char * CPMESSAGE[]
const DEPENDENCY_TYPE dependencyType
Definition: CorbaTypes2CalciumTypes.cxx:88
#define LOC(message)
Definition: DSC_Exception.hxx:55
std::string getContainerName()
C++ method: return the name of the container associated with this component This name does not contai...
Definition: Component_i.cxx:1082
char * instanceName()
CORBA method: return name of the instance, unique in this Container.
Definition: Component_i.cxx:238
static void writeEvent(const char *request, const std::string &containerName, const char *instance_name, const char *port_name, const char *error, const char *message)
Write a record in the trace file.
Definition: DSC_interface.cxx:478
Class OSS is useful when streaming data through a function that expect a string as parameter.
Definition: DSC_Exception.hxx:65
This class implements DSC_User component.
Definition: Superv_Component_i.hxx:54
virtual void get_uses_port_names(std::vector< std::string > &port_names, const std::string servicename="") const
Gets the list of the ports of a service.
Definition: Superv_Component_i.cxx:316
Definition: calcium_provides_port.hxx:34
Definition: calcium_uses_port.hxx:36
virtual void disconnect(bool)
Definition: calcium_uses_port.hxx:40
Definition: CalciumCxxInterface.cxx:32
static void ecp_cd(Superv_Component_i &component, std::string &instanceName)
Definition: CalciumCxxInterface.hxx:68
static void ecp_free(T1 *dataPtr)
Definition: CalciumCxxInterface.hxx:148
static void ecp_efft(Superv_Component_i &component, const std::string &nomVar, double const &t)
Definition: CalciumCxxInterface.hxx:809
static void ecp_fint(Superv_Component_i &component, const std::string &nomVar, double const &t)
Definition: CalciumCxxInterface.hxx:691
static void ecp_ecriture(Superv_Component_i &component, int const &dependencyType, double const &t, long const &i, const std::string &nomVar, size_t bufferLength, T1 const &data)
Definition: CalciumCxxInterface.hxx:412
static void ecp_effi(Superv_Component_i &component, const std::string &nomVar, long const &i)
Definition: CalciumCxxInterface.hxx:750
static void ecp_fin(Superv_Component_i &component, bool provideLastGivenValue)
Definition: CalciumCxxInterface.hxx:78
static void ecp_fini(Superv_Component_i &component, const std::string &nomVar, long const &i)
Definition: CalciumCxxInterface.hxx:632
static void ecp_lecture(Superv_Component_i &component, int const &dependencyType, double &ti, double const &tf, long &i, const std::string &nomVar, size_t bufferLength, size_t &nRead, T1 *&data)
Definition: CalciumCxxInterface.hxx:174
const int CPATAL
Definition: CalciumTypes.hxx:136
const int CPTPVR
Definition: CalciumTypes.hxx:96
const int CPOK
Definition: CalciumTypes.hxx:81
const int CPITVR
Definition: CalciumTypes.hxx:103
DependencyType
Definition: CalciumTypes.hxx:68
@ ITERATION_DEPENDENCY
Definition: CalciumTypes.hxx:69
@ TIME_DEPENDENCY
Definition: CalciumTypes.hxx:68
@ SEQUENCE_DEPENDENCY
Definition: CalciumTypes.hxx:71
@ UNDEFINED_DEPENDENCY
Definition: CalciumTypes.hxx:68
const int CPLIEN
Definition: CalciumTypes.hxx:182
const int CPIT
Definition: CalciumTypes.hxx:44
const int CPNTNULL
Definition: CalciumTypes.hxx:127
const int CPNMVR
Definition: CalciumTypes.hxx:87
containerName
Definition: SALOME_ContainerPy.py:383
string msg
Definition: TestMinimalExample.py:168
string name
Definition: pythfilter.py:56
def copy(src, dst)
Definition: pythonpath_reduction.py:35
port
Definition: salome_instance.py:114
Definition: CalciumException.hxx:38
Definition: Copy2CorbaSpace.hxx:40
Definition: Copy2UserSpace.hxx:45
static void apply(T1 *&data, T2 &corbaData, size_t)
Definition: Copy2UserSpace.hxx:48
Definition: DSC_Exception.hxx:94
virtual const char * what(void) const noexcept
Definition: DSC_Exception.hxx:126
Definition: Copy2UserSpace.hxx:158
Definition: CalciumCxxInterface.hxx:50
static const bool value
Definition: CalciumCxxInterface.hxx:51
Definition: Superv_Component_i.hxx:76
Definition: Superv_Component_i.hxx:80
Definition: Superv_Component_i.hxx:79
Definition: CalciumPortTraits.hxx:37
Definition: CalciumPortTraits.hxx:86
#define MESSAGE(msg)
Definition: test1.c:32