| Interstage Application Server アプリケーション作成ガイド (CORBAサービス編) |
目次
索引
![]()
|
| 第4章 アプリケーションの開発(C言語) | > 4.7 データ型に対するマッピング |
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;
共用型構造体(固定長)のパラメタ(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 );
クライアントアプリケーションのパラメタの扱いについて、以下に示します。
|
パラメタ |
サーバへ渡すパラメタ |
サーバから渡されたパラメタ |
|
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 ); /* 復帰パラメタ */
共用型構造体(固定長)のパラメタ(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 );
}
サーバアプリケーションのパラメタの扱いについて、以下に示します。
|
パラメタ |
クライアントからのパラメタ領域 |
クライアントへのパラメタ領域 |
|
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 );
}
目次
索引
![]()
|