ページの先頭行へ戻る
Interstage Application Server アプリケーション作成ガイド(CORBAサービス編)
Interstage

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