| Interstage Application Server アプリケーション作成ガイド (CORBAサービス編) |
目次
索引
![]()
|
| 第1部 アプリケーション開発(基本編) | > 第3章 アプリケーションの開発(C言語) | > 3.7 データ型に対するマッピング |
IDL言語でシーケンス型sequenceを指定した場合、C言語では以下の構造体(シーケンス構造体)にマッピングされます。また、シーケンス構造体の領域獲得関数(関数名は“モジュール名_インタフェース名_構造体名_alloc”。以降XX_alloc関数と呼ぶ)と、データ域(_buffer)の領域獲得関数(関数名は“モジュール名_インタフェース名_構造体名_allocbuf”。以降XX_allocbuf関数と呼ぶ)が生成されます。
シーケンス構造体の構造を以下に示します。
struct
{
CORBA_unsigned_long _maximum; /* シーケンス配列の最大個数 */
CORBA_unsigned_long _length; /* シーケンス配列の使用個数 */
void *_buffer; /* データ域 */
};
以降では、以下のIDL定義例をもとに説明します。
module ODsample{
interface seqtest{
typedef sequence<long> sampleseq;
sampleseq op1(in sampleseq seq1, out sampleseq seq2, inout sampleseq seq3 );
};
};
typedef struct
{
CORBA_unsigned_long _maximum;
CORBA_unsigned_long _length;
CORBA_long *_buffer;
} sampleseq;
クライアントアプリケーションのパラメタの扱いについて、以下に示します。
|
パラメタ |
サーバへ渡すパラメタ |
サーバから渡されたパラメタ |
|
in |
シーケンス構造体/データ域(_buffer)を獲得する場合、XX_alloc関数/XX_allocbuf関数を使用します。 |
− |
|
inout |
シーケンス構造体/データ域(_buffer)を獲得する場合、XX_alloc関数/XX_allocbuf関数を使用します。 リリースフラグにCORBA_TRUEが設定されているとデータ部の領域はスタブにより解放されます。 |
領域はスタブで自動的に獲得されます(各メンバも設定されます)。 |
|
out |
− |
領域はスタブで自動的に獲得されます(各メンバも設定されます)。この際、リリースフラグにCORBA_TRUEが設定されます。 |
クライアントおよびスタブで獲得した領域は、不要になった時点でCORBA_free()で解放する必要があります。このとき、データ域の領域(XX_allocbuf関数で獲得)を解放するかどうかを、リリースフラグで指定します。
リリースフラグの参照と設定は、以下の関数/フラグを使用します。
[関数] CORBA_boolean CORBA_sequence_get_release( void * );
void CORBA_sequence_set_release( void *, CORBA_boolean );
[フラグ] CORBA_TRUE : CORBA_free()発行時、シーケンスデータ領域も解放される。
CORBA_FALSE: CORBA_free()発行時、シーケンスデータ領域は解放されない。
(デフォルト)
なお、スタブで獲得されたパラメタ(out,復帰)のリリースフラグは、CORBA_TRUEに設定されます。
ただし、シーケンス型またはany型のsequenceをin/inoutに使用する場合、XX_allocbuf関数で獲得したシーケンス型またはany型の領域に対して、リリースフラグにCORBA_TRUEを設定してください。また、out/inout/復帰値に使用する場合、シーケンス型の_bufferの型がシーケンス型またはany型の場合、かつ_bufferがNULLでない場合、CORBA_free()で領域を解放する前に_buffer領域に対して、リリースフラグにCORBA_TRUEを設定してください。
以下にクライアントアプリケーションでの処理例を示します。
ODsample_seqtest_sampleseq *seq1, *seq2, *seq3, *ret;
CORBA_Object obj;
CORBA_Environment env;
CORBA_long *smp;
int i;
/* inパラメタ */
seq1 = ODsample_seqtest_sampleseq_alloc(); /* 領域獲得 */
seq1->_maximum = seq1->_length = 2;
seq1->_buffer = ODsample_seqtest_sampleseq_allocbuf(2);
for( i = 0; i < 2; i++ ){
smp = &(seq1->_buffer[i]);
*smp = i;
}
CORBA_sequence_set_release( seq1, CORBA_TRUE ) ; /* リリースフラグ設定 */
/* inoutパラメタ */
seq3 = ODsample_seqtest_sampleseq_alloc();
seq3->_maximum = seq3->_length = 3;
seq3->_buffer = ODsample_seqtest_sampleseq_allocbuf(3);
for( i = 0; i < 3; i++ ){
smp = &(seq3->_buffer[i]);
*smp = i*10;
}
CORBA_sequence_set_release( seq3, CORBA_TRUE ) ; /* リリースフラグ設定 */
/* サーバ呼出し */
ret = ODsample_seqtest_op1( obj, seq1, &seq2, seq3, &env );
/* 領域解放 */
CORBA_free( seq1 ); /* inパラメタ */
CORBA_free( seq2 ); /* outパラメタ */
CORBA_free( seq3 ); /* inoutパラメタ */
CORBA_free( ret ); /* 復帰パラメタ */
サーバアプリケーションのパラメタの扱いについて、以下に示します。
|
パラメタ |
クライアントから渡されたパラメタ |
クライアントへ渡すパラメタ |
|
in |
各領域(シーケンス構造体/データ域)はスケルトンで自動的に獲得/解放されます。 |
− |
|
inout |
各領域(シーケンス構造体/データ域)はスケルトンで自動的に獲得されます。この際、リリースフラグにCORBA_TRUEが設定されます。 |
inoutデータの領域を更新する場合には、以下の処理を実施してください。 リリースフラグにCORBA_TRUEを設定する、またはリリースフラグを設定しない場合、領域はスケルトンで自動的に解放されます。 |
|
out |
− |
シーケンス構造体/データ域(_buffer)をXX_alloc関数/XX_allocbuf 関数で獲得します。 リリースフラグにCORBA_TRUEを設定する場合、領域はスケルトンで自動的に解放されます。 |
以下にサーバアプリケーションでの処理例を示します。
ODsample_seqtest_sampleseq
*ODsample_seqtest_op1(
ODsample_seqtest obj,
ODsample_seqtest_sampleseq *seq1,
ODsample_seqtest_sampleseq **seq2,
ODsample_seqtest_sampleseq *seq3,
CORBA_Environment *env )
{
ODsample_seqtest_sampleseq *seq;
CORBA_long *smp;
int i;
/* outパラメタ */
seq = *seq2 = ODsample_seqtest_sampleseq_alloc(); /* 領域獲得 */
seq->_maximum = seq->_length = 4; /* メンバ設定 */
seq->_buffer = ODsample_seqtest_sampleseq_allocbuf(4); /* データ域獲得 */
for( i = 0; i < 4; i++ ) {
smp = &(seq->_buffer[i]);
*smp = i*100;
}
CORBA_sequence_set_release( *seq2, CORBA_TRUE ); /* リリースフラグ設定 */
/* inoutパラメタ */
seq3->_maximum = seq3->_length = 5;
CORBA_free( seq3->_buffer ); /* 領域解放(データ域) */
seq3->_buffer = ODsample_seqtest_sampleseq_allocbuf(5); /* 領域再獲得(データ域) */
for( i = 0; i < 5; i++ ) { /* パラメタ設定 */
smp = &(seq3->_buffer[i]);
*smp = i*1000;
}
CORBA_sequence_set_release( seq3, CORBA_TRUE ); /* リリースフラグ設定 */
/* 復帰パラメタ */
seq = ODsample_seqtest_sampleseq_alloc(); /* 領域獲得 */
seq->_maximum = seq->_length = 6; /* メンバ設定 */
seq->_buffer = ODsample_seqtest_sampleseq_allocbuf(6); /* データ域獲得 */
for( i = 0; i < 6; i++ ) {
smp = &(seq->_buffer[i]);
*smp = i*10000;
}
CORBA_sequence_set_release( seq, CORBA_TRUE ); /* リリースフラグ設定 */
return( seq );
}
目次
索引
![]()
|