1 // Copyright (C) 2007-2023 CEA, EDF, OPEN CASCADE
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.
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.
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
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 // File : CalciumCxxInterface.hxx
21 // Author : Eric Fayolle (EDF)
23 // Modified by : $LastChangedBy$
24 // Date : $LastChangedDate: 2007-03-01 13:27:58 +0100 (jeu, 01 mar 2007) $
27 #ifndef _CALCIUM_CXXINTERFACE_HXX_
28 #define _CALCIUM_CXXINTERFACE_HXX_
30 #if defined(__CONST_H) || defined(__CALCIUM_H)
31 #error "The header CalciumCxxInterface.hxx must be included before calcium.h"
37 #include "Superv_Component_i.hxx"
38 #include "CalciumException.hxx"
39 #include "CalciumTypes.hxx"
40 #include "CalciumGenericUsesPort.hxx"
41 #include "Copy2UserSpace.hxx"
42 #include "Copy2CorbaSpace.hxx"
43 #include "CalciumPortTraits.hxx"
49 template <typename T1, typename T2>
51 static const bool value = false;
53 template <typename T1>
54 struct IsSameType<T1,T1> {
55 static const bool value = true;
58 extern const char * CPMESSAGE[];
61 #include <boost/type_traits/remove_all_extents.hpp>
63 namespace CalciumInterface {
65 /********************* CONNECTION INTERFACE *****************/
68 ecp_cd (Superv_Component_i & component, std::string & instanceName)
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,"","","");
78 ecp_fin (Superv_Component_i & component, bool provideLastGivenValue)
80 CORBA::String_var componentName=component.instanceName();
81 std::string containerName=component.getContainerName();
82 Engines_DSC_interface::writeEvent("CP_FIN",containerName,componentName,"","","");
84 std::vector<std::string> usesPortNames;
85 std::vector<std::string>::const_iterator it;
86 component.get_uses_port_names(usesPortNames);
88 //Récupérer le type de réel du port est un peu difficile
89 //car l'interface ne donne aucune indication
91 // uses_port *myUsesPort;
92 calcium_uses_port* myCalciumUsesPort;
94 for (it=usesPortNames.begin(); it != usesPortNames.end(); ++it)
98 myCalciumUsesPort= component.Superv_Component_i::get_port< calcium_uses_port >((*it).c_str());
100 // component.Superv_Component_i::get_port(myUsesPort,(*it).c_str());
101 // calcium_uses_port* myCalciumUsesPort=
102 // dynamic_cast<calcium_uses_port*>(myUsesPort);
104 if (SALOME::VerbosityActivated())
106 std::cerr << "-------- CalciumInterface(ecp_fin) MARK 1 -|" << *it << "|----" <<
107 //typeid(myUsesPort).name() <<"-------------" <<
108 typeid(myCalciumUsesPort).name() << "-------------" << std::endl;
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." ));
115 myCalciumUsesPort->disconnect(provideLastGivenValue);
117 catch ( const Superv_Component_i::BadCast & ex)
119 Engines_DSC_interface::writeEvent("CP_FIN",containerName,componentName,"",CPMESSAGE[CalciumTypes::CPTPVR],ex.what());
120 throw (CalciumException(CalciumTypes::CPTPVR,ex));
122 catch ( const DSC_Exception & ex)
124 Engines_DSC_interface::writeEvent("CP_FIN",containerName,componentName,"",CPMESSAGE[CalciumTypes::CPOK],ex.what());
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
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;
140 /********************* INTERFACES DE DESALLOCATION *****************/
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 )
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;
155 DeleteTraits<IsSameType<T1,InnerType>::value, DataManipulator >::apply(dataPtr);
158 template <typename T1> static void
159 ecp_free ( T1 * dataPtr )
161 ecp_free<T1,T1> ( dataPtr );
165 /********************* READING INTERFACE *****************/
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
174 ecp_lecture ( Superv_Component_i & component,
175 int const & dependencyType,
179 const std::string & nomVar,
186 CORBA::String_var componentName=component.instanceName();
187 std::string containerName=component.getContainerName();
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=
194 static_cast<CalciumTypes::DependencyType>(dependencyType);
196 CorbaDataType corbaData;
198 if (SALOME::VerbosityActivated())
199 std::cerr << "-------- CalciumInterface(ecp_lecture) MARK 1 ------------------" << std::endl;
203 Engines_DSC_interface::writeEvent("BEGIN_READ",containerName,componentName,"",CPMESSAGE[CalciumTypes::CPNMVR],"");
204 throw CalciumException(CalciumTypes::CPNMVR, LOC("Empty variable name"));
208 if (SALOME::VerbosityActivated())
210 std::cout << "-------- CalciumInterface(lecture) MARK 2 --"<<typeid(port).name()<<"----------------" << std::endl;
213 std::cout << "-------- CalciumInterface(lecture) MARK 2b1 -----" << typeid(t1).name() << "-------------" << std::endl;
214 std::cout << "-------- CalciumInterface(lecture) MARK 2b2 -----" << typeid(t2).name() << "-------------" << std::endl;
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;
223 catch ( const Superv_Component_i::PortNotDefined & ex)
225 Engines_DSC_interface::writeEvent("BEGIN_READ",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPNMVR],ex.what());
226 throw (CalciumException(CalciumTypes::CPNMVR,ex));
228 catch ( const Superv_Component_i::PortNotConnected & ex)
230 Engines_DSC_interface::writeEvent("BEGIN_READ",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPLIEN],ex.what());
231 throw (CalciumException(CalciumTypes::CPLIEN,ex));
232 // VERIFIER LES CAS DES CODES : CPINARRET, CPSTOPSEQ, CPCTVR, CPLIEN
234 catch ( const Superv_Component_i::BadCast & ex)
236 Engines_DSC_interface::writeEvent("BEGIN_READ",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPTPVR],ex.what());
237 throw (CalciumException(CalciumTypes::CPTPVR,ex));
240 // mode == mode du port
241 CalciumTypes::DependencyType portDependencyType = port->getDependencyType();
243 if ( portDependencyType == CalciumTypes::UNDEFINED_DEPENDENCY )
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."));
249 if ( ( portDependencyType != _dependencyType ) && ( _dependencyType != CalciumTypes::SEQUENCE_DEPENDENCY ) )
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."));
258 std::stringstream msgout,msg;
259 if ( _dependencyType == CalciumTypes::TIME_DEPENDENCY )
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 ;
269 if (SALOME::VerbosityActivated())
270 std::cout << "-------- CalciumInterface(ecp_lecture) MARK 5 ------------------" << std::endl;
272 catch ( const DSC_Exception & ex)
274 Engines_DSC_interface::writeEvent("END_READ",containerName,componentName,nomVar.c_str(),"",ex.what());
278 else if ( _dependencyType == CalciumTypes::ITERATION_DEPENDENCY )
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 ;
287 if (SALOME::VerbosityActivated())
288 std::cout << "-------- CalciumInterface(ecp_lecture) MARK 6 ------------------" << std::endl;
290 catch ( const DSC_Exception & ex)
292 Engines_DSC_interface::writeEvent("END_READ",containerName,componentName,nomVar.c_str(),"",ex.what());
301 if (SALOME::VerbosityActivated())
302 std::cout << "-------- CalciumInterface(ecp_lecture) MARK 7 ------------------" << std::endl;
304 Engines_DSC_interface::writeEvent("BEGIN_READ",containerName,componentName,nomVar.c_str(),"","Sequential read");
305 corbaData = port->next(ti,i);
307 if(i==0)msgout<< "t=" <<ti;
308 else msgout<< "i=" <<i;
310 catch ( const DSC_Exception & ex)
312 Engines_DSC_interface::writeEvent("END_READ",containerName,componentName,nomVar.c_str(),"",ex.what());
317 if (SALOME::VerbosityActivated())
318 std::cout << "-------- CalciumInterface(ecp_lecture) MARK 8 ------------------" << std::endl;
320 size_t corbaDataSize = DataManipulator::size(corbaData);
322 if (SALOME::VerbosityActivated())
323 std::cout << "-------- CalciumInterface(ecp_lecture) corbaDataSize : " << corbaDataSize << std::endl;
325 // Vérifie si l'utilisateur demande du 0 copie
328 if ( bufferLength != 0 )
330 MESSAGE("bufferLength devrait valoir 0 pour l'utilisation du mode sans copie (data==NULL)");
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];
336 if (SALOME::VerbosityActivated())
337 std::cout << "-------- CalciumInterface(ecp_lecture) MARK 9 ------------------" << std::endl;
339 // On essaye de faire du 0 copy si les types T1 et InnerType sont les mêmes.
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);
349 if (SALOME::VerbosityActivated())
350 std::cout << "-------- CalciumInterface(ecp_lecture) MARK 10 ------------------" << std::endl;
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é
365 nRead = std::min < size_t > (corbaDataSize,bufferLength);
367 if (SALOME::VerbosityActivated())
368 std::cout << "-------- CalciumInterface(ecp_lecture) MARK 11 ------------------" << std::endl;
370 Copy2UserSpace<false, DataManipulator >::apply(data,corbaData,nRead);
371 //Déjà fait ci-dessus :
372 //DataManipulator::copy(corbaData,data,nRead);
374 if (SALOME::VerbosityActivated())
375 std::cout << "-------- CalciumInterface(ecp_lecture) MARK 12 ------------------" << std::endl;
378 if (SALOME::VerbosityActivated())
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;
386 Engines_DSC_interface::writeEvent("END_READ",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPOK],msgout.str().c_str());
390 // T1 is the data type
391 template <typename T1 > static void
392 ecp_lecture ( Superv_Component_i & component,
393 int const & dependencyType,
397 const std::string & nomVar,
402 ecp_lecture<T1,T1> (component,dependencyType,ti,tf,
403 i,nomVar,bufferLength,nRead,data);
407 /********************* WRITING INTERFACE *****************/
411 template <typename T1, typename T2> static void
412 ecp_ecriture ( Superv_Component_i & component,
413 int const & dependencyType,
416 const std::string & nomVar,
422 CORBA::String_var componentName=component.instanceName();
423 std::string containerName=component.getContainerName();
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;
436 T1_without_extent const & _data = data;
438 CalciumTypes::DependencyType _dependencyType=
439 static_cast<CalciumTypes::DependencyType>(dependencyType);
441 if (SALOME::VerbosityActivated())
442 std::cerr << "-------- CalciumInterface(ecriture) MARK 1 ------------------" << std::endl;
444 if ( nomVar.empty() )
446 Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,"",CPMESSAGE[CalciumTypes::CPNMVR],"");
447 throw CalciumException(CalciumTypes::CPNMVR, LOC("Empty variable name"));
451 if (SALOME::VerbosityActivated())
453 std::cout << "-------- CalciumInterface(ecriture) MARK 2 ---"<<typeid(port).name()<<"---------------" << std::endl;
456 std::cout << "-------- CalciumInterface(ecriture) MARK 2b1 -----" << typeid(t1).name() << "-------------" << std::endl;
457 std::cout << "-------- CalciumInterface(ecriture) MARK 2b2 -----" << typeid(t2).name() << "-------------" << std::endl;
462 port = component.Superv_Component_i::get_port< UsesPortType > (nomVar.c_str());
464 if (SALOME::VerbosityActivated())
465 std::cout << "-------- CalciumInterface(ecriture) MARK 3 ------------------" << std::endl;
467 catch ( const Superv_Component_i::PortNotDefined & ex)
469 Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPNMVR],ex.what());
470 throw (CalciumException(CalciumTypes::CPNMVR,ex));
472 catch ( const Superv_Component_i::PortNotConnected & ex)
474 Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPLIEN],ex.what());
475 throw (CalciumException(CalciumTypes::CPLIEN,ex));
476 // VERIFIER LES CAS DES CODES : CPINARRET, CPSTOPSEQ, CPCTVR, CPLIEN
478 catch ( const Superv_Component_i::BadCast & ex)
480 Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPTPVR],ex.what());
481 throw (CalciumException(CalciumTypes::CPTPVR,ex));
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 !
488 // CalciumTypes::DependencyType portDependencyType;
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));
497 if ( _dependencyType == CalciumTypes::UNDEFINED_DEPENDENCY )
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."));
503 if ( _dependencyType == CalciumTypes::SEQUENCE_DEPENDENCY )
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."));
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 !
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é."));
522 if ( bufferLength < 1 )
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"));
528 CorbaDataType corbaData;
530 if (SALOME::VerbosityActivated())
531 std::cout << "-------- CalciumInterface(ecriture) MARK 4 ------------------" << std::endl;
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
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())
555 T1_without_extent t1b;
557 std::cout << "-------- CalciumInterface(ecriture) MARK 4b1 -----" << typeid(t1b).name() << "-------------" << std::endl;
558 std::cout << "-------- CalciumInterface(ecriture) MARK 4b2 -----" << typeid(t2b).name() << "-------------" << std::endl;
561 Copy2CorbaSpace<IsSameType<T1_without_extent,InnerType>::value, DataManipulator >::apply(corbaData,_data,bufferLength);
563 //TODO : GERER LES EXCEPTIONS ICI : ex le port n'est pas connecte
564 if ( _dependencyType == CalciumTypes::TIME_DEPENDENCY )
568 port->put(*corbaData,t, -1);
569 std::stringstream msg;
571 Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPOK],msg.str().c_str());
573 catch ( const DSC_Exception & ex)
575 Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPATAL],ex.what());
576 throw (CalciumException(CalciumTypes::CPATAL,ex.what()));
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;
583 else if ( _dependencyType == CalciumTypes::ITERATION_DEPENDENCY )
587 port->put(*corbaData,-1, i);
588 std::stringstream msg;
590 Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPOK],msg.str().c_str());
592 catch ( const DSC_Exception & ex)
594 Engines_DSC_interface::writeEvent("WRITE",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPATAL],ex.what());
595 throw (CalciumException(CalciumTypes::CPATAL,ex.what()));
598 if (SALOME::VerbosityActivated())
599 std::cout << "-------- CalciumInterface(ecriture) MARK 6 ------------------" << std::endl;
602 if (SALOME::VerbosityActivated())
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;
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)
613 if (SALOME::VerbosityActivated())
614 std::cout << "-------- CalciumInterface(ecriture) MARK 7 ------------------" << std::endl;
619 template <typename T1> static void
620 ecp_ecriture ( Superv_Component_i & component,
621 int const & dependencyType,
624 const std::string & nomVar,
628 ecp_ecriture<T1,T1> (component,dependencyType,t,i,nomVar,bufferLength,data);
632 ecp_fini(Superv_Component_i & component,const std::string & nomVar,long const & i)
634 CORBA::String_var componentName=component.instanceName();
635 std::string containerName=component.getContainerName();
639 Engines_DSC_interface::writeEvent("CP_FINI",containerName,componentName,"",CPMESSAGE[CalciumTypes::CPNMVR],"");
640 throw CalciumException(CalciumTypes::CPNMVR, LOC("Empty variable name"));
643 calcium_provides_port* port;
647 port = component.Superv_Component_i::get_port< calcium_provides_port >(nomVar.c_str());
649 catch ( const Superv_Component_i::PortNotDefined & ex)
651 Engines_DSC_interface::writeEvent("CP_FINI",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPNMVR],ex.what());
652 throw (CalciumException(CalciumTypes::CPNMVR,ex));
654 catch ( const Superv_Component_i::PortNotConnected & ex)
656 Engines_DSC_interface::writeEvent("CP_FINI",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPLIEN],ex.what());
657 throw (CalciumException(CalciumTypes::CPLIEN,ex));
659 catch ( const Superv_Component_i::BadCast & ex)
661 Engines_DSC_interface::writeEvent("CP_FINI",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPTPVR],ex.what());
662 throw (CalciumException(CalciumTypes::CPTPVR,ex));
665 // get dependency mode
666 CalciumTypes::DependencyType portDependencyType = port->getDependencyType();
668 if ( portDependencyType == CalciumTypes::UNDEFINED_DEPENDENCY )
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."));
674 if ( portDependencyType != CalciumTypes::ITERATION_DEPENDENCY )
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."));
682 port->calcium_erase(0., i,true);
684 std::stringstream msg;
686 Engines_DSC_interface::writeEvent("CP_FINI",containerName,componentName,nomVar.c_str(),"",msg.str().c_str());
691 ecp_fint(Superv_Component_i & component,const std::string & nomVar,double const & t)
693 CORBA::String_var componentName=component.instanceName();
694 std::string containerName=component.getContainerName();
698 Engines_DSC_interface::writeEvent("CP_FINT",containerName,componentName,"",CPMESSAGE[CalciumTypes::CPNMVR],"");
699 throw CalciumException(CalciumTypes::CPNMVR, LOC("Empty variable name"));
702 calcium_provides_port* port;
706 port = component.Superv_Component_i::get_port< calcium_provides_port >(nomVar.c_str());
708 catch ( const Superv_Component_i::PortNotDefined & ex)
710 Engines_DSC_interface::writeEvent("CP_FINT",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPNMVR],ex.what());
711 throw (CalciumException(CalciumTypes::CPNMVR,ex));
713 catch ( const Superv_Component_i::PortNotConnected & ex)
715 Engines_DSC_interface::writeEvent("CP_FINT",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPLIEN],ex.what());
716 throw (CalciumException(CalciumTypes::CPLIEN,ex));
718 catch ( const Superv_Component_i::BadCast & ex)
720 Engines_DSC_interface::writeEvent("CP_FINT",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPTPVR],ex.what());
721 throw (CalciumException(CalciumTypes::CPTPVR,ex));
724 // get dependency mode
725 CalciumTypes::DependencyType portDependencyType = port->getDependencyType();
727 if ( portDependencyType == CalciumTypes::UNDEFINED_DEPENDENCY )
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."));
733 if ( portDependencyType != CalciumTypes::TIME_DEPENDENCY )
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."));
741 port->calcium_erase(t, 0,true);
743 std::stringstream msg;
745 Engines_DSC_interface::writeEvent("CP_FINT",containerName,componentName,nomVar.c_str(),"",msg.str().c_str());
750 ecp_effi(Superv_Component_i & component,const std::string & nomVar,long const & i)
752 CORBA::String_var componentName=component.instanceName();
753 std::string containerName=component.getContainerName();
757 Engines_DSC_interface::writeEvent("CP_EFFI",containerName,componentName,"",CPMESSAGE[CalciumTypes::CPNMVR],"");
758 throw CalciumException(CalciumTypes::CPNMVR, LOC("Empty variable name"));
761 calcium_provides_port* port;
765 port = component.Superv_Component_i::get_port< calcium_provides_port >(nomVar.c_str());
767 catch ( const Superv_Component_i::PortNotDefined & ex)
769 Engines_DSC_interface::writeEvent("CP_EFFI",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPNMVR],ex.what());
770 throw (CalciumException(CalciumTypes::CPNMVR,ex));
772 catch ( const Superv_Component_i::PortNotConnected & ex)
774 Engines_DSC_interface::writeEvent("CP_EFFI",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPLIEN],ex.what());
775 throw (CalciumException(CalciumTypes::CPLIEN,ex));
777 catch ( const Superv_Component_i::BadCast & ex)
779 Engines_DSC_interface::writeEvent("CP_EFFI",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPTPVR],ex.what());
780 throw (CalciumException(CalciumTypes::CPTPVR,ex));
783 // get dependency mode
784 CalciumTypes::DependencyType portDependencyType = port->getDependencyType();
786 if ( portDependencyType == CalciumTypes::UNDEFINED_DEPENDENCY )
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."));
792 if ( portDependencyType != CalciumTypes::ITERATION_DEPENDENCY )
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."));
800 port->calcium_erase(0., i,false);
802 std::stringstream msg;
804 Engines_DSC_interface::writeEvent("CP_EFFI",containerName,componentName,nomVar.c_str(),"",msg.str().c_str());
809 ecp_efft(Superv_Component_i & component,const std::string & nomVar,double const & t)
811 CORBA::String_var componentName=component.instanceName();
812 std::string containerName=component.getContainerName();
816 Engines_DSC_interface::writeEvent("CP_EFFT",containerName,componentName,"",CPMESSAGE[CalciumTypes::CPNMVR],"");
817 throw CalciumException(CalciumTypes::CPNMVR, LOC("Empty variable name"));
820 calcium_provides_port* port;
824 port = component.Superv_Component_i::get_port< calcium_provides_port >(nomVar.c_str());
826 catch ( const Superv_Component_i::PortNotDefined & ex)
828 Engines_DSC_interface::writeEvent("CP_EFFT",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPNMVR],ex.what());
829 throw (CalciumException(CalciumTypes::CPNMVR,ex));
831 catch ( const Superv_Component_i::PortNotConnected & ex)
833 Engines_DSC_interface::writeEvent("CP_EFFT",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPLIEN],ex.what());
834 throw (CalciumException(CalciumTypes::CPLIEN,ex));
836 catch ( const Superv_Component_i::BadCast & ex)
838 Engines_DSC_interface::writeEvent("CP_EFFT",containerName,componentName,nomVar.c_str(),CPMESSAGE[CalciumTypes::CPTPVR],ex.what());
839 throw (CalciumException(CalciumTypes::CPTPVR,ex));
842 // get dependency mode
843 CalciumTypes::DependencyType portDependencyType = port->getDependencyType();
845 if ( portDependencyType == CalciumTypes::UNDEFINED_DEPENDENCY )
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."));
851 if ( portDependencyType != CalciumTypes::TIME_DEPENDENCY )
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."));
859 port->calcium_erase(t, 0,false);
861 std::stringstream msg;
863 Engines_DSC_interface::writeEvent("CP_EFFT",containerName,componentName,nomVar.c_str(),"",msg.str().c_str());