]> SALOME platform Git repositories - modules/yacs.git/blob - src/runtime/CORBANode.cxx
Salome HOME
PR: merge from BR_DATACONV_PR tag "mergeto_trunk_25oct06"
[modules/yacs.git] / src / runtime / CORBANode.cxx
1
2 #include "CORBANode.hxx"
3 #include "RuntimeSALOME.hxx"
4
5 #include <omniORB4/CORBA.h>
6 #include <iostream>
7
8 using namespace YACS::ENGINE;
9 using namespace std;
10
11 CORBANode::CORBANode(const std::string& name): ElementaryNode(name)
12 {
13   _implementation = "CORBA";
14   cerr << "CORBANode::CORBANode " << name << endl;
15 }
16
17 void CORBANode::set_ref(const string& ref)
18 {
19   _ref = ref;
20 }
21
22 void CORBANode::set_method(const string& method) 
23 {
24   _method = method;
25 }
26
27 void CORBANode::execute()
28 {
29   cerr << "+++++++++++++++++CorbaNode::run+++++++++++++++++" << endl;
30   //recupération de l'objet CORBA dont l'IOR est _ref
31   int argc=0;
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) )
36     {
37       cerr << "Can't get reference to object (or it was nil)." << endl;
38       return ;
39     }
40   {
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
48     //
49     CORBA::Request_var req = obj->_request(_method.c_str());
50     CORBA::NVList_ptr arguments = req->arguments() ;
51
52     cerr << "+++++++++++++++++CorbaNode::inputs+++++++++++++++++" << endl;
53     int in_param=0;
54     //les parametres in
55     set<InputPort *>::iterator iter2;
56     for(iter2 = _setOfInputPort.begin(); iter2 != _setOfInputPort.end(); iter2++)
57       {
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())
64           {
65           case Double:
66             CORBA::Double d;
67             *ob >>= d;
68             cerr << d << endl;
69             break;
70           case Int:
71             CORBA::Long l;
72             *ob >>= l;
73             cerr << l << endl;
74             break;
75           case String:
76             char *s;
77             *ob >>= s;
78             cerr << s << endl;
79             break;
80           case Objref:
81             cerr << typcod->id() << endl;
82             break;
83           default:
84             break;
85           }
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 ) ;
88         in_param=in_param+1;
89       }
90     
91     //les parametres out
92     cerr << "+++++++++++++++++CorbaNode::outputs+++++++++++++++++" << endl;
93     set<OutputPort *>::iterator iter;
94     for(iter = _setOfOutputPort.begin(); iter != _setOfOutputPort.end(); iter++)
95       {
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 );
102       }
103
104     //valeur de retour
105     req->set_return_type(CORBA::_tc_void);
106     //autres exceptions
107     //req->exceptions()->add(eo::_tc_SALOME_Exception);
108     
109     cerr << "+++++++++++++++++CorbaNode::calculation+++++++++++++++++" << _method << endl;
110     req->invoke();
111     CORBA::Exception *exc =req->env()->exception();
112     if( exc )
113       {
114         cerr << "An exception was thrown!" << endl;
115         cerr << "The raised exception is of Type:" << exc->_name() << endl;
116         return ;
117       }
118     
119     cerr << "++++++++++++CorbaNode::outputs++++++++++++" << endl;
120     int out_param=in_param;
121     for(iter = _setOfOutputPort.begin(); iter != _setOfOutputPort.end(); iter++)
122       {
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())
129           {
130           case Double:
131             CORBA::Double d;
132             *ob >>= d;
133             cerr << d << endl;
134             break;
135           case Int:
136             CORBA::Long l;
137             *ob >>= l;
138             cerr << l << endl;
139             break;
140           case String:
141             char *s;
142             *ob >>= s;
143             cerr << s << endl;
144             break;
145           default:
146             break;
147           }
148         //L'OutputPort doit copier l'Any car il sera détruit avec la requete
149         //La copie est faite dans la methode put.
150         p->put(ob);
151         out_param=out_param+1;
152       }
153
154     cerr << "++++++++++++++++++++++++++++++++++++++++++" << endl;
155   }
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
158 }