[omniORB] Name Service
Boris Khanales
boris@imagine-sw.com
ed, 22 Apr 1998 15:11:36 -0400
I'm rtying to use Name Service and looks like I can bind
the object to NS OK, but when I'm trying to _narrow it
after resolve on the client side I'm geting
COMMUNICATION_FAILE exception. If i write use object_to_string
& string_to_object the client works. Any idea?
Thanx.
This is server side.
START_HERE()
{
clService_ = new ImrDiServiceImpl( this );
clService_->_obj_is_ready( ItsOrbWrapper::getItsORB()->getBOA() );
ImrDiService_var obj = clService_->_this();
// Register in Name Service
ItsOrbWrapper::getItsORB()->registerInImagineNS(
const_cast<char*>(ImrProfile::getGlobalProfile()->getImrServerName().data()),
obj );
}
void ItsOrbWrapper::registerInImagineNS( char *path, CORBA::Object_ptr obj )
{
CosNaming::Name name;
CosNaming::NamingContext_var context = buildNSName( name, path );
try {
context->bind( name, obj );
}
catch( CosNaming::NamingContext::AlreadyBound& ex ) {
cout << "bind fail" << endl << "Trying to rebind" << endl;
context->rebind( name, obj );
cout << "rebind OK" << endl;
}
}
CosNaming::NamingContext_var ItsOrbWrapper::buildNSName( CosNaming::Name &name,
char *path )
{
CORBA::Object_var initServ =
orb_->resolve_initial_references("NameService");
CosNaming::NamingContext_var context =
CosNaming::NamingContext::_narrow(initServ);
if (CORBA::is_nil(context))
throw ItsExceptionBase( "Failed to narrow naming context." );
name.length(1);
name[0].kind = (const char*) "ImagineDir";
name[0].id = (char *) "ImagineSw";
RWCTokenizer next( path );
RWCString nextToken;
ItsBool found = ItsFalse;
while( !(nextToken = next("/")).isNull() )
{
try {
cout << "resolve : " << name[0].id << endl;
CORBA::Object_var obj = context->resolve( name );
CosNaming::NamingContext_var context =
CosNaming::NamingContext::_narrow( obj );
if( !CORBA::is_nil(context) )
{
cout << "resolve->_narrow : " << name[0].id << " OK" << endl;
found = ItsTrue;
}
else
{
cout << "resolve->_narrow : " << name[0].id << " Fail. Trying
resolve" << endl;
found = ItsFalse;
}
}
catch( ... ) {
cout << "resolve : " << name[0].id << " Fail. Trying resolve" <<
endl;
found = ItsFalse;
}
if( !found )
{
try {
context = context->bind_new_context( name );
cout << "bind_new_context : " << name[0].id << " OK" << endl;
}
catch( ... ) {
cout << "bind_new_context : " << name[0].id << " Exception" <<
endl;
throw;
}
}
name[0].id = CORBA::string_dup( nextToken );
}
return context;
}