(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定義例をもとに説明します。
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".