Interstage Application Server アプリケーション作成ガイド (CORBAサービス編)
目次 索引 前ページ次ページ

第4章 アプリケーションの開発(C言語)> 4.7 データ型に対するマッピング

4.7.5 シーケンス型

(1)IDLマッピング

 IDL言語でシーケンス型sequenceを指定した場合、C言語では以下の構造体(シーケンス構造体)にマッピングされます。また、シーケンス構造体の領域獲得関数(関数名は"モジュール名_インタフェース名_構造体名_alloc"。以降XX_alloc関数と呼ぶ)と、データ域(_buffer)の領域獲得関数(関数名は"モジュール名_インタフェース名_構造体名_allocbuf"。以降XX_allocbuf関数と呼ぶ)が生成されます。
 シーケンス構造体の構造を以下に示します。

  struct
  {
      CORBA_unsigned_long    _maximum;    /* シーケンス配列の最大個数 */
      CORBA_unsigned_long    _length;     /* シーケンス配列の使用個数 */
      void                   *_buffer;    /* データ域 */
  }; 

 以降では、以下のIDL定義例をもとに説明します。

IDL言語

  module ODsample{
      interface  seqtest{
          typedef sequence<long>  sampleseq; 
          sampleseq op1(in sampleseq seq1, out sampleseq seq2, inout sampleseq seq3 );
      };
  };

C言語

  typedef struct
  {
      CORBA_unsigned_long    _maximum; 
      CORBA_unsigned_long    _length;  
      CORBA_long             *_buffer; 
  } sampleseq;

(2)クライアントアプリケーションで扱うパラメタ

 クライアントアプリケーションのパラメタの扱いについて、以下に示します。

パラメタ

サーバへ渡すパラメタ

サーバから渡されたパラメタ

in

シーケンス構造体/データ域(_buffer)を獲得する場合、XX_alloc関数/XX_allocbuf関数を使用します。
メンバにシーケンス配列の最大個数/使用個数/データ域アドレスを設定します。

inout

シーケンス構造体/データ域(_buffer)を獲得する場合、XX_alloc関数/XX_allocbuf関数を使用します。
メンバにシーケンス配列の最大個数/使用個数/データ域アドレスを設定します。

リリースフラグにCORBA_TRUEが設定されているとデータ部の領域はスタブにより解放されます。
リリースフラグに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 );              /* 復帰パラメタ */

(3)サーバアプリケーションで扱うパラメタ

 サーバアプリケーションのパラメタの扱いについて、以下に示します。

パラメタ

クライアントから渡されたパラメタ

クライアントへ渡すパラメタ

in

各領域(シーケンス構造体/データ域)はスケルトンで自動的に獲得/解放されます。
データ域(_buffer)がシーケンス型またはany型の場合、かつ_bufferがNULLでない場合、_buffer領域に対して、リリースフラグにCORBA_TRUEを設定してください。

inout

各領域(シーケンス構造体/データ域)はスケルトンで自動的に獲得されます。この際、リリースフラグにCORBA_TRUEが設定されます。
データ域(_buffer)がシーケンス型またはany型の場合、かつ_bufferがNULLでない場合、inの領域を解放する前に、_buffer領域に対して、リリースフラグにCORBA_TRUEを設定してください。

inoutデータの領域を更新する場合には、以下の処理を実施してください。
データ域(_buffer)をCORBA_free()で一度解放し、XX_allocbuf関数で再獲得します。
データ域(_buffer)がシーケンス型またはany型の場合は、XX_allocbuf関数で獲得した領域に対してリリースフラグにCORBA_TRUEを設定してください。

リリースフラグにCORBA_TRUEを設定する、またはリリースフラグを設定しない場合、領域はスケルトンで自動的に解放されます。
リリースフラグにCORBA_FALSEを設定する場合、スケルトンではデータ域の解放を行いません。この場合、不要になった時点で領域の解放処理を実施してください。

out
復帰

シーケンス構造体/データ域(_buffer)をXX_alloc関数/XX_allocbuf 関数で獲得します。
データ域(_buffer)がシーケンス型またはany型の場合は、XX_allocbuf関数で獲得した領域に対してリリースフラグにCORBA_TRUEを設定してください。

リリースフラグにCORBA_TRUEを設定する場合、領域はスケルトンで自動的に解放されます。
リリースフラグにCORBA_FALSEを設定する、またはリリースフラグを設定しない場合、スケルトンではデータ域の解放を行いません。この場合、不要になった時点で領域の解放処理を実施してください。

 以下にサーバアプリケーションでの処理例を示します。

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

目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005