CORBAの初期化メソッドCORBA_ORB_init()を呼び出し、初期化処理を行います。結果として、ORBのオブジェクトリファレンスが返されます。このオブジェクトリファレンスは、以降で呼び出すORBインタフェースを使用する場合に指定します。
また、基本オブジェクトアダプタの初期化処理を行います。
サーバアプリケーションが実装するゲートウェイを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 );
サーバアプリケーションの初期化が完了すると、ORBに対してその旨を通知します。ORBは、この命令が発行された時点で、クライアントからの要求をサーバアプリケーションに伝えます。
ゲートウェイでは、以下に示す処理を行います。
メソッドの解析
パラメタの組立て
パラメタの解析
処理部の起動
復帰情報の設定
例外情報の設定
(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()を発行して、例外情報の設定を行います。
サーバアプリケーションは、利用者などからの停止要求を受けた場合、クライアントからの要求を以降受け付けない旨をORBに対して通知します。ORBはこの通知を受けて、クライアントからの処理要求をサーバアプリケーションに伝えず、クライアントに例外を返します。
動的スケルトンインタフェースを使用して動的にパラメタを作成する方法について説明します。
パラメタは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を設定します。 */ ¶m, /* パラメタ領域へのポインタを設定します */ 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()等)で領域を獲得します。