(1)IDLマッピング
IDL言語で共用体unionを指定すると、C言語ではデータ型を識別する弁別情報_dと共用体データ域_uから構成される構造体(共用型構造体)にマッピングされます。また、共用型構造体の領域獲得関数(関数名:“モジュール名_インタフェース名_共用体名_alloc”。以降XX_alloc関数と呼ぶ)が生成されます。
共用型構造体の構造を以下に示します。
struct { /* 共用型構造体 */ CORBA_long _d; /* データ型弁別情報 */ union { /* 共用体データ域 */ CORBA_long xxx; : } _u; } ;
以降では、以下のIDL定義例をもとに説明します。
module ODsample{ union samplefix switch(long){ /* 共用体(固定長) */ case 1: long para1; case 2: long para2; }; union samplevar switch(long){ /* 共用体(可変長) */ case 1: long para1; case 2: string para2; }; interface uniontest{ samplefix op2( in samplefix uni1, out samplefix uni2, inout samplefix uni3 ); samplevar op1( in samplevar uni1, out samplevar uni2, inout samplevar uni3 ); }; };
typedef struct ODsample_samplefix { /* 共用型構造体(固定長) */ CORBA_long _d; union { CORBA_long para1; CORBA_long para2; } _u; } ODsample_samplefix; typedef struct ODsample_samplevar{ /* 共用型構造体(可変長) */ CORBA_long _d; union { CORBA_long para1; CORBA_char *para2; } _u; } ODsample_samplevar;
(2)クライアントアプリケーションで扱うパラメタ(固定長)
共用型構造体(固定長)のパラメタ(in、out、inout)を扱う場合、構造体変数をパラメタとして渡します。このとき、弁別情報にデータ型識別値、データ域にデータを設定します。
クライアントアプリケーションでの処理例を以下に示します。
CORBA_Object obj; CORBA_Environment env; ODsample_samplefix unif1, unif2, unif3, ref; /* inパラメタ */ unif1._d = 2; /* 弁別子設定 */ unif1._u.para2 = 'z'; /* パラメタ値設定 */ /* inoutパラメタ */ unif3._d = 2; /* 弁別子設定 */ unif3._u.para2 = 'y'; /* パラメタ値設定 */ /* サーバ呼出し */ ref = ODsample_uniontest_op2( obj, &unif1, &unif2, &unif3, &env );
(3)クライアントアプリケーションで扱うパラメタ(可変長)
クライアントアプリケーションのパラメタの扱いについて以下に示します。
パラメタ | サーバへ渡すパラメタ | サーバから渡されたパラメタ |
---|---|---|
in | 構造体領域/可変長データ域を獲得する場合、XX_alloc関数/データ領域獲得関数を使用します。 | - |
inout | (inパラメタと同じ) | 領域は、スタブで自動的に獲得されます。 |
out | - | (inoutパラメタと同じ) |
注意
クライアントおよびスタブで動的に獲得した領域は、不要になった時点でCORBA_free()で解放する必要があります。CORBA_free()を発行することで可変長データ域も解放されます。
クライアントアプリケーションでの処理例を以下に示します。
ODsample_samplevar *uni1, *uni2, *uni3, *ret; CORBA_Object obj; CORBA_Environment env; /* inパラメタ */ uni1 = ODsample_samplevar_alloc(); /* 領域獲得 */ uni1->_d = 1; /* 弁別子設定 */ uni1->_u.para1 = 10; /* パラメタ設定 */ /* inoutパラメタ */ uni3 = ODsample_samplevar_alloc(); /* 領域獲得 */ uni3->_d = 2; /* 弁別子設定 */ uni3->_u.para2 = CORBA_string_alloc(11); /* パラメタ設定 */ strcpy( uni3->_u.para2, "INOUT:para2" ); /* サーバ呼出し */ ret = ODsample_uniontest_op1( obj, uni1, &uni2, uni3, &env ); /* 領域解放 */ CORBA_free( uni1 ); /* inパラメタ */ CORBA_free( uni2 ); /* outパラメタ */ CORBA_free( uni3 ); /* inoutパラメタ */ CORBA_free( ret ); /* 復帰パラメタ */
(4)サーバアプリケーションで扱うパラメタ(固定長)
共用型構造体(固定長)のパラメタ(in,out,inout)を扱う場合、構造体領域はスケルトンで自動的に獲得/解放されます。
サーバアプリケーションでの処理例を以下に示します。
ODsample_samplefix ODsample_uniontest_op2( CORBA_Object obj, ODsample_samplefix *uni1, ODsample_samplefix *uni2, ODsample_samplefix *uni3, CORBA_Environment *env ) { ODsample_samplefix uni; /* outパラメタ */ uni2->_d = 1; /* 弁別情報設定 */ uni2->_u.para1 = 10; /* データ設定 */ /* inoutパラメタ */ uni3->_d = 2; /* 弁別情報設定 */ uni3->_u.para2 = 'c'; /* データ設定 */ /* 復帰パラメタ */ uni._d = 1; /* 弁別情報設定 */ uni._u.para1 = 100; /* データ設定 */ return( uni ); }
(5)サーバアプリケーションで扱うパラメタ(可変長)
サーバアプリケーションのパラメタの扱いについて以下に示します。
パラメタ | クライアントからのパラメタ領域 | クライアントへのパラメタ領域 |
---|---|---|
in | 構造体領域/可変長データ域は、スケルトンで自動的に獲得/解放されます。 | - |
inout | 構造体領域/可変長データ域は、スケルトンで自動的に獲得されます。 | CORBA_free()で可変長データ域を一度解放し、データ域獲得関数で再獲得します。 |
out | - | XX_alloc関数/データ域獲得関数で構造体/可変長データ域を獲得します。 |
サーバアプリケーションでの処理例を以下に示します。
ODsample_samplevar *ODsample_uniontest_op1( ODsample_uniontest obj, ODsample_samplevar *uni1, ODsample_samplevar **uni2, ODsample_samplevar *uni3, CORBA_Environment *env ) { ODsample_samplevar *uni; /* outパラメタ */ *uni2 = ODsample_samplevar_alloc(); /* 領域獲得 */ (*uni2)->_d = 2; /* 弁別情報設定 */ (*uni2)->_u.para2 = CORBA_string_alloc(9); /* データ設定 */ strcpy( (*uni2)->_u.para2, "OUT:param" ); /* inoutパラメタ */ if( uni3->_d == 2 ) /* 弁別情報 */ CORBA_free( uni3->_u.para2 ); uni3->_d = 1; /* 弁別情報設定 */ uni3->_u.para1 = 10; /* データ設定 */ /* 復帰パラメタ */ uni = ODsample_samplevar_alloc(); /* 領域獲得 */ uni->_d = 1; /* 弁別情報設定 */ uni->_u.para1 = 30; /* データ設定 */ return( uni ); }