Factoryインタフェースによるオブジェクトリファレンスの作成方法について説明します。
(1) サーバの初期化/活性化
インタフェース情報およびインプリメンテーション情報を獲得し、オブジェクトリファレンスを作成します。
初期化
CORBA::ORB_init()、CORBA::ORB::BOA_init()によりサーバの初期化を行います。
インプリメンテーション情報の獲得
Factoryインタフェースのインプリメンテーション情報を獲得します。FJ::ImplementationRep::lookup_id()でFactoryインタフェースのインプリメンテーションリポジトリID(“_IMPL_モジュール名_factory”)を指定します。
インタフェース情報の獲得
Factory以外のインタフェース情報を獲得します。
サーバの活性化
2.で獲得したインプリメンテーション情報を指定してCORBA::BOA::impl_is_ready()またはCORBA::BOA::obj_is_ready()を発行します。これにより、IDLに定義されたすべてのインタフェースが活性化されます。
boa->impl_is_ready( impl, env );
ここでは、main関数でインプリメンテーション情報/インタフェース情報を獲得する例を示します。
static CORBA::ORB_ptr orb;
static CORBA::BOA_ptr boa;
static CORBA::Repository_ptr intf_rep;
static FJ::ImplementationRep_ptr impl_rep;
static CORBA::InterfaceDef_ptr intf1;
static CORBA::ImplementationDef_ptr impl;
static CORBA::Object_ptr o;
static CORBA::Environment env;
CORBA::ReferenceData id;
int
main( int argc, char *argv[] )
{
int current_argc = argc;
char buf[128];
// 初期化処理
orb = CORBA::ORB_init( current_argc, argv, FJ_OM_ORBid, env );
boa = orb->BOA_init( current_argc, argv, CORBA_BOA_OAid, env );
// インプリメンテーション情報の獲得
o = orb->resolve_initial_references(
CORBA_ORB_ObjectId_ImplementationRepository, env );
impl_rep = FJ::ImplementationRep::_narrow( o );
o = impl_rep->lookup_id( _IMPL_ODsample_factory, env );
impl = CORBA::ImplementationDef::_narrow( o );
// インタフェース情報の獲得
o = orb->resolve_initial_references(
CORBA_ORB_ObjectId_LightInterfaceRepository, env );
intf_rep = CORBA::Repository::_narrow( o );
o = intf_rep->lookup_id( _INTF_ODsample_intf1, env );
intf1 = CORBA::InterfaceDef::_narrow( o );
// サーバの活性化
boa->impl_is_ready( impl, env );
}(2) Factoryインタフェースの実装関数
前項で獲得したインプリメンテーション情報/インタフェース情報を使用して、CORBA::BOA::create()でオブジェクトリファレンスを作成します。
// create_obj メソッドの実装
ODsample::intf1_ptr
ODsample_factory_impl::create_obj( CORBA::Environment &env )
throw( CORBA::Exception )
{
// BOA::create関数を使用して、オブジェクトリファレンスを作成します。
CORBA::Object_ptr new_obj = boa->create( id, intf1, impl, env );
ODsample::intf1_ptr fac = ODsample::intf1::_narrow( new_obj );
CORBA::release( new_obj );
return( fac );
}(3) ネーミングサービスへの登録
OD_or_admコマンドでネーミングサービスにFactoryインタフェースのオブジェクトリファレンスを登録します。-cオプションには、FactoryインタフェースのインタフェースリポジトリIDを指定します。
OD_or_adm -c IDL:ODsample/factory:1.0 -n ODsample::factory