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