Interstage Application Server アプリケーション作成ガイド (CORBAサービス編)
目次 索引 前ページ次ページ

第11章 CORBAアプリケーションの高度な使い方> 11.1 Factory

11.1.4 クライアントごとのprivateデータの初期化

 Factoryオブジェクトを生成した際に、privateデータを初期化するときの値をクライアントごとに設定する場合の方法例について以下に示します。

IDL定義

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

(1) サーバアプリケーションの処理

Factoryインタフェースの実装処理関数

 上記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;
  }

(2) クライアントアプリケーションの処理

 “クライアントアプリケーションのプログラミング”を参照してください。


目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005