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

第7章 アプリケーションの開発(COBOL)> 7.5 データ型に対するマッピング

7.5.3 any型

(1)IDLマッピング

 IDL言語でany型を指定した場合、COBOLでは集団項目として以下の要素(ANY-TYPE, ANY-VALUE)をPOINTERで宣言します。また、データ域(ANY-VALUE)の獲得関数(関数名は"モジュール名-インタフェース名-構造体名-ALLOC"。以降XX-ALLOC関数と呼ぶ)がIDLコンパイラで生成されます。

   CORBA-ANY. 
  * データ型を識別するTypeCode情報
   49  ANY-TYPE   USAGE POINTER. 
  * データ域
   49  ANY-VALUE  USAGE POINTER.

 以降では、以下の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

ANY-TYPEにTypeCode情報("TC-モジュール名-インタフェース名-データ名-IMPL-SEQ"、IDLファイル名_h.cblで定義)を、ANY-VALUEにデータ域(XX-ALLOC関数で獲得)のポインタを設定します。

領域(CORBA-ANY/ANY-VALUE域)を動的に獲得する場合、CORBA-ANY-ALLOC関数/XX-ALLOC関数を用います。

inout

(inパラメタと同じ)

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

out
復帰値

(inoutパラメタと同じ)

注意事項

 クライアントおよびスタブで獲得した領域は、不要になった時点でCORBA-FREE関数で解放する必要があります。このとき、ANY-VALUEの指す領域を解放するかどうかを、リリースフラグで指定できます。

 リリースフラグの参照と設定は、以下の関数/フラグを使用します。

[関数]
  CALL "CORBA-ANY-GET-RELEASE" USING
        BUFFER
        RET-VAL.
  CALL "CORBA-ANY-SET-RELEASE" USING 
        BUFFER
        CORBA-TRUE-VALUE.
[フラグ]
  CORBA-TRUE-VALUE : CORBA-FREE関数発行時、ANY-VALUEの指す領域も解放される
  CORBA-FALSE-VALUE: CORBA-FREE関数発行時、ANY-VALUEの指す領域は解放されない(デフォルト)

 なお、スタブで獲得されたoutパラメタ、復帰値のリリースフラグは、CORBA-TRUE-VALUEに設定されます。

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

   ENVIRONMENT DIVISION. 
   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
   COPY CONST IN CORBA. 
    01 COPY ORB IN CORBA REPLACING CORBA-ORB BY ORB. 
    01 COPY ANY IN CORBA REPLACING CORBA-ANY BY SMP1. 
    01 COPY ENVIRONMENT IN CORBA REPLACING CORBA-ENVIRONMENT BY ENV. 
    01 COPY LONG IN CORBA REPLACING CORBA-LONG BY LSIZE. 
    01 COPY LONG IN CORBA REPLACING CORBA-LONG BY T-LONG. 
    01 TYPE-P USAGE POINTER. 
    01 TC-ODSAMPLE-SAMPLE2-IMPL-SEQ. 
       03MEMBER1 PIC X(100) VALUE "69,69,0,0,0,0,15,4,0,8,0,25,73,68,76,58,79,68, 
                             115,97,109,112,108,101,47,115,97,109,112,108,101,50,58".
       03 MEMBER2 PIC X(100) VALUE ",49,46,48,0,0,8,115,97,109,112,108,101,50,0,0,2, 
                             0,6,112,97,114,97,49,0,0,1,9,0,6,112,97,114,97,50,0,". 
       03 MEMBER3 PIC X(100) VALUE "0,1,6".
    01 TC-ODSAMPLE-SAMPLE3-IMPL-SEQ. 
       03 MEMBER1 PIC X(100) VALUE "69,69,0,0,0,0,15,8,0,16,0,25,73,68,76,58,79,68, 
                              115,97,109,112,108,101,47,115,97,109,112,108,101,51,5".
       03 MEMBER2 PIC X(100) VALUE "8,49,46,48,0,0,8,115,97,109,112,108,101,51,0,0, 
                              2,0,6,112,97,114,97,49,0,0,1,9,0,6,112,97,114,97,50,0".
       03 MEMBER3 PIC X(100) VALUE ",0,1,7".
    01 COPY ANY IN CORBA REPLACING CORBA-ANY BY ANY1.
    01 ANY2 USAGE POINTER.
    01 ANY3 USAGE POINTER.
    01 ANY0 USAGE POINTER.
   LINKAGE SECTION. 
    01 SMP2.
       02 COPY CHAR IN CORBA REPLACING CORBA-CHAR BY PARA1.
       02 COPY FLOAT IN CORBA REPLACING CORBA-FLOAT BY PARA2.
    01 SMP3.
       02 COPY CHAR IN CORBA REPLACING CORBA-CHAR BY PARA1.
       02 COPY DOUBLE IN CORBA REPLACING CORBA-DOUBLE BY PARA2.
    01 COPY ANY IN CORBA REPLACING CORBA-ANY BY ANY2-P. 
    01 COPY ANY IN CORBA REPLACING CORBA-ANY BY ANY3-P. 
    01 COPY ANY IN CORBA REPLACING CORBA-ANY BY ANY0-P. 

  PROCEDURE DIVISION. 

  *TypeCodeの設定
  MOVE FUNCTION LENG (TC-ODSAMPLE-SAMPLE3-IMPL-SEQ) TO T-LONG. 
    CALL "CORBA-STRING-SET" USING
        TYPE-P
        T-LONG
        TC-ODSAMPLE-SAMPLE3-IMPL-SEQ. 
    CALL "CORBA-ORB-TYPECODE-FROM-CGEN-TC" USING
        TYPE-P
        ANY-TYPE OF ANY1. 
    CALL "CORBA-FREE" USING
        TYPE-P. 

    CALL "ODSAMPLE-SAMPLE3-ALLOC" USING
        ANY-VALUE OF ANY1. 
    SET ADDRESS OF SMP3 TO ANY-VALUE OF ANY1. 
  *入力用パラメタの設定
    MOVE "a" TO PARA1 OF SMP3. 
  *入力用パラメタの設定
    MOVE 0.00001 TO PARA2 OF SMP3. 

  *入出力パラメタ用領域の獲得
    CALL "CORBA-ANY-ALLOC" USING
        ANY3. 
    SET ADDRESS OF ANY3-P TO ANY3. 
  *TypeCodeの設定
    MOVE FUNCTION LENG (TC-ODSAMPLE-SAMPLE2-IMPL-SEQ) TO T-LONG. 
    CALL "CORBA-STRING-SET" USING
        TYPE-P
        T-LONG
        TC-ODSAMPLE-SAMPLE2-IMPL-SEQ. 
    CALL "CORBA-ORB-TYPECODE-FROM-CGEN-TC" USING
        TYPE-P
        ANY-TYPE OF ANY3-P. 
    CALL "CORBA-FREE" USING
        TYPE-P. 

    CALL "ODSAMPLE-SAMPLE2-ALLOC" USING
        ANY-VALUE OF ANY3-P. 
    SET ADDRESS OF SMP2 TO ANY-VALUE OF ANY3-P. 
  *入出力用パラメタの設定
    MOVE "c" TO PARA1 OF SMP2. 
  *入出力用パラメタの設定
    MOVE 0.0001 TO PARA2 OF SMP2. 

    CALL "ODSAMPLE-ANYTEST-OP1" USING
        OBJ
        ANY1
        ANY2
        ANY3
        ENV
        ANY0. 
  *復帰値の領域解放
    CALL "CORBA-FREE" USING 
        ANY0. 
  *入力パラメタの領域解放
    CALL "CORBA-FREE" USING
        ANY-VALUE OF ANY1. 
  *出力パラメタの領域解放
    CALL "CORBA-FREE" USING 
        ANY2. 
  *入出力パラメタの領域解放
    CALL "CORBA-FREE" USING 
        ANY3.

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

Copyright 2006 FUJITSU LIMITED