2 #include "CORBANode.hxx"
3 #include "RuntimeSALOME.hxx"
5 #include <omniORB4/CORBA.h>
8 using namespace YACS::ENGINE;
11 CORBANode::CORBANode(const std::string& name): ElementaryNode(name)
13 _implementation = "CORBA";
14 cerr << "CORBANode::CORBANode " << name << endl;
17 void CORBANode::set_ref(const string& ref)
22 void CORBANode::set_method(const string& method)
27 void CORBANode::execute()
29 cerr << "+++++++++++++++++CorbaNode::run+++++++++++++++++" << endl;
30 //recupération de l'objet CORBA dont l'IOR est _ref
32 CORBA::ORB_var orb = CORBA::ORB_init(argc,0);
33 //CORBA::Object_var obj = getObjectReference(orb);
34 CORBA::Object_var obj = orb->string_to_object(_ref.c_str());
35 if( CORBA::is_nil(obj) )
37 cerr << "Can't get reference to object (or it was nil)." << endl;
41 //construction de la requete DII : ATTENTION aux restrictions et approximations
42 // on suppose qu'un service recoit tous ses parametres in en premier
43 // puis tous ses parametres out
44 // pas de parametre inout
45 // pas de valeur de retour
46 // pas encore d'exception utilisateur
47 // seulement des exceptions CORBA
49 CORBA::Request_var req = obj->_request(_method.c_str());
50 CORBA::NVList_ptr arguments = req->arguments() ;
52 cerr << "+++++++++++++++++CorbaNode::inputs+++++++++++++++++" << endl;
55 set<InputPort *>::iterator iter2;
56 for(iter2 = _setOfInputPort.begin(); iter2 != _setOfInputPort.end(); iter2++)
58 InputCorbaPort *p=(InputCorbaPort *)*iter2;
59 cerr << "port name: " << p->getName() << endl;
60 cerr << "port kind: " << p->type()->kind() << endl;
61 CORBA::Any* ob=p->getAny();
62 CORBA::TypeCode_var typcod= ob->type();
63 switch(p->type()->kind())
81 cerr << typcod->id() << endl;
86 //add_value fait une copie du any. La copie sera détruite avec la requete
87 arguments->add_value( p->getName().c_str() , *ob , CORBA::ARG_IN ) ;
92 cerr << "+++++++++++++++++CorbaNode::outputs+++++++++++++++++" << endl;
93 set<OutputPort *>::iterator iter;
94 for(iter = _setOfOutputPort.begin(); iter != _setOfOutputPort.end(); iter++)
96 OutputCorbaPort *p=(OutputCorbaPort *)*iter;
97 cerr << "port name: " << p->getName() << endl;
98 cerr << "port kind: " << p->type()->kind() << endl;
99 CORBA::Any* ob=p->getAnyOut();
100 //add_value fait une copie du any. La copie sera détruite avec la requete
101 arguments->add_value( p->getName().c_str() , *ob , CORBA::ARG_OUT );
105 req->set_return_type(CORBA::_tc_void);
107 //req->exceptions()->add(eo::_tc_SALOME_Exception);
109 cerr << "+++++++++++++++++CorbaNode::calculation+++++++++++++++++" << _method << endl;
111 CORBA::Exception *exc =req->env()->exception();
114 cerr << "An exception was thrown!" << endl;
115 cerr << "The raised exception is of Type:" << exc->_name() << endl;
119 cerr << "++++++++++++CorbaNode::outputs++++++++++++" << endl;
120 int out_param=in_param;
121 for(iter = _setOfOutputPort.begin(); iter != _setOfOutputPort.end(); iter++)
123 OutputCorbaPort *p=(OutputCorbaPort *)*iter;
124 cerr << "port name: " << p->getName() << endl;
125 cerr << "port kind: " << p->type()->kind() << endl;
126 cerr << "port number: " << out_param << endl;
127 CORBA::Any *ob=arguments->item(out_param)->value();
128 switch(p->type()->kind())
148 //L'OutputPort doit copier l'Any car il sera détruit avec la requete
149 //La copie est faite dans la methode put.
151 out_param=out_param+1;
154 cerr << "++++++++++++++++++++++++++++++++++++++++++" << endl;
156 //La requete n'existe plus ici (_var oblige)
157 //Tous les any passés a la requete sont détruits : il faut les copier