Salome HOME
merge from branch DEV tag mergeto_trunk_04apr08
[modules/yacs.git] / src / runtime / Test / echo_clt.cxx
1 //#define REFCNT
2 #ifdef REFCNT
3 #define private public
4 #define protected public
5 #include <omniORB4/CORBA.h>
6 #include <omniORB4/internal/typecode.h>
7 #endif
8
9 #include <echo.hh>
10 #include <iostream>
11 #include <vector>
12 #include <map>
13
14 #define _DEVDEBUG_
15 #include "YacsTrace.hxx"
16
17 int main(int argc, char** argv)
18 {
19   try 
20     {
21       CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
22       CORBA::Object_var obj = orb->string_to_object("corbaname:rir:#test.my_context/Echo.Object");
23       eo::Echo_var echoref = eo::Echo::_narrow(obj);
24       if( CORBA::is_nil(echoref) ) 
25         {
26           std::cerr << "Can't narrow reference to type Echo (or it was nil)." << std::endl;
27           return 1;
28         }
29
30       CORBA::String_var src = (const char*) "Hello!";
31       CORBA::String_var dest = echoref->echoString(src);
32       std::cerr << "I said, \"" << (char*)src << "\"." << std::endl
33        << "The Echo object replied, \"" << (char*)dest <<"\"." << std::endl;
34
35       CORBA::Object_var ob = orb->string_to_object("corbaname:rir:#test.my_context/D.Object");
36       eo::D_var Dref = eo::D::_narrow(ob);
37       if( CORBA::is_nil(Dref) ) {
38         std::cerr << "Can't narrow reference to type D (or it was nil)." << std::endl;
39         return 1;
40         }
41       Dref->echoLong2(10);
42
43       eo::D_var dout;
44       echoref->echoD(Dref,dout);
45       std::cerr << dout->echoLong2(10) << std::endl;
46
47       eo::D_var ddout;
48       echoref->echoD(dout,ddout);
49       std::cerr << dout->echoLong2(10) << std::endl;
50
51       CORBA::Object_var oob = orb->string_to_object("corbaname:rir:#test.my_context/Obj.Object");
52       eo::Obj_var Objref = eo::Obj::_narrow(oob);
53       Objref->echoLong(10);
54       eo::Obj_var Objout;
55       echoref->echoObj2(Objref,Objout);
56       std::cerr << Objout->echoLong(10) << std::endl;
57
58       CORBA::Object_var cob = orb->string_to_object("corbaname:rir:#test.my_context/C.Object");
59       eo::C_var Cref = eo::C::_narrow(cob);
60       eo::C_var Cout;
61       echoref->echoC(Cref,Cout); 
62
63       echoref->echoObj2(Cref,Objout); 
64       //echoref->echoC(Cref,Objout); compilation impossible
65       //echoref->echoObj2(Cref,Cout);  compilation impossible
66       //echoref->echoC(Objref,Cout); compilation impossible
67
68       CORBA::Object_var dobj = orb->resolve_initial_references("DynAnyFactory");
69       DynamicAny::DynAnyFactory_var dynFactory = DynamicAny::DynAnyFactory::_narrow(dobj);
70
71       CORBA::TypeCode_var content_type=orb->create_interface_tc("IDL:eo/Obj:1.0","Obj");
72
73       std::vector<CORBA::Any*> v;
74       std::vector<CORBA::Any*>::const_iterator iter;
75
76       CORBA::Any *any = new CORBA::Any();
77       *any <<= cob;
78       v.push_back(any);
79       /*
80       */
81       CORBA::Any *any2 = new CORBA::Any();
82       *any2 <<= oob;
83       v.push_back(any2);
84 #ifdef REFCNT
85       std::cerr << "refcount: " << oob->_PR_getobj()->pd_refCount << std::endl;
86 #endif
87
88       CORBA::Any *any3 = new CORBA::Any();
89       *any3 <<= oob;
90       v.push_back(any3);
91 #ifdef REFCNT
92       std::cerr << "refcount: " << oob->_PR_getobj()->pd_refCount << std::endl;
93 #endif
94
95       eo::Obj_ptr xobj;
96       *any2 >>= xobj;
97 #ifdef REFCNT
98       std::cerr << "refcount: " << xobj->_PR_getobj()->pd_refCount << std::endl;
99 #endif
100       eo::Obj_ptr yobj;
101       *any2 >>= yobj;
102 #ifdef REFCNT
103       std::cerr << "refcount: " << yobj->_PR_getobj()->pd_refCount << std::endl;
104 #endif
105
106       CORBA::Object_var zobj ;
107       *any2 >>= CORBA::Any::to_object(zobj) ;
108 #ifdef REFCNT
109       std::cerr << "refcount: " << zobj->_PR_getobj()->pd_refCount << std::endl;
110 #endif
111
112       // Build an Any from vector v
113       int homog=1;
114       CORBA::TypeCode_var tc;
115
116       if(v.size() != 0)
117         {
118           // Check if it's an homogeneous vector : all TypeCodes must be equivalent
119           CORBA::TypeCode_var any_tc=v[0]->type();
120           tc=orb->create_sequence_tc(0,any_tc);
121
122           for(iter=v.begin();iter!=v.end();iter++)
123             {
124               CORBA::Any* a=*iter;
125               CORBA::TypeCode_var tc2=a->type();
126               if(!tc2->equivalent(any_tc))
127                 {
128                   // It's a non homogeneous vector : create a sequence of any
129                   tc=orb->create_sequence_tc(0,CORBA::_tc_any);
130                   homog=0;
131                   break;
132                 }
133             }
134           // It's a homogeneous vector : create a sequence of the homogeneous type
135         }
136       else
137         {
138           // It's an empty vector : create a sequence of any
139           tc=orb->create_sequence_tc(0,CORBA::_tc_any);
140           homog=0;
141         }
142
143       DynamicAny::DynAny_var dynany = dynFactory->create_dyn_any_from_type_code(tc);
144       DynamicAny::DynSequence_var ds = DynamicAny::DynSequence::_narrow(dynany);
145
146       ds->set_length(v.size());
147       for(iter=v.begin();iter!=v.end();iter++)
148         {
149           DynamicAny::DynAny_var temp=ds->current_component();
150           CORBA::Any* a=*iter;
151           if(homog)
152             temp->from_any(*a);
153           else
154             ds->insert_any(*a);
155           //delete intermediate any
156           delete a;
157           ds->next();
158         }
159       CORBA::Any_var seqany=ds->to_any();
160       ds->destroy();
161
162       //DynStruct from map
163       std::map<std::string,CORBA::Any*> m;
164       CORBA::Any *any4 = new CORBA::Any();
165       *any4 <<= oob;
166       //*any4 <<= cob;
167       m["ob"]=any4;
168       CORBA::Any *any5 = new CORBA::Any();
169       *any5 <<= 1.0;
170       m["x"]=any5;
171       CORBA::Any *any6 = new CORBA::Any();
172       *any6 <<= (long)1;
173       m["y"]=any6;
174       CORBA::Any *any7 = new CORBA::Any();
175       *any7 <<= (const char*)"coucou";
176       m["s"]=any7;
177       CORBA::Any *any8 = new CORBA::Any();
178       *any8 <<= CORBA::Any::from_boolean(1);
179       m["b"]=any8;
180
181 /*
182   struct S3
183   {
184     double x;
185     long y;
186     string s;
187     boolean b;
188     Obj ob;
189   };
190 */
191
192       int nMember=5;
193       CORBA::StructMemberSeq mseq;
194       mseq.length(nMember);
195       mseq[0].name=CORBA::string_dup("x");
196       mseq[0].type=CORBA::TypeCode::_duplicate(CORBA::_tc_double);
197       mseq[1].name=CORBA::string_dup("y");
198       mseq[1].type=CORBA::TypeCode::_duplicate(CORBA::_tc_long);
199       mseq[2].name=CORBA::string_dup("s");
200       mseq[2].type=CORBA::TypeCode::_duplicate(CORBA::_tc_string);
201       mseq[3].name=CORBA::string_dup("b");
202       mseq[3].type=CORBA::TypeCode::_duplicate(CORBA::_tc_boolean);
203       mseq[4].name=CORBA::string_dup("ob");
204       mseq[4].type=content_type;
205       for(int i=0;i<nMember;i++)
206         {
207           const char* name=mseq[i].name;
208           std::cerr << mseq[i].name << std::endl;
209           if(m.count(name) !=0)
210             {
211               std::cerr << "member: " << mseq[i].name << std::endl;
212               mseq[i].type=m[name]->type();
213             }
214         }
215       CORBA::TypeCode_var ts= orb->create_struct_tc("","",mseq);
216       //CORBA::TypeCode_var ts= orb->create_struct_tc("IDL:eo/S3:1.0","S3",mseq);
217       dynany = dynFactory->create_dyn_any_from_type_code(ts);
218       DynamicAny::DynStruct_var dst = DynamicAny::DynStruct::_narrow(dynany);
219
220       for(int i=0;i<nMember;i++)
221         {
222           DynamicAny::DynAny_var temp=dst->current_component();
223           const char* name=mseq[i].name;
224           std::cerr << name << std::endl;
225           CORBA::Any* a=m[name];
226           temp->from_any(*a);
227           //delete intermediate any
228           delete a;
229           dst->next();
230         }
231       CORBA::Any_var structany=dst->to_any();
232       dst->destroy();
233
234       /*
235       for(int i=0;i<nMember;i++)
236         {
237               const char * name=tst->memberName(i);
238               //TypeCode* tm=tst->memberType(i);
239               //do not test member presence : test has been done in ToYacs convertor
240               CORBA::Any* a=m[name];
241               members[i].id=CORBA::string_dup(name);
242               members[i].value=*a;
243               //delete intermediate any
244               delete a;
245          }
246          */
247
248
249       //DII invoke
250       CORBA::TypeCode_var tcout=orb->create_sequence_tc(0,content_type);
251
252       CORBA::Request_var req = echoref->_request("echoStruct2");
253       //CORBA::Request_var req = echoref->_request("echoObjectVec");
254       CORBA::NVList_ptr arguments = req->arguments() ;
255
256       arguments->add_value( "s1" , structany , CORBA::ARG_IN ) ;
257       //arguments->add_value( "s1" , seqany , CORBA::ARG_IN ) ;
258
259       CORBA::Any out;
260       out.replace(ts, (void*) 0);
261       //out.replace(tcout, (void*) 0);
262       arguments->add_value( "s2" , out , CORBA::ARG_OUT );
263
264       req->set_return_type(CORBA::_tc_void);
265       //user exceptions
266       //req->exceptions()->add(eo::_tc_SALOME_Exception);
267
268       req->invoke();
269       CORBA::Exception *exc =req->env()->exception();
270       if( exc )
271         {
272           std::cerr << "The raised exception is of Type:" << exc->_name() << std::endl;
273           if(strcmp(exc->_name(),"MARSHAL") == 0)
274             {
275               const char* ms = ((CORBA::MARSHAL*)exc)->NP_minorString();
276               if (ms)
277                 std::cerr << "(CORBA::MARSHAL: minor = " << ms << ")" << std::endl;
278             }
279         }
280
281       //DII on echoObj2
282       std::cerr << "Before request" << std::endl;
283       req = echoref->_request("echoObj2");
284       std::cerr << "After request" << std::endl;
285       req->add_in_arg() <<= Objref;
286       std::cerr << "After add_in_arg" << std::endl;
287       req->add_out_arg() <<= Objout;
288       std::cerr << "After add_out_arg" << std::endl;
289       req->set_return_type(CORBA::_tc_void);
290       std::cerr << "After set_return_type" << std::endl;
291       req->invoke();
292       std::cerr << "After invoke" << std::endl;
293       exc =req->env()->exception();
294       if( exc )
295         {
296           std::cerr << "The raised exception is of Type:" << exc->_name() << std::endl;
297         }
298       //end of DII on echoObj2
299
300       //DII on echoObjVec
301       req = echoref->_request("echoObjVec");
302       CORBA::Any *aAny = new CORBA::Any();
303       *aAny <<= oob;
304
305       CORBA::TypeCode_var any_tc2=aAny->type();
306       CORBA::TypeCode_var tc2=orb->create_sequence_tc(0,any_tc2);
307       DynamicAny::DynAny_var dynany2 = dynFactory->create_dyn_any_from_type_code(tc2);
308       DynamicAny::DynSequence_var ds2 = DynamicAny::DynSequence::_narrow(dynany2);
309       ds2->set_length(2);
310       DynamicAny::DynAny_var temp=ds2->current_component();
311       temp->from_any(*aAny);
312       ds2->next();
313       temp=ds2->current_component();
314       CORBA::Any *aAny2 = new CORBA::Any();
315       *aAny2 <<= cob;
316       CORBA::Object_var zzobj ;
317       *aAny2 >>= CORBA::Any::to_object(zzobj) ;
318       temp->insert_reference(zzobj);
319       ds2->next();
320
321       CORBA::Any_var seqany2=ds2->to_any();
322       ds2->destroy();
323
324       arguments = req->arguments() ;
325       arguments->add_value( "s1" , seqany2 , CORBA::ARG_IN ) ;
326
327       CORBA::Any out2;
328       out2.replace(tc2, (void*) 0);
329       arguments->add_value( "s2" , out2 , CORBA::ARG_OUT );
330       req->set_return_type(CORBA::_tc_void);
331       req->invoke();
332
333       CORBA::Exception *exc2 =req->env()->exception();
334       if( exc2 )
335         {
336           std::cerr << "The raised exception is of Type:" << exc2->_name() << std::endl;
337           if(strcmp(exc2->_name(),"MARSHAL") == 0)
338             {
339               const char* ms = ((CORBA::MARSHAL*)exc2)->NP_minorString();
340               if (ms)
341                 std::cerr << "(CORBA::MARSHAL: minor = " << ms << ")" << std::endl;
342             }
343         }
344       else
345         {
346           CORBA::Any *ob=arguments->item(1)->value();
347           DynamicAny::DynAny_var dynany= dynFactory->create_dyn_any(*ob);
348           DynamicAny::DynSequence_ptr ds=DynamicAny::DynSequence::_narrow(dynany);
349           DynamicAny::AnySeq_var as=ds->get_elements();
350           int length=as->length();
351           DEBTRACE(length);
352           for(int i=0;i<length; i++)
353             {
354               CORBA::TypeCode_var t=as[i].type();
355               DEBTRACE(t->id());
356               eo::Obj_ptr xobj;
357               as[i] >>= xobj;
358               DEBTRACE(xobj->_PD_repoId);
359               xobj->echoLong(12);
360             };
361         }
362
363       //end of DII on echoObjVec
364
365       // Delete allocated objects to remove memory leaks (valgrind tests)
366
367       orb->destroy();
368     }
369   catch(DynamicAny::DynAny::TypeMismatch& ex)
370     {
371       std::cerr << "Caught a DynamicAny::DynAny::TypeMismatch exception" << std::endl;
372     }
373   catch(DynamicAny::DynAny::InvalidValue& ex)
374     {
375       std::cerr << "Caught a DynamicAny::DynAny::InvalidValue exception" << std::endl;
376     }
377   catch(CORBA::COMM_FAILURE& ex) 
378     {
379       std::cerr << "Caught system exception COMM_FAILURE -- unable to contact the object." << std::endl;
380     }
381   catch(CORBA::SystemException&) 
382     {
383       std::cerr << "Caught a CORBA::SystemException." << std::endl;
384     }
385   catch(CORBA::Exception&) 
386     {
387       std::cerr << "Caught CORBA::Exception." << std::endl;
388     }
389   catch(omniORB::fatalException& fe) 
390     {
391       std::cerr << "Caught omniORB::fatalException:" << std::endl;
392       std::cerr << "  file: " << fe.file() << std::endl;
393       std::cerr << "  line: " << fe.line() << std::endl;
394       std::cerr << "  mesg: " << fe.errmsg() << std::endl;
395     }
396   catch(...) 
397     {
398       std::cerr << "Caught unknown exception." << std::endl;
399     }
400   return 0;
401 }