インタフェースリポジトリには、IDLで定義されたモジュール名、インタフェース名、オペレーション名、パラメタが階層構造で格納されます。サーバアプリケーションの情報を獲得するため、以下の手順で検索します。
(1)InterfaceDefオブジェクトリファレンスの獲得
インタフェースリポジトリからサーバアプリケーションの情報を獲得するためには、InterfaceDefオブジェクトのオブジェクトリファレンスが必要となります。このため、サーバアプリケーションのオブジェクト名をパラメタとして、ネーミングサービスからサーバアプリケーションのオブジェクトリファレンスを求め、その後、CORBA_Object_get_interface()により、InterfaceDefオブジェクトリファレンスを獲得します。
CORBA_Object obj; /* サーバアプリケーションのオブジェクトリファレンス */
CosNaming_Name name; /* 検索したい情報格納域 */
CORBA_InterfaceDef intf; /* InterfaceDefオブジェクトリファレンス */
name._length = name._maximum = 1; /* オブジェクト名の数 */
name._buffer = &name_component; /* オブジェクト名格納域 */
name_component.id = "ODdemo::calculator"; /* オブジェクト名 */
name_component.kind = ""; /* オブジェクトのタイプ */
/* サーバアプリケーションのオブジェクトリファレンスを獲得 */
obj = CosNaming_NamingContext_resolve (
cos_naming,
&name,
&env );
/* InterfaceDefオブジェクトリファレンス取得 */
intf = CORBA_Object_get_interface(obj, &env);(2)OperationDefオブジェクトリファレンスの獲得
CORBA_InterfaceDef_lookup_name()により、指定されたメソッドをインタフェースリポジトリから検索します。パラメタとしてサーバアプリケーションのメソッド名を指定します。結果として、指定したメソッド情報が格納されているOperationDefオブジェクトのオブジェクトリファレンスが返されます。
CORBA_ContainedSeq *intf_opr;
/* メソッドのOperationDefオブジェクトリファレンス取得 */
intf_opr = CORBA_InterfaceDef_lookup_name(
intf,
"calculate",
-1,
CORBA_dk_Operation, /* Operation情報の取得 */
CORBA_FALSE,
&env );(3)パラメタ情報の獲得
CORBA_OperationDef_describe()により、サーバアプリケーションがもっているメソッドのパラメタの情報(パラメタの名前、個数、パラメタの型など)をインタフェースリポジトリから検索します。パラメタとして、OperationDefオブジェクトリファレンスを指定します。
/* OperationDefオブジェクトが保持しているパラメタ情報の構造体 */ CORBA_Contained_Description *description; /* パラメタ情報の構造体の取得 */ description = CORBA_OperationDef_describe( intf_opr->_buffer[0], &env );