I have a problem with omniORB4. I have been make an example that have the
IDL like this:
interface Credenziali
{
attribute string user;
attribute string passwd;
};
enum RET_FUNC{OK,NOT_OK};
interface Accesso
{
RET_FUNC login(in Credenziali crd);
RET_FUNC isLogin();
RET_FUNC LogOut();
};
from client i create an Credenziali_impl object to pass to login member
of the Access remote object the server receive the object fine but after
the executing the routine it in segfault, and i don't know why. The bit
of client and servant are:
//THE SERVANT IS
CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
// Obtain a reference to the root POA.
CORBA::Object_var obj = orb->resolve_initial_references("RootPOA");
PortableServer::POA_var poa = PortableServer::POA::_narrow(obj);
// We allocate the objects on the heap. Since these are reference
// counted objects, they will be deleted by the POA when they are no
// longer needed.
Middleware_Credenziali_i* myMiddleware_Credenziali_i = new
Middleware_Credenziali_i();
Middleware_Accesso_i* myMiddleware_Accesso_i = new
Middleware_Accesso_i();
// Activate the objects. This tells the POA that the objects are
// ready to accept requests.
PortableServer::ObjectId_var myMiddleware_Credenziali_iid = poa-
>activate_object(myMiddleware_Credenziali_i);
PortableServer::ObjectId_var myMiddleware_Accesso_iid = poa-
>activate_object(myMiddleware_Accesso_i);
// Obtain a reference to each object and output the stringified
// IOR to stdout
{
// IDL interface: Middleware::Credenziali
CORBA::Object_var ref = myMiddleware_Credenziali_i->_this();
CORBA::String_var sior(orb->object_to_string(ref));
std::cout << "IDL object Middleware::Credenziali IOR = '" << (char*)
sior << "'" << std::endl;
}
{
// IDL interface: Middleware::Accesso
CORBA::Object_var ref = myMiddleware_Accesso_i->_this();
CORBA::String_var sior(orb->object_to_string(ref));
std::cout << "IDL object Middleware::Accesso IOR = '" << (char*)
sior << "'" << std::endl;
}
//END SERVANT
OBJECT IMPLEMANTATION OF ACCESS:
Middleware::RET_FUNC Middleware_Accesso_i::login
(Middleware::Credenziali_ptr crd){
char * ut;
ut=crd->utente();
cout<<ut<<endl;
return Middleware::OK;
}
//END OBJECT IMPLEMENTATION
//CLIENT SOWTWARE
CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
if( argc != 2 ) {
cerr << "usage: eg2_clt <object reference>" << endl;
return 1;
}
CORBA::Object_var obj = orb->string_to_object(argv[1]);
Accesso_var login=Accesso::_narrow(obj);
if( CORBA::is_nil(login) ) {
cerr << "Can't narrow reference to type Echo (or it was nil)." <<
endl;
return 1;
}
obj = orb->resolve_initial_references("RootPOA");
PortableServer::POA_var poa = PortableServer::POA::_narrow(obj);
PortableServer::POAManager_var pman = poa->the_POAManager();
pman->activate();
Accesso_ptr login_ptr;
login_ptr=login;
Credenziali_ptr c;
Middleware_Credenziali_i *n=new Middleware_Credenziali_i;
c=n->_this();
c->utente("BUNNY");
c->passwd("BUGS");
Middleware::RET_FUNC ok= login_ptr->login(c);
orb->destroy();
//END CLIENT
At Run Time the servant print the name of user BUNNY after it go in
segfault .
I have make an error on the client?
Thanks
Best Regards & Happy Cristmans