(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".