// serwer corbowy pod mico/C++ (12.2015) // #include #include #include #include "Hello.h" using namespace std; class HelloImpl : virtual public ::POA_HelloApp::Hello { public: int licznik; ::HelloApp::long_seq_box* seq; HelloImpl() { licznik= 0; seq= 0; } ~HelloImpl() { CORBA::remove_ref(seq); } ::HelloApp::long_seq* met1( const ::HelloApp::long_seq& s1 ) { int s1_len= s1.length(); ::HelloApp::long_seq* s2w= new ::HelloApp::long_seq; s2w->length(s1_len); *s2w= s1; return s2w; } CORBA::Any* zwrocCokolwiek( CORBA::Long tryb ) { CORBA::Any* a= new CORBA::Any; if (tryb==1) { (*a) <<= (CORBA::Long)123; } if (tryb==2) { (*a) <<= "qqq www eee"; // na pewno deep copying ???? } if (tryb==3) { ::HelloApp::long_seq s; s.length(3); s[0]= 111; s[1]= 222; s[2]= 333; (*a) <<= s; // na pewno deep copying ???? } if (tryb==4) { ::HelloApp::long_seq_box* sb= new ::HelloApp::long_seq_box; //(*a) <<= sb->_value(); // to dziala, ale chyba nie o to chodzi... //(*a) <<= sb; // to sie, niestety, nie kompiluje pod mico... // nie da sie tego zrobic ?!?!?!?!? // moze to blad gcc/mico (ze ta linia sie nie kompiluje) ?! ::HelloApp::long_seq& s= sb->_value(); s.length(2); s[0]= 1111; s[1]= 2222; (*a) <<= sb->_value(); CORBA::remove_ref(sb); // tak sie usuwav VT i VB !!! // (nie mozna przez delete lub zm. automat. !) // jest tez CORBA::add_ref() ... // po new refcount==1 (ze specyfikacji C++/Corba !) } return a; } // seq - to pole serwanta; // uzywamy go do "podczepiania" arg metody pod serwanta // zarzadzanie pamiecia przy pomocy refcount, // dlatego uzywamy long_seq_box, a nie long_seq... // void zapiszSeq( ::HelloApp::long_seq_box* s1 ) { CORBA::remove_ref(seq); // usuwamy poprzedni ob. podczepiony pod seq CORBA::add_ref(s1); // refcount ++ seq= s1; } ::HelloApp::long_seq_box* odczytajSeq() { CORBA::add_ref(seq); // bez tego ob. by zniknal... return seq; } void pomnozRazy( CORBA::Double wsp ) { if (seq==0) return; ::HelloApp::long_seq& s= seq->_value(); // "s" to ref. C++-owa do "zawartosci" ob. seq // ta zawartosc jest typu long_seq int len= s.length(); for(int i=0; iresolve_initial_references("RootPOA"); PortableServer::POA_var poa = PortableServer::POA::_narrow(poaobj); PortableServer::POAManager_var mgr = poa->the_POAManager(); mgr->activate(); HelloImpl hello_servant; CORBA::Object_var hello_obj= poa->servant_to_reference(&hello_servant); CORBA::String_var s= orb->object_to_string(hello_obj); // okazuje sie ze w przypadku ValueBox nie jest konieczna fabryka VT !!! // jest konieczna dla "zwyklych" valuetypes... ofstream plik; plik.open("Hello.ior", ios::out|ios::trunc); plik << s << endl; orb->run(); } catch (...) {cout << "ERROR" << endl;} }