(1)IDLマッピング
IDL言語で共用体unionを指定した場合、COBOLではデータ型を識別する弁別情報Dと共用体Uから構成される構造体をデータ宣言します。また、構造体の領域獲得関数(関数名は“モジュール名-インタフェース名-構造体名-ALLOC”、以降XX-ALLOC関数と呼ぶ)が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 ); }; };
* 共用体(固定長) 01 ODSAMPLE-SAMPLEFIX. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D. 02 U. 03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 02 FILLER REDEFINES U. 03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2. * 共用体(可変長) 01 ODSAMPLE-SAMPLEVAR. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D. 02 U. 03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 02 FILLER REDEFINES U. 03 PARA2 USAGE IS POINTER.
(2)クライアントアプリケーションで扱うパラメタ(固定長)
共用体(固定長)のパラメタ(in,out,inout)を扱う場合、領域の獲得/解放を行う必要はありません。弁別情報にデータ型識別値、データ域にデータを設定します。
以下にクライアントアプリケーションでの処理例を示します。
ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. COPY CONST IN CORBA. 01 COPY ENVIRONMENT IN CORBA REPLACING CORBA-ENVIRONMENT BY ENV. 01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ. 01 UNI1. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D. 02 U. 03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2. 02 FILLER REDEFINES U. 03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 01 UNI2. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D. 02 U. 03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2. 02 FILLER REDEFINES U. 03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 01 UNI3. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D. 02 U. 03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2. 02 FILLER REDEFINES U. 03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 01 UNI0. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D. 02 U. 03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2. 02 FILLER REDEFINES U. 03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 01 COPY LONG IN CORBA REPLACING CORBA-LONG BY L-SIZE. 01 STR-WORK PIC X(10). PROCEDURE DIVISION. * inパラメタの弁別子の設定 MOVE 2 TO D OF UNI1. * inパラメタの値の設定 MOVE 100 TO PARA2 OF UNI1. * inoutパラメタの弁別子の設定 MOVE 2 TO D OF UNI3. * inoutパラメタの値の設定 MOVE 200 TO PARA2 OF UNI3. CALL "ODSAMPLE-UNIONTEST-OP2" USING OBJ UNI1 UNI2 UNI3 ENV UNI0.
(3)クライアントアプリケーションで扱うパラメタ(可変長)
クライアントアプリケーションのパラメタの扱いについて、以下に示します。
パラメタ | サーバへ渡すパラメタ | サーバから渡されたパラメタ |
---|---|---|
in | 構造体領域/可変長データ域を獲得する場合、XX-ALLOC関数/データ領域獲得関数を用います。 | - |
inout | (inパラメタと同じ) | 領域はスタブで自動的に獲得されます。 |
out | - | (inoutパラメタと同じ) |
クライアントおよびスタブで動的に獲得した領域は、不要になった時点でCORBA-FREE関数で解放する必要があります。CORBA-FREE関数を発行することで可変長データ域も解放されます。
以下にクライアントアプリケーションでの処理例を示します。
ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. COPY CONST IN CORBA. 01 COPY ENVIRONMENT IN CORBA REPLACING CORBA-ENVIRONMENT BY ENV. 01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ. 01 UNI1. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D. 02 U. 03 PARA2 USAGE IS POINTER. 02 FILLER REDEFINES U. 03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 01 UNI2 USAGE POINTER. 01 UNI3 USAGE POINTER. 01 UNI0 USAGE POINTER. 01 STR-WORK PIC X(30). 01 COPY LONG IN CORBA REPLACING CORBA-LONG BY LSIZE. LINKAGE SECTION. 01 UNI-P. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D. 02 U. 03 PARA2 USAGE IS POINTER. 02 FILLER REDEFINES U. 03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. PROCEDURE DIVISION. * inパラメタの弁別子の設定 MOVE 1 TO D OF UNI1. * inパラメタの値の設定 MOVE 10 TO PARA1 OF UNI1. *inoutパラメタの領域獲得 CALL "ODSAMPLE-SAMPLEVAR-ALLOC" USING UNI3. SET ADDRESS OF UNI-P TO UNI3. * inoutパラメタの弁別子の設定 MOVE 2 TO D OF UNI1-P. * inoutパラメタの値の設定 MOVE 12 TO LSIZE. MOVE "INOUT:para2" TO STR-WORK. MOVE FUNCTION LENG(STR-WORK) TO LSIZE CALL "CORBA-STRING-SET" USING PARA2 OF UNI-P LSIZE STR-WORK. CALL "ODSAMPLE-UNIONTEST-OP1" USING OBJ UNI1 UNI2 UNI3 ENV UNI0. * outパラメタの領域の解放 CALL "CORBA-FREE" USING UNI2. * inoutパラメタの領域の解放 CALL "CORBA-FREE" USING UNI3. * 復帰値の領域の解放 CALL "CORBA-FREE" USING UNI0.
(4)サーバアプリケーションで扱うパラメタ(固定長)
共用体(固定長)のパラメタ(in,out,inout)を扱う場合、構造体領域はスケルトンで自動的に獲得/解放されます。out、inoutパラメタをクライアントアプリケーションに渡す場合、処理結果を構造体メンバに設定します。
以下にサーバアプリケーションでの処理例を示します。
IDENTIFICATION DIVISION. PROGRAM-ID. "ODSAMPLE-UNIONTEST-OP2". DATA DIVISION. WORKING-STORAGE SECTION. COPY CONST IN CORBA. LINKAGE SECTION. 01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ. 01 UNI1. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D. 02 U. 03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 02 FILLER REDEFINES U. 03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2. 01 UNI2. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D. 02 U. 03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 02 FILLER REDEFINES U. 03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2. 01 UNI3. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D. 02 U. 03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 02 FILLER REDEFINES U. 03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2. 01 ENV. 03 MAJOR PIC 9(9) COMP-5. 88 CORBA-NO-EXCEPTION VALUE 0. 88 CORBA-USER-EXCEPTION VALUE 1. 88 CORBA-SYSTEM-EXCEPTION VALUE 2. 03 IDL-ID USAGE POINTER. 03 MINOR PIC 9(9) COMP-5. 03 IDL-STATUS PIC 9(9) COMP-5. 03 PARAM USAGE POINTER. 03 MAGIC PIC 9(9) COMP-5. 01 UNI. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D. 02 U. 03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 02 FILLER REDEFINES U. 03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2. PROCEDURE DIVISION USING OBJ UNI1 UNI2 UNI3 ENV UNI. MAIN SECTION. * outパラメタの処理 MOVE 1 TO D OF UNI2. MOVE 10 TO PARA1 OF UNI2. * inoutパラメタの処理 MOVE 1 TO D OF UNI3. MOVE 30 TO PARA1 OF UNI3. * 復帰値の処理 MOVE 1 TO D OF UNI. MOVE 100 TO PARA1 OF UNI. MAIN-END. END PROGRAM "ODSAMPLE-UNIONTEST-OP2".
(5)サーバアプリケーションで扱うパラメタ(可変長)
サーバアプリケーションのパラメタの扱いについて、以下に示します。
パラメタ | クライアントからのパラメタ領域 | クライアントへのパラメタ領域 |
---|---|---|
in | 構造体領域/可変長データ域はスケルトンで自動的に獲得/解放されます。 | - |
inout | 構造体領域/可変長データ域はスケルトンで自動的に獲得されます。 | 可変長データ域をCORBA-FREE関数で一度解放し、データ域獲得関数で再獲得します。 |
out | - | 構造体/可変長データ域をXX-ALLOC関数/データ域獲得関数で獲得します。 |
以下にサーバアプリケーションでの処理例を示します。
IDENTIFICATION DIVISION. PROGRAM-ID. "ODSAMPLE-UNIONTEST-OP1". DATA DIVISION. WORKING-STORAGE SECTION. COPY CONST IN CORBA. 01 STR-WORK PIC X(30). 01 COPY LONG IN CORBA REPLACING CORBA-LONG BY LSIZE. 01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ. LINKAGE SECTION. 01 UNI1. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D. 02 U. 03 PARA2 USAGE IS POINTER. 02 FILLER REDEFINES U. 03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 01 UNI2-P. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D. 02 U. 03 PARA2 USAGE IS POINTER. 02 FILLER REDEFINES U. 03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 01 UNI2 USAGE IS POINTER. 01 UNI3-P. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D. 02 U. 03 PARA2 USAGE IS POINTER. 02 FILLER REDEFINES U. 03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 01 UNI3 USAGE IS POINTER. 01 ENV. 03 MAJOR PIC 9(9) COMP-5. 88 CORBA-NO-EXCEPTION VALUE 0. 88 CORBA-USER-EXCEPTION VALUE 1. 88 CORBA-SYSTEM-EXCEPTION VALUE 2. 03 IDL-ID USAGE POINTER. 03 MINOR PIC 9(9) COMP-5. 03 IDL-STATUS PIC 9(9) COMP-5. 03 PARAM USAGE POINTER. 03 MAGIC PIC 9(9) COMP-5. 01 UNI-P. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY D. 02 U. 03 PARA2 USAGE IS POINTER. 02 FILLER REDEFINES U. 03 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 01 UNI USAGE POINTER. PROCEDURE DIVISION USING OBJ UNI1 UNI2 UNI3 ENV UNI. MAIN SECTION. * outパラメタの処理 CALL "ODSAMPLE-SAMPLEVAR-ALLOC" USING UNI2. SET ADDRESS OF UNI2-P TO UNI2. MOVE 2 TO D OF UNI2-P. MOVE 10 TO LSIZE. MOVE "OUT:param" TO STR-WORK. MOVE FUNCTION LENG(STR-WORK) TO LSIZE. CALL "CORBA-STRING-SET" USING PARA2 OF UNI2-P LSIZE STR-WORK. * inout復帰値の処理 SET ADDRESS OF UNI3-P TO UNI3. EVALUATE D OF UNI3-P WHEN 2 CALL "CORBA-FREE" USING PARA2 OF UNI3-P END-EVALUATE. MOVE 1 TO D OF UNI3-P. MOVE 10 TO PARA1 OF UNI3-P. * 復帰値の処理 CALL "ODSAMPLE-SAMPLEVAR-ALLOC" USING UNI. SET ADDRESS OF UNI-P TO UNI. MOVE 1 TO D OF UNI-P. MOVE 30 TO PARA1 OF UNI-P. MAIN-END. END PROGRAM "ODSAMPLE-UNIONTEST-OP1".