[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;
}