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

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

7.8.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.

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

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

パラメタ

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

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

in

各領域(CORBA-ANY/ANY-VALUE域)はスケルトンで自動的に獲得/解放されます。

inout

各領域(CORBA-ANY/ANY-VALUE域)はスケルトンで自動的に獲得されます。

ANY-VALUE域をCORBA-FREE関数で一度解放し、XX-ALLOC関数で再獲得します。
領域はスケルトンで自動的に解放されます。

out
復帰値

各領域(CORBA-ANY/ANY-VALUE域)をCORBA-ANY-ALLOC関数/XX-ALLOC関数で獲得します。
領域はスケルトンで自動的に解放されます。

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

   IDENTIFICATION DIVISION. 
   PROGRAM-ID. "ODSAMPLE-ANYTEST-OP1".
   ENVIRONMENT DIVISION. 
   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
   COPY CONST IN CORBA. 
    01 COPY LONG IN CORBA REPLACING CORBA-LONG BY T-LONG. 
    01 TYPE-P USAGE POINTER. 
    01 COPY LONG IN CORBA REPLACING CORBA-LONG BY LSIZE. 
    01 STR-WORK PIC X(20). 
    01 TC-ODSAMPLE-SAMPLE1-IMPL-SEQ. 
       03 MEMBER1 PIC X(100) VALUE "71,71,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,49,58".
       03 MEMBER2 PIC X(100) VALUE ",49,46,48,0,0,8,115,97,109,112,108,101,49,0,0,2, 
          0,6,112,97,114,97,49,0,0,1,3,0,6,112,97,114,97,50,0,". 
       03 MEMBER3 PIC X(100) VALUE "0,3,18,0,0".
    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".

   LINKAGE SECTION. 
    01 COPY ORB IN CORBA REPLACING CORBA-ORB BY ORB. 
    01 SMP1.
       02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1.
       02 PARA2 USAGE IS POINTER.
    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 SMP2 USAGE POINTER. 
    01 COPY ENVIRONMENT IN CORBA REPLACING CORBA-ENVIRONMENT BY ENV. 
    01 COPY ANY IN CORBA REPLACING CORBA-ANY BY ANY1. 
    01 ANY2 USAGE POINTER. 
    01 COPY ANY IN CORBA REPLACING CORBA-ANY BY ANY2-P. 
    01 ANY3 USAGE POINTER. 
    01 COPY ANY IN CORBA REPLACING CORBA-ANY BY ANY3-P. 
    01 ANY0 USAGE POINTER. 
    01 COPY ANY IN CORBA REPLACING CORBA-ANY BY ANY0-P. 

  PROCEDURE DIVISION OBJ ANY1 ANY2 ANY3 ENV ANY0.

  MAIN. 

  *outパラメタ用領域の獲得
    CALL "CORBA-ANY-ALLOC"  USING
        ANY2. 
    SET ADDRESS OF ANY2-P TO ANY2. 
  *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 ANY2-P. 
    CALL "CORBA-FREE" USING
        TYPE-P. 
  *出力用パラメタデータ領域の獲得
    CALL "ODSAMPLE-SAMPLE2-ALLOC" USING
        ANY-VALUE OF ANY2-P. 
    SET ADDRESS OF SMP2 TO ANY-VALUE OF ANY2-P. 
  *出力パラメタの設定
    MOVE "x" TO PARA1 OF SMP2. 
  *出力パラメタの設定
    MOVE 0.001 TO PARA2 OF SMP2. 
    CALL "CORBA-ANY-SET-RELEASE" USING
        ANY2
        CORBA-TRUE-VALUE. 

  *inoutパラメタの処理
    SET ADDRESS OF ANY3-P TO ANY3.
    CALL "CORBA-FREE" USING ANY-VALUE OF ANY3-P.
    CALL "CORBA-ANY-SET-RELEASE" USING
        ANY3
        CORBA-TRUE-VALUE.
  *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 ANY3-P. 
    CALL "CORBA-FREE" USING
        TYPE-P. 
    CALL "ODSAMPLE-SAMPLE3-ALLOC" USING
        ANY-VALUE OF ANY3-P. 
    SET ADDRESS OF SMP3 TO ANY-VALUE OF ANY3-P. 
    MOVE "y" TO PARA1 OF SMP3. 
    MOVE 0.0001 TO PARA2 OF SMP3. 

  *復帰値の処理
    CALL "CORBA-ANY-ALLOC" USING ANY0.
    SET ADDRESS OF ANY0-P TO ANY0.

    MOVE FUNCTION LENG (TC-ODSAMPLE-SAMPLE1-IMPL-SEQ) TO T-LONG. 
    CALL "CORBA-STRING-SET" USING
        TYPE-P
        T-LONG
        TC-ODSAMPLE-SAMPLE1-IMPL-SEQ. 
    CALL "CORBA-ORB-TYPECODE-FROM-CGEN-TC" USING
        TYPE-P
        ANY-TYPE OF ANY0-P. 
    CALL "CORBA-FREE" USING
        TYPE-P. 

    CALL "ODSAMPLE-SAMPLE1-ALLOC" USING
        ANY-VALUE OF ANY0-P. 
    SET ADDRESS OF SMP1 TO ANY-VALUE OF ANY0-P. 
    MOVE 300 TO PARA1 OF SMP1. 
    MOVE 5 TO LSIZE. 
    MOVE "test" TO STR-WORK. 
    CALL "CORBA-STRING-SET" USING
        PARA2 OF SMP1
        LSIZE
        STR-WORK. 
    CALL "CORBA-ANY-SET-RELEASE" USING
        ANY0
        CORBA-TRUE-VALUE. 

   MAIN-END. 
  END PROGRAM " ODSAMPLE-ANYTEST-OP1".

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

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