Interstage Application Server アプリケーション作成ガイド (CORBAサービス編) |
目次
索引
![]() ![]() |
第11章 CORBAアプリケーションの高度な使い方 | > 11.1 Factory |
Factoryオブジェクトを生成した際に、privateデータを初期化するときの値をクライアントごとに設定する場合の方法例について以下に示します。
Factoryインタフェースのオブジェクトを生成するcreate_objメソッドに、識別子として使用するパラメタを追加します。ここでは、string型パラメタを使用し、クライアントアプリケーションを使用しているユーザ名を渡すこととします。
module ODsample { interface intf1 { attribute long x; attribute string y; void destroy(); }; interface factory { intf1 create_obj( in string user_name ); }; };
上記IDL定義で示してあるパラメタ"user_name"をオブジェクトの識別情報(ReferenceData)として設定します。
// create_obj メソッドの実装 ODsample::intf1_ptr ODsample_factory_impl::create_obj( CORBA::Char *user_name, CORBA::Environment &env ) throw( CORBA::Exception ) { CORBA::ReferenceData *id; CORBA::Octet *data; CORBA::ULong len; len = strlen( user_name ) + 1; data = CORBA::ReferenceData::allocbuf( len ); strcpy( data, user_name ); id = new CORBA::ReferenceData( len, len, data, CORBA_FALSE ); CORBA::Object_ptr new_obj = boa->create( id, intf1, impl, env ); ODsample::intf1_ptr fac = ODsample::intf1::_narrow( new_obj ); CORBA::release( new_obj ); delete id; delete data; return( fac ); }
コンストラクタは、IDLコンパイラが生成したスケルトン上に以下のように生成されます。ヘッダファイルに直接設定したuser_var, dataを初期化する処理を以下のように追加します。
ODsample_intf1_impl::ODsample_intf1_impl() { // privateデータの初期化 user_var = 0; data = NULL; }
各メソッドが呼び出されたときにprivateデータのdataがNULLの場合は、クライアントごとのprivateデータの初期設定が行われないと判断して、初期設定を行います。IDL定義にあるxの参照メソッドの実装関数の例を以下に示します。
// attribute x の参照(固定長データ) CORBA::Long ODsample_intf1_impl::x( CORBA::Environment &env ) throw( CORBA::Exception ) { if (this->data == NULL) intf1_initialize( this ); return( __x ); }
オブジェクトの識別情報(ReferenceData)を取り出し、ユーザ名に応じた初期値を設定する処理を以下のように行います。
// クライアントごとのprivateデータの初期化処理 void intf1_initialize( ODsample_intf1_impl obj ) { CORBA::Environment env; CORBA::ReferenceData *id; CORBA::ULong len, i; CORBA::Char *name; id = obj->get_id( &env ); len = id->length(); name = CORBA::string_alloc( len ); for (i = 0; i < len; i++) name[i] = id[i]; if (strcmp(name, ...) == 0) { // ユーザ名nameに対応した初期化処理 obj->x = ...; obj->y = ...; obj->user_var = ...; obj->data = name; } ... delete id; }
“クライアントアプリケーションのプログラミング”を参照してください。
目次
索引
![]() ![]() |