Salome HOME
b8ab049a0f80d394d3c8e9e038933a7ae36f6e2d
[modules/superv.git] / src / GraphExecutor / DataFlowExecutor_DynInvoke.cxx
1 //  SUPERV GraphExecutor : contains classes that permit execution of graphs and particularly the execution automaton
2 //
3 //  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
5 // 
6 //  This library is free software; you can redistribute it and/or 
7 //  modify it under the terms of the GNU Lesser General Public 
8 //  License as published by the Free Software Foundation; either 
9 //  version 2.1 of the License. 
10 // 
11 //  This library is distributed in the hope that it will be useful, 
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of 
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
14 //  Lesser General Public License for more details. 
15 // 
16 //  You should have received a copy of the GNU Lesser General Public 
17 //  License along with this library; if not, write to the Free Software 
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
19 // 
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 //
23 //
24 //  File   : DataFlowBase_DynInvoke.cxx
25 //  Author : Marc Tajchman, CEA
26 //  Module : SUPERV
27 //  $Header:
28
29 using namespace std;
30 #include <stdarg.h>
31 #include <map>
32
33 #include "DataFlowExecutor_InNode.hxx"
34
35 using namespace CORBA ;
36
37
38 #define DynInvokeTrace 0
39 void GraphExecutor::InNode::DynInvoke(Engines::Component_ptr objComponent ,
40                                       const char *method , 
41                                       ServicesAnyData * inParams , int nInParams ,
42                                       ServicesAnyData * outParams , int nOutParams ) {
43   Request_var req = objComponent->_request( method ) ;
44   const char *ArgName ;
45   int Type ;
46
47   NVList_ptr arguments = req->arguments() ;
48
49   int i ;
50
51   int n_in  = nInParams ;
52   int n_out = nOutParams ;
53
54 #if DynInvokeTrace
55   cdebug << ThreadNo() << "InNode::DynInvoke " << Name() << " method " << method
56          << " objComponent " << objComponent << " " << ObjectToString( objComponent )
57          << endl ;
58 #endif
59 //  MESSAGE( aComponent << "->" << method ) ;
60   for ( i = 0 ; i < n_in ; i++ ) {
61     CORBA::Any & data = inParams[i].Value ;
62     ArgName           = inParams[i].Name.c_str() ;
63     Type              = data.type()->kind() ;
64     arguments->add_value( ArgName , data , CORBA::ARG_IN ) ;
65 #if DynInvokeTrace
66     switch ( Type ) {
67     case CORBA::tk_string : {
68       const char * t ;
69       data >>= t ;
70       cdebug << "ArgIn" << i << " : " << ArgName << " Value " << t << " (string)" 
71              << endl ;
72       break ;
73     }
74     case CORBA::tk_boolean : {
75       bool b ;
76       data >>= (CORBA::Any::to_boolean ) b ;
77       cdebug << "ArgIn" << i << " : " << ArgName << " Value " << b << " (boolean)" << endl ;
78       break ;
79     }
80     case CORBA::tk_char : {
81       unsigned char c ;
82       data >>= (CORBA::Any::to_char ) c ;
83       cdebug << "ArgIn" << i << " : " << ArgName << " Value " << (int ) c << " (char)" << endl ;
84       break ;
85     }
86     case CORBA::tk_short : {
87       CORBA::Short s ;
88       data >>= s ;
89       cdebug << "ArgIn" << i << " : " << ArgName << " Value " << s << " (short)" << endl ;
90       break ;
91     }
92     case CORBA::tk_long : {
93       CORBA::Long l ;
94       data >>= l ;
95       cdebug << "ArgIn" << i << " : " << ArgName << " Value " << l << " (CORBA::Long)" << endl ;
96       break ;
97     }
98     case CORBA::tk_float : {
99       CORBA::Float f ;
100       data >>= f ;
101       cdebug << "ArgIn" << i << " : " << ArgName << " Value " << f << " (float)" << endl ;
102       break ;
103     }
104     case CORBA::tk_double : {
105       CORBA::Double d ;
106       data >>= d ;
107       cdebug << "ArgIn" << i << " : " << ArgName << " Value " << d << " (double)" << endl ;
108       break ;
109     }
110     case CORBA::tk_objref : {
111       CORBA::Object_ptr obj ;
112       char * retstr = "Catched ERROR";
113       try {
114         data >>= obj ;
115         retstr = ObjectToString( obj ) ;
116       }
117       catch( ... ) {
118       }
119       cdebug << "ArgIn" << i << " : " << ArgName << " Value " << retstr << "(object reference)" << endl ;
120       break ;
121     }
122     default : {
123       cdebug << "ArgIn" << i << " : " << ArgName << " Value " << "(other ERROR) kind " << Type << endl ;
124     }
125     }
126     cdebug << "" << endl ;
127 #endif
128   }
129
130   for ( i = 0 ; i < n_out ; i++ ) {
131     CORBA::Any & data = outParams[i].Value ;
132     ArgName           = outParams[i].Name.c_str() ;
133     Type              = data.type()->kind() ;
134     arguments->add_value( ArgName , data , CORBA::ARG_OUT ) ;
135 #if DynInvokeTrace
136     switch ( Type ) {
137     case CORBA::tk_string : {
138       cont char * t ;
139       data >>= t ;
140       cdebug << "ArgOut" << i << " : " << ArgName << " Value " << t << " (string)" << endl ;
141       break ;
142     }
143     case CORBA::tk_boolean : {
144       bool b ;
145       data >>= (CORBA::Any::to_boolean ) b ;
146       cdebug << "ArgOut" << i << " : " << ArgName << " Value " << b << " (boolean)" << endl ;
147       break ;
148     }
149     case CORBA::tk_char : {
150       unsigned char c ;
151       data >>= (CORBA::Any::to_char ) c ;
152       cdebug << "ArgOut" << i << " : " << ArgName << " Value " << (int ) c << " (char)" << endl ;
153       break ;
154     }
155     case CORBA::tk_short : {
156       CORBA::Short s ;
157       data >>= s ;
158       cdebug << "ArgOut" << i << " : " << ArgName << " Value " << s << " (short)" << endl ;
159       break ;
160     }
161     case CORBA::tk_long : {
162       CORBA::Long l ;
163       data >>= l ;
164       cdebug << "ArgOut" << i << " : " << ArgName << " Value " << l << " (CORBA::Long)" << endl ;
165       break ;
166     }
167     case CORBA::tk_float : {
168       CORBA::Float f ;
169       data >>= f ;
170       cdebug << "ArgOut" << i << " : " << ArgName << " Value " << f << " (float)" << endl ;
171       break ;
172     }
173     case CORBA::tk_double : {
174       CORBA::Double d ;
175       data >>= d ;
176       cdebug << "ArgOut" << i << " : " << ArgName << " Value " << d << " (double)" << endl ;
177       break ;
178     }
179     case CORBA::tk_objref : {
180       CORBA::Object_ptr obj ;
181       char * retstr = "Catched ERROR";
182       try {
183         data >>= obj ;
184         retstr = ObjectToString( obj ) ;
185       }
186       catch( ... ) {
187       }
188       cdebug << "ArgOut" << i << " : " << ArgName << " Value " << retstr << "(object reference)" << endl ;
189       break ;
190     }
191     default : {
192       cdebug << "ArgOut" << i << " : " << ArgName << " Value " << "(other ERROR) kind " << Type << endl ;
193     }
194     }
195     cdebug << "" << endl ;
196 #endif
197   }
198
199   // IPAL9273, 9369, 9731 : replace blocking function invoke() with non blocking send_deferred()
200   // to provide the correct process of killing dataflow execution
201   req->send_deferred() ;
202   while( !req->poll_response() ) {}
203   req->get_response();
204   
205   if( req->env()->exception() ) {
206     req->env()->exception()->_raise() ;
207     return ; // pas utile ?
208   }
209
210   for ( i = 0 ; i < n_out ; i++ ) {
211
212       outParams[i].Value = *( arguments->item( i + n_in )->value() ) ;
213   }
214
215   return;
216
217 }
218
219 void GraphExecutor::InNode::DynInvoke( Engines::Component_ptr obj ,
220                                        const char *method , 
221                                        const char * aGraphName ,
222                                        const char * aNodeName ) {
223   Request_var req = obj->_request( method ) ;
224
225   NVList_ptr arguments =req->arguments() ;
226
227   CORBA::Any graph ;
228   graph <<= aGraphName ;
229   arguments->add_value( "aGraphName" , graph , CORBA::ARG_IN ) ;
230   CORBA::Any node ;
231   node <<= aNodeName ;
232   arguments->add_value( "aNodeName" , node , CORBA::ARG_IN ) ;
233
234   req->invoke() ;
235
236   if( req->env()->exception() ) {
237     req->env()->exception()->_raise();
238   }
239   return;
240
241 }