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

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

4.7.7 共用体

(1)IDLマッピング

 IDL言語で共用体unionを指定すると、C言語ではデータ型を識別する弁別情報_dと共用体データ域_uから構成される構造体(共用型構造体)にマッピングされます。また、共用型構造体の領域獲得関数(関数名は"モジュール名_インタフェース名_共用体名_alloc"。以降XX_alloc関数と呼ぶ)が生成されます。
 共用型構造体の構造を以下に示します。

  struct {                         /* 共用型構造体 */
      CORBA_long  _d;              /* データ型弁別情報 */
      union {                      /* 共用体データ域 */
          CORBA_long    xxx; 
           :
      } _u;
  } ;

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

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

C言語

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

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

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