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

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

4.7.4 any型

(1)IDLマッピング

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

  typedef struct any {
      CORBA_TypeCode    _type;      /* データ型識別情報(TypeCode) */
      void              *_value;    /* データ域 */
  } CORBA_any; 

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

IDL言語

  module ODsample{
      struct sample1 {
          long    para1; 
          string  para2; 
      };
      struct sample2 {
          char    para1; 
          float   para2; 
      };
      struct sample3 {
          char    para1; 
          double  para2; 
      };
      interface   anytest{
          any     op1(in any any1, out any any2, inout any any3 ); 
      };
  };

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

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

パラメタ

サーバへ渡すパラメタ

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

in

領域(CORBA_any構造体/_value域)を動的に獲得する場合は、CORBA_any_alloc()/XX_alloc関数を使用します。

inout

(inパラメタと同じ)

領域はスタブで自動的に獲得されます。

out
復帰

(inoutパラメタと同じ)

注意事項

 クライアントおよびスタブで獲得した領域は、不要になった時点でCORBA_free()で解放する必要があります。このとき_valueの指す領域を解放するかどうかを、リリースフラグで指定できます。
 リリースフラグの参照と設定は、以下の関数/フラグを使用します。

  [関数]   CORBA_boolean CORBA_any_get_release( CORBA_any * );
           void          CORBA_any_set_release( CORBA_any *, CORBA_boolean );
  [フラグ] CORBA_TRUE  :CORBA_free()発行時、_valueの指す領域も解放される
           CORBA_FALSE :CORBA_free()発行時、_valueの指す領域は解放されない(デフォルト)

 なお、スタブで獲得されたパラメタ(out,復帰)のリリースフラグは、CORBA_TRUEに設定されます。

 以下にクライアントアプリケーションの処理例を示します。

      CORBA_any            *any1, *any2, *any3, *ret; 
      CORBA_Object         obj; 
      CORBA_Environment    env; 
      ODsample_sample1     *smp1; 
      ODsample_sample2     *smp2; 
      ODsample_sample3     *smp3; 

  /* inパラメタ */
      any1 = CORBA_any_alloc();              /* 領域獲得 */
      any1->_type = TC_ODsample_sample3;     /* TypeCode設定 */
      smp3 = any1->_value = ODsample_sample3_alloc();
      smp3->para1 = 'a'; 
      smp3->para2 = 0.00001;

  /* inoutパラメタ */
      any3 = CORBA_any_alloc();              /* 領域獲得 */
      any3->_type = TC_ODsample_sample2;     /* TypeCode設定 */
      smp2 = any3->_value = ODsample_sample2_alloc();
      smp2->para1 = 'c';
      smp2->para2 = 0.0001;

  /* サーバ呼出し */
      ret = ODsample_anytest_op1( obj, any1, &any2, any3, &env ); 

  /* 領域解放 */
      CORBA_free( any1 );             /* inパラメタ */
      CORBA_free( any2 );             /* outパラメタ */
      CORBA_free( any3 );             /* inoutパラメタ */
      CORBA_free( ret );              /* 復帰パラメタ */

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

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

パラメタ

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

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

in

各領域(CORBA_any構造体/データ域)はスケルトンで自動的に獲得/解放されます。

inout

各領域(CORBA_any構造体/データ域)はスケルトンで自動的に獲得されます。

データ域(_value)をCORBA_free()で一度解放し、XX_alloc関数で再獲得します。
領域はスケルトンで自動的に解放されます。

out
復帰

CORBA_any構造体/データ域(_value)をCORBA_any_alloc()/XX_alloc関数で獲得します。
領域はスケルトンで自動的に解放されます。

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

  CORBA_any 
  *ODsample_anytest_op1(
      ODsample_anytest   obj, 
      CORBA_any          *any1, 
      CORBA_any          **any2, 
      CORBA_any          *any3, 
      CORBA_Environment  *env ) 
  {
      CORBA_any  *p; 
      ODsample_sample1   *smp1; 
      ODsample_sample2   *smp2; 
      ODsample_sample3   *smp3; 
    
  /* outパラメタ */
      p = *any2 = CORBA_any_alloc();                   /* 領域獲得 */
      p->_type = TC_ODsample_sample2;                  /* TypeCode設定 */
      smp2 = p->_value = ODsample_sample2_alloc();     /* データ域獲得 */
      smp2->para1 = 'x';                               /* パラメタ設定 */
      smp2->para2 = 0.001;
      CORBA_any_set_release( p, CORBA_TRUE );          /* リリースフラグ設定 */

  /* inoutパラメタ */
      any3->_type = TC_ODsample_sample3;               /* TypeCodeの設定 */
      CORBA_free( any3->_value );                      /* 領域解放(データ域) */
      smp3 = any3->_value = ODsample_sample3_alloc();  /* 領域再獲得(データ域) */
      smp3->para1 = 'y';                               /* パラメタ設定 */
      smp3->para2 = 0.0001; 

  /* 復帰パラメタ */
      p = CORBA_any_alloc();                           /* 領域獲得 */
      p->_type = TC_ODsample_sample1;                  /* TypeCode設定 */ 
      smp1 = p->_value = ODsample_sample1_alloc();     /* データ域獲得 */
      smp1->para1 = 300;                               /* パラメタ設定 */
      smp1->para2 = CORBA_string_alloc(4); 
      strcpy( smp1->para2, "test" ); 
      CORBA_any_set_release( p, CORBA_TRUE );          /* リリースフラグ設定 */
      return( p ); 
  }

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

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