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

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