Salome HOME
975e77a3612da6af631dd5e75bd53c656ccdb703
[samples/component.git] / src / TestFunctions / 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
21 //
22 //
23 //
24 //  File   : DataFlowBase_DynInvoke.cxx
25 //  Author : Marc Tajchman, CEA
26 //  Module : SUPERV
27 //  $Header:
28
29 #include <iostream>
30 #include <unistd.h>
31 #include <iostream>
32 #include <fstream>
33 #include <sstream>
34 #include <iomanip>
35 #include <string>
36 #include <map>
37
38 #include <SALOMEconfig.h>
39 #include CORBA_CLIENT_HEADER(SALOME_Component)
40
41 #include "DynInvoke.hxx"
42
43 #include <stdarg.h>
44
45 using namespace std;
46 using namespace CORBA ;
47
48 void DynInvoke( Engines::Component_ptr objComponent ,
49                 const char *method , 
50                 ServicesAnyData * inParams , int nInParams ,
51                 ServicesAnyData * outParams , int nOutParams ) {
52   Request_var req = objComponent->_request( method ) ;
53   const char *ArgName ;
54   int Type ;
55
56   NVList_ptr arguments = req->arguments() ;
57
58   int i ;
59
60   int n_in  = nInParams ;
61   int n_out = nOutParams ;
62
63 //  char * aComponent = ObjectToString( objComponent ) ;
64 //  MESSAGE( aComponent << "->" << method ) ;
65   for ( i = 0 ; i < n_in ; i++ ) {
66     CORBA::Any & data = inParams[i].Value ;
67     ArgName           = inParams[i].Name.c_str() ;
68     Type              = data.type()->kind() ;
69     arguments->add_value( ArgName , data , CORBA::ARG_IN ) ;
70 #if 0
71     switch ( Type ) {
72     case CORBA::tk_string : {
73       char * t ;
74       data >>= t ;
75       MESSAGE( "ArgIn" << i << " : " << ArgName << " Value " << t << " (string)" ) ;
76       break ;
77     }
78     case CORBA::tk_boolean : {
79       bool b ;
80       data >>= (CORBA::Any::to_boolean ) b ;
81       MESSAGE( "ArgIn" << i << " : " << ArgName << " Value " << b << " (boolean)" ) ;
82       break ;
83     }
84     case CORBA::tk_char : {
85       unsigned char c ;
86       data >>= (CORBA::Any::to_char ) c ;
87       MESSAGE( "ArgIn" << i << " : " << ArgName << " Value " << (int ) c << " (char)" ) ;
88       break ;
89     }
90     case CORBA::tk_short : {
91       short s ;
92       data >>= s ;
93       MESSAGE( "ArgIn" << i << " : " << ArgName << " Value " << s << " (short)" ) ;
94       break ;
95     }
96     case CORBA::tk_long : {
97       long l ;
98       data >>= l ;
99       MESSAGE( "ArgIn" << i << " : " << ArgName << " Value " << l << " (long)" ) ;
100       break ;
101     }
102     case CORBA::tk_float : {
103       float f ;
104       data >>= f ;
105       MESSAGE( "ArgIn" << i << " : " << ArgName << " Value " << f << " (float)" ) ;
106       break ;
107     }
108     case CORBA::tk_double : {
109       double d ;
110       data >>= d ;
111       MESSAGE( "ArgIn" << i << " : " << ArgName << " Value " << d << " (double)" ) ;
112       break ;
113     }
114     case CORBA::tk_objref : {
115       CORBA::Object_ptr obj ;
116       char * retstr = "Catched ERROR";
117       try {
118         data >>= obj ;
119         retstr = ObjectToString( obj ) ;
120       }
121       catch( ... ) {
122       }
123       MESSAGE( "ArgIn" << i << " : " << ArgName << " Value " << retstr << "(object reference)" ) ;
124       break ;
125     }
126     default : {
127       MESSAGE( "ArgIn" << i << " : " << ArgName << " Value " << "(other ERROR) kind " << Type ) ;
128     }
129     }
130     MESSAGE("") ;
131 #endif
132   }
133
134   for ( i = 0 ; i < n_out ; i++ ) {
135     CORBA::Any & data = outParams[i].Value ;
136     ArgName           = outParams[i].Name.c_str() ;
137     Type              = data.type()->kind() ;
138     arguments->add_value( ArgName , data , CORBA::ARG_OUT ) ;
139 #if 0
140     switch ( Type ) {
141     case CORBA::tk_string : {
142       char * t ;
143       data >>= t ;
144       MESSAGE( "ArgOut" << i << " : " << ArgName << " Value " << t << " (string)" ) ;
145       break ;
146     }
147     case CORBA::tk_boolean : {
148       bool b ;
149       data >>= (CORBA::Any::to_boolean ) b ;
150       MESSAGE( "ArgOut" << i << " : " << ArgName << " Value " << b << " (boolean)" ) ;
151       break ;
152     }
153     case CORBA::tk_char : {
154       unsigned char c ;
155       data >>= (CORBA::Any::to_char ) c ;
156       MESSAGE( "ArgOut" << i << " : " << ArgName << " Value " << (int ) c << " (char)" ) ;
157       break ;
158     }
159     case CORBA::tk_short : {
160       short s ;
161       data >>= s ;
162       MESSAGE( "ArgOut" << i << " : " << ArgName << " Value " << s << " (short)" ) ;
163       break ;
164     }
165     case CORBA::tk_long : {
166       long l ;
167       data >>= l ;
168       MESSAGE( "ArgOut" << i << " : " << ArgName << " Value " << l << " (long)" ) ;
169       break ;
170     }
171     case CORBA::tk_float : {
172       float f ;
173       data >>= f ;
174       MESSAGE( "ArgOut" << i << " : " << ArgName << " Value " << f << " (float)" ) ;
175       break ;
176     }
177     case CORBA::tk_double : {
178       double d ;
179       data >>= d ;
180       MESSAGE( "ArgOut" << i << " : " << ArgName << " Value " << d << " (double)" ) ;
181       break ;
182     }
183     case CORBA::tk_objref : {
184       CORBA::Object_ptr obj ;
185       char * retstr = "Catched ERROR";
186       try {
187         data >>= obj ;
188         retstr = ObjectToString( obj ) ;
189       }
190       catch( ... ) {
191       }
192       MESSAGE( "ArgOut" << i << " : " << ArgName << " Value " << retstr << "(object reference)" ) ;
193       break ;
194     }
195     default : {
196       MESSAGE( "ArgOut" << i << " : " << ArgName << " Value " << "(other ERROR) kind " << Type ) ;
197     }
198     }
199     MESSAGE("") ;
200 #endif
201   }
202
203   req->invoke();
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