1 // Copyright (C) 2006-2008 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 #define private public
23 #define protected public
24 #include <omniORB4/CORBA.h>
25 #include <omniORB4/internal/typecode.h>
34 #include "YacsTrace.hxx"
36 int main(int argc, char** argv)
40 CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
41 CORBA::Object_var obj = orb->string_to_object("corbaname:rir:#test.my_context/Echo.Object");
42 eo::Echo_var echoref = eo::Echo::_narrow(obj);
43 if( CORBA::is_nil(echoref) )
45 std::cerr << "Can't narrow reference to type Echo (or it was nil)." << std::endl;
49 CORBA::String_var src = (const char*) "Hello!";
50 CORBA::String_var dest = echoref->echoString(src);
51 std::cerr << "I said, \"" << (char*)src << "\"." << std::endl
52 << "The Echo object replied, \"" << (char*)dest <<"\"." << std::endl;
54 CORBA::Object_var ob = orb->string_to_object("corbaname:rir:#test.my_context/D.Object");
55 eo::D_var Dref = eo::D::_narrow(ob);
56 if( CORBA::is_nil(Dref) ) {
57 std::cerr << "Can't narrow reference to type D (or it was nil)." << std::endl;
63 echoref->echoD(Dref,dout);
64 std::cerr << dout->echoLong2(10) << std::endl;
67 echoref->echoD(dout,ddout);
68 std::cerr << dout->echoLong2(10) << std::endl;
70 CORBA::Object_var oob = orb->string_to_object("corbaname:rir:#test.my_context/Obj.Object");
71 eo::Obj_var Objref = eo::Obj::_narrow(oob);
74 echoref->echoObj2(Objref,Objout);
75 std::cerr << Objout->echoLong(10) << std::endl;
77 CORBA::Object_var cob = orb->string_to_object("corbaname:rir:#test.my_context/C.Object");
78 eo::C_var Cref = eo::C::_narrow(cob);
80 echoref->echoC(Cref,Cout);
82 echoref->echoObj2(Cref,Objout);
83 //echoref->echoC(Cref,Objout); compilation impossible
84 //echoref->echoObj2(Cref,Cout); compilation impossible
85 //echoref->echoC(Objref,Cout); compilation impossible
87 CORBA::Object_var dobj = orb->resolve_initial_references("DynAnyFactory");
88 DynamicAny::DynAnyFactory_var dynFactory = DynamicAny::DynAnyFactory::_narrow(dobj);
90 CORBA::TypeCode_var content_type=orb->create_interface_tc("IDL:eo/Obj:1.0","Obj");
92 std::vector<CORBA::Any*> v;
93 std::vector<CORBA::Any*>::const_iterator iter;
95 CORBA::Any *any = new CORBA::Any();
100 CORBA::Any *any2 = new CORBA::Any();
104 std::cerr << "refcount: " << oob->_PR_getobj()->pd_refCount << std::endl;
107 CORBA::Any *any3 = new CORBA::Any();
111 std::cerr << "refcount: " << oob->_PR_getobj()->pd_refCount << std::endl;
117 std::cerr << "refcount: " << xobj->_PR_getobj()->pd_refCount << std::endl;
122 std::cerr << "refcount: " << yobj->_PR_getobj()->pd_refCount << std::endl;
125 CORBA::Object_var zobj ;
126 *any2 >>= CORBA::Any::to_object(zobj) ;
128 std::cerr << "refcount: " << zobj->_PR_getobj()->pd_refCount << std::endl;
131 // Build an Any from vector v
133 CORBA::TypeCode_var tc;
137 // Check if it's an homogeneous vector : all TypeCodes must be equivalent
138 CORBA::TypeCode_var any_tc=v[0]->type();
139 tc=orb->create_sequence_tc(0,any_tc);
141 for(iter=v.begin();iter!=v.end();iter++)
144 CORBA::TypeCode_var tc2=a->type();
145 if(!tc2->equivalent(any_tc))
147 // It's a non homogeneous vector : create a sequence of any
148 tc=orb->create_sequence_tc(0,CORBA::_tc_any);
153 // It's a homogeneous vector : create a sequence of the homogeneous type
157 // It's an empty vector : create a sequence of any
158 tc=orb->create_sequence_tc(0,CORBA::_tc_any);
162 DynamicAny::DynAny_var dynany = dynFactory->create_dyn_any_from_type_code(tc);
163 DynamicAny::DynSequence_var ds = DynamicAny::DynSequence::_narrow(dynany);
165 ds->set_length(v.size());
166 for(iter=v.begin();iter!=v.end();iter++)
168 DynamicAny::DynAny_var temp=ds->current_component();
174 //delete intermediate any
178 CORBA::Any_var seqany=ds->to_any();
182 std::map<std::string,CORBA::Any*> m;
183 CORBA::Any *any4 = new CORBA::Any();
187 CORBA::Any *any5 = new CORBA::Any();
190 CORBA::Any *any6 = new CORBA::Any();
193 CORBA::Any *any7 = new CORBA::Any();
194 *any7 <<= (const char*)"coucou";
196 CORBA::Any *any8 = new CORBA::Any();
197 *any8 <<= CORBA::Any::from_boolean(1);
212 CORBA::StructMemberSeq mseq;
213 mseq.length(nMember);
214 mseq[0].name=CORBA::string_dup("x");
215 mseq[0].type=CORBA::TypeCode::_duplicate(CORBA::_tc_double);
216 mseq[1].name=CORBA::string_dup("y");
217 mseq[1].type=CORBA::TypeCode::_duplicate(CORBA::_tc_long);
218 mseq[2].name=CORBA::string_dup("s");
219 mseq[2].type=CORBA::TypeCode::_duplicate(CORBA::_tc_string);
220 mseq[3].name=CORBA::string_dup("b");
221 mseq[3].type=CORBA::TypeCode::_duplicate(CORBA::_tc_boolean);
222 mseq[4].name=CORBA::string_dup("ob");
223 mseq[4].type=content_type;
224 for(int i=0;i<nMember;i++)
226 const char* name=mseq[i].name;
227 std::cerr << mseq[i].name << std::endl;
228 if(m.count(name) !=0)
230 std::cerr << "member: " << mseq[i].name << std::endl;
231 mseq[i].type=m[name]->type();
234 CORBA::TypeCode_var ts= orb->create_struct_tc("","",mseq);
235 //CORBA::TypeCode_var ts= orb->create_struct_tc("IDL:eo/S3:1.0","S3",mseq);
236 dynany = dynFactory->create_dyn_any_from_type_code(ts);
237 DynamicAny::DynStruct_var dst = DynamicAny::DynStruct::_narrow(dynany);
239 for(int i=0;i<nMember;i++)
241 DynamicAny::DynAny_var temp=dst->current_component();
242 const char* name=mseq[i].name;
243 std::cerr << name << std::endl;
244 CORBA::Any* a=m[name];
246 //delete intermediate any
250 CORBA::Any_var structany=dst->to_any();
254 for(int i=0;i<nMember;i++)
256 const char * name=tst->memberName(i);
257 //TypeCode* tm=tst->memberType(i);
258 //do not test member presence : test has been done in ToYacs convertor
259 CORBA::Any* a=m[name];
260 members[i].id=CORBA::string_dup(name);
262 //delete intermediate any
269 CORBA::TypeCode_var tcout=orb->create_sequence_tc(0,content_type);
271 CORBA::Request_var req = echoref->_request("echoStruct2");
272 //CORBA::Request_var req = echoref->_request("echoObjectVec");
273 CORBA::NVList_ptr arguments = req->arguments() ;
275 arguments->add_value( "s1" , structany , CORBA::ARG_IN ) ;
276 //arguments->add_value( "s1" , seqany , CORBA::ARG_IN ) ;
279 out.replace(ts, (void*) 0);
280 //out.replace(tcout, (void*) 0);
281 arguments->add_value( "s2" , out , CORBA::ARG_OUT );
283 req->set_return_type(CORBA::_tc_void);
285 //req->exceptions()->add(eo::_tc_SALOME_Exception);
288 CORBA::Exception *exc =req->env()->exception();
291 std::cerr << "The raised exception is of Type:" << exc->_name() << std::endl;
292 if(strcmp(exc->_name(),"MARSHAL") == 0)
294 const char* ms = ((CORBA::MARSHAL*)exc)->NP_minorString();
296 std::cerr << "(CORBA::MARSHAL: minor = " << ms << ")" << std::endl;
301 std::cerr << "Before request" << std::endl;
302 req = echoref->_request("echoObj2");
303 std::cerr << "After request" << std::endl;
304 req->add_in_arg() <<= Objref;
305 std::cerr << "After add_in_arg" << std::endl;
306 req->add_out_arg() <<= Objout;
307 std::cerr << "After add_out_arg" << std::endl;
308 req->set_return_type(CORBA::_tc_void);
309 std::cerr << "After set_return_type" << std::endl;
311 std::cerr << "After invoke" << std::endl;
312 exc =req->env()->exception();
315 std::cerr << "The raised exception is of Type:" << exc->_name() << std::endl;
317 //end of DII on echoObj2
320 req = echoref->_request("echoObjVec");
321 CORBA::Any *aAny = new CORBA::Any();
324 CORBA::TypeCode_var any_tc2=aAny->type();
325 CORBA::TypeCode_var tc2=orb->create_sequence_tc(0,any_tc2);
326 DynamicAny::DynAny_var dynany2 = dynFactory->create_dyn_any_from_type_code(tc2);
327 DynamicAny::DynSequence_var ds2 = DynamicAny::DynSequence::_narrow(dynany2);
329 DynamicAny::DynAny_var temp=ds2->current_component();
330 temp->from_any(*aAny);
332 temp=ds2->current_component();
333 CORBA::Any *aAny2 = new CORBA::Any();
335 CORBA::Object_var zzobj ;
336 *aAny2 >>= CORBA::Any::to_object(zzobj) ;
337 temp->insert_reference(zzobj);
340 CORBA::Any_var seqany2=ds2->to_any();
343 arguments = req->arguments() ;
344 arguments->add_value( "s1" , seqany2 , CORBA::ARG_IN ) ;
347 out2.replace(tc2, (void*) 0);
348 arguments->add_value( "s2" , out2 , CORBA::ARG_OUT );
349 req->set_return_type(CORBA::_tc_void);
352 CORBA::Exception *exc2 =req->env()->exception();
355 std::cerr << "The raised exception is of Type:" << exc2->_name() << std::endl;
356 if(strcmp(exc2->_name(),"MARSHAL") == 0)
358 const char* ms = ((CORBA::MARSHAL*)exc2)->NP_minorString();
360 std::cerr << "(CORBA::MARSHAL: minor = " << ms << ")" << std::endl;
365 CORBA::Any *ob=arguments->item(1)->value();
366 DynamicAny::DynAny_var dynany= dynFactory->create_dyn_any(*ob);
367 DynamicAny::DynSequence_ptr ds=DynamicAny::DynSequence::_narrow(dynany);
368 DynamicAny::AnySeq_var as=ds->get_elements();
369 int length=as->length();
371 for(int i=0;i<length; i++)
373 CORBA::TypeCode_var t=as[i].type();
377 DEBTRACE(xobj->_PD_repoId);
382 //end of DII on echoObjVec
384 // Delete allocated objects to remove memory leaks (valgrind tests)
388 catch(DynamicAny::DynAny::TypeMismatch& ex)
390 std::cerr << "Caught a DynamicAny::DynAny::TypeMismatch exception" << std::endl;
392 catch(DynamicAny::DynAny::InvalidValue& ex)
394 std::cerr << "Caught a DynamicAny::DynAny::InvalidValue exception" << std::endl;
396 catch(CORBA::COMM_FAILURE& ex)
398 std::cerr << "Caught system exception COMM_FAILURE -- unable to contact the object." << std::endl;
400 catch(CORBA::SystemException&)
402 std::cerr << "Caught a CORBA::SystemException." << std::endl;
404 catch(CORBA::Exception&)
406 std::cerr << "Caught CORBA::Exception." << std::endl;
408 catch(omniORB::fatalException& fe)
410 std::cerr << "Caught omniORB::fatalException:" << std::endl;
411 std::cerr << " file: " << fe.file() << std::endl;
412 std::cerr << " line: " << fe.line() << std::endl;
413 std::cerr << " mesg: " << fe.errmsg() << std::endl;
417 std::cerr << "Caught unknown exception." << std::endl;