ページの先頭行へ戻る
Interstage Application Server アプリケーション作成ガイド(CORBAサービス編)

G.3.1 C言語の開発

  動的スケルトンインタフェース(DSI)のサーバアプリケーションは、初期化処理部とサーバアプリケーションが実装するゲートウェイから構成されます。初期化処理部では、以下に示す処理を行います。



G.3.1.1 初期化

  CORBAの初期化メソッドCORBA_ORB_init()を呼び出し、初期化処理を行います。結果として、ORBのオブジェクトリファレンスが返されます。このオブジェクトリファレンスは、以降で呼び出すORBインタフェースを使用する場合に指定します。
  また、基本オブジェクトアダプタの初期化処理を行います。


G.3.1.2 ゲートウェイの登録

  サーバアプリケーションが実装するゲートウェイをORBに通知するため、以下の処理を行います。


(1)インプリメンテーションリポジトリのオブジェクトリファレンスの獲得

  CORBA_ORB_resolve_initial_references()により、インプリメンテーションリポジトリのオブジェクトリファレンスを取り出します。パラメタとして、CORBA_ORB_ObjectId_ImplementationRepositoryを指定します。


(2)ImplementationRepオブジェクトのオブジェクトリファレンスの獲得

  FJ_ImplementationRep_lookup_id()により、サーバアプリケーションのImplementationRepオブジェクトのオブジェクトリファレンスを求めます。


(3)ゲートウェイの登録

  CORBA_BOA_set_impl_dsi()により、サーバアプリケーションが実装するゲートウェイを登録します。

  CORBA_BOA_set_impl_dsi(
      boa, &env, (CORBA_DynamicImplementationRoutine)dsi );

G.3.1.3 サーバの活性化

  サーバアプリケーションの初期化が完了すると、ORBに対してその旨を通知します。ORBは、この命令が発行された時点で、クライアントからの要求をサーバアプリケーションに伝えます。


G.3.1.4 ゲートウェイの処理

  ゲートウェイでは、以下に示す処理を行います。

(1)メソッドの解析

  CORBA_ServerRequest_op_name()により、メソッド名の解析を行います。下の例ではゲートウェイ関数としてstaticな関数を使用していますが、staticである必要はありません。ゲートウェイ関数の第1引数はサーバオブジェクトリファレンス、第2引数はServerRequestオブジェクト、第3引数は例外情報を設定するためのenv構造体です。

  static void
  dsi(
      CORBA_Object         obj, 
      CORBA_ServerRequest  request, 
      CORBA_Environment    *env ) 
  {

      CORBA_Identifier  dsi_op_name; 

      dsi_op_name = CORBA_ServerRequest_op_name(
                         request, 
                         env ); 
      if( strcmp( dsi_op_name, "calculate" ) == 0 ) 
          method_calculate( request, env ); 
      CORBA_free( dsi_op_name ); 
      return; 
  }

(2)パラメタの組立て

リストオブジェクトの生成

  CORBA_ORB_create_list()により、サーバアプリケーションに渡すパラメタを格納するための領域を保持するリストオブジェクト(NVListオブジェクト)を生成します。パラメタとして、何個のパラメタを格納するかを指定します。リストオブジェクトのオブジェクトリファレンスが返されます。

  CORBA_NVList  arg_list; 
  CORBA_ORB_create_list( orb, 2, &arg_list, env );
パラメタリストの設定

  CORBA_NVList_add_item()により、サーバアプリケーションに渡すパラメタをリストオブジェクトに設定します。パラメタには、CORBA_NVListオブジェクトリファレンス、サーバアプリケーションのパラメタの名前、型、値および長さを指定します。

  CORBA_NVList_add_item(
      arg_list, 
      "a", TC_long, NULL, 
      sizeof( CORBA_long ), 
      CORBA_ARG_IN, 
      env ); 

  CORBA_NVList_add_item(
      arg_list, 
      "b", TC_long, NULL, 
      sizeof( CORBA_long ), 
      CORBA_ARG_IN, 
      env );

(3)パラメタの解析

  CORBA_ServerRequest_params()により、パラメタの解析を行います。

  CORBA_ServerRequest_params(
      dsi_request, 
      arg_list, 
      env );

(4)復帰情報の設定

  CORBA_ServerRequest_result()により、復帰情報の設定を行います。

  CORBA_long                  a, b; 
  ODdemo_calculator_result    *res; 
  CORBA_any                   any_value; 

  a = *(long *)(arg_list[0].argument._value ); 
  b = *(long *)(arg_list[1].argument._value ); 

  if( b == 0 ){ 
      CORBA_ServerRequest_exception(
          dsi_request, 
          CORBA_USER_EXCEPTION, 
          ex_ODdemo_calculator_ZEROPARAM, 
          NULL, 
          env ); 
      return; 
  }
  res = ODdemo_calculator_result_alloc();
  res->add_result = a+b; 
  res->subtract_result = a/b; 
  res->multiple_result = a*b; 
  res->divide_result = (CORBA_float)a/b; 

  any_value._type = TC_ODdemo_calculator_result; 
  any_value._value = res; 
  CORBA_ServerRequest_result(
      dsi_request, 
      any_value, 
      env ); 

(5)例外情報の設定

  CORBA_ServerRequest_exception()を発行して、例外情報の設定を行います。


G.3.1.5 サーバの非活性化

  サーバアプリケーションは、利用者などからの停止要求を受けた場合、クライアントからの要求を以降受け付けない旨をORBに対して通知します。ORBはこの通知を受けて、クライアントからの処理要求をサーバアプリケーションに伝えず、クライアントに例外を返します。


G.3.1.6 パラメタの獲得/解放

  動的スケルトンインタフェースを使用して動的にパラメタを作成する方法について説明します。
  パラメタはCORBA_NVList_add_item()で設定します。


inパラメタ

  クライアントアプリケーションからinパラメタを受け取る場合、パラメタ領域の獲得/解放を行う必要はありません。CORBA_NVList_add_item()は以下のように指定します。

  CORBA_NVList_add_item(
        arg_list, 
        name,                /* IDLで指定したパラメタの名前を設定します。 */
        type,                /* パラメタのTypeCodeを設定します。 */
        NULL,                /* NULLを設定します */
        0,                   /* 0を設定します */
        CORBA_ARG_IN,        /* CORBA_ARG_INを設定します */
        &env );

outパラメタ

  サーバアプリケーションの処理結果をoutパラメタでクライアントアプリケーションに渡す場合、各データ領域獲得関数(CORBA_long_alloc()等)で領域を獲得し、そのポインタをCORBA_NVList_add_item()の第4パラメタに指定します。

  CORBA_NVList_add_item(
        arg_list, 
        name,                  /* IDLで指定したパラメタの名前を設定します。 */
        type,                  /* パラメタのTypeCodeを設定します。 */
        &param,                /* パラメタ領域へのポインタを設定します */
        sizeof( CORBA_long ),  /* パラメタのサイズを設定します */
        CORBA_ARG_OUT,         /* CORBA_ARG_OUTを設定します */
        &env );

  獲得した領域は、CORBAサービス内でリクエスト復帰後に解放されます。


inoutパラメタ

  クライアントアプリケーションからinoutパラメタを受け取る場合には、パラメタ領域の獲得/解放を行う必要はありません。CORBA_NVList_add_item()は以下のように指定します。

  CORBA_NVList_add_item(
        arg_list, 
        name,                  /* IDLで指定したパラメタの名前を設定します。 */
        type,                  /* パラメタのTypeCodeを設定します。 */
        NULL,                  /* NULLを設定します */
        0,                     /* 0を設定します */
        CORBA_ARG_INOUT,       /* CORBA_ARG_INOUTを設定します */
        &env );

  サーバアプリケーションの処理結果をinoutパラメタでクライアントアプリケーションに渡す場合は、以下のようにします。

  固定長データの場合

  CORBA_ServerRequest_params()で通知されたパラメタ領域に値を設定します。

  可変長データの場合

  CORBA_ServerRequest_params()で通知されたパラメタ領域を、CORBA_free()でいったん解放した後、データ域獲得関数(CORBA_string_alloc()等)により領域を獲得し、そのポインタを再設定します。受け渡すデータはその領域に設定します。

  inoutパラメタの領域は、リクエスト復帰後にスケルトンで解放されます。


復帰パラメタ

  サーバアプリケーションの処理結果を復帰パラメタ渡す場合、データ域獲得関数(CORBA_long_alloc()等)で領域を獲得します。