(1)IDLマッピング
IDL言語で構造体structを指定した場合、COBOLでも構造体でデータ宣言します。
可変長構造体の場合、領域獲得関数(関数名:“モジュール名-インタフェース名-構造体名-ALLOC”、以降XX-ALLOC関数と呼ぶ)がIDLコンパイラで生成されます。
なお、アプリケーションで使用可能なCORBAのデータ型については、“6.8 データ型に対するマッピング”を参照してください。
以降では、以下のIDL定義例をもとに説明します。
module ODsample{ struct samplefix { // 構造体(固定長) long para1; long para2; string<10> para3; }; struct samplevar { // 構造体(可変長) long para1; string para2; }; interface structtest{ samplefix op2( in samplefix str1, out samplefix str2, inout samplefix str3 ); samplevar op1( in samplevar str1, out samplevar str2, inout samplevar str3 ); }; };
* 構造体(固定長) 01 ODSAMPLE-SAMPLEFIX. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2. 02 PARA3 PIC X(10). * 構造体(可変長) 01 ODSAMPLE-SAMPLEVAR. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 02 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 FIX1. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2. 02 PARA3 PIC X(10). 01 FIX2. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2. 02 PARA3 PIC X(10). 01 FIX3. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2. 02 PARA3 PIC X(10). 01 FIX0. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2. 02 PARA3 PIC X(10). PROCEDURE DIVISION. * inパラメタの設定 MOVE 10 TO PARA1 OF FIX1. * inパラメタの設定 MOVE 11 TO PARA2 OF FIX1. * inパラメタの設定 MOVE "IN" TO PARA3 OF FIX1. * inoutパラメタの設定 MOVE 20 TO PARA1 OF FIX3. * inoutパラメタの設定 MOVE 21 TO PARA2 OF FIX3. * inoutパラメタの設定 MOVE "INOUT:1" TO PARA3 OF FIX3. CALL "ODSAMPLE-STRUCTTEST-OP2" USING OBJ FIX1 FIX2 FIX3 ENV FIX0.
(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 VAR1. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 02 PARA2 USAGE IS POINTER. 01 VAR2 USAGE POINTER. 01 VAR3-P USAGE POINTER. 01 VAR0 USAGE POINTER. 01 STR-WORK PIC X(30). 01 COPY LONG IN CORBA REPLACING CORBA-LONG BY LSIZE. LINKAGE SECTION. 01 VAR3. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 02 PARA2 USAGE IS POINTER. PROCEDURE DIVISION. *inパラメタの設定 MOVE 5 TO PARA1 OF VAR1. MOVE "test" TO STR-WORK. MOVE FUNCTION LENG(STR-WORK) TO LSIZE CALL "CORBA-STRING-SET" USING PARA2 OF VAR1 LSIZE STR-WORK. *inoutパラメタの領域獲得 CALL "ODSAMPLE-SAMPLEVAR-ALLOC" USING VAR3-P. SET ADDRESS OF VAR3 TO VAR3-P. *inoutパラメタの設定 MOVE 4 TO PARA1 OF VAR3. MOVE "pro" TO STR-WORK. MOVE FUNCTION LENG(STR-WORK) TO LSIZE. CALL "CORBA-STRING-SET" USING PARA2 OF VAR3 LSIZE STR-WORK. CALL "ODSAMPLE-STRUCTTEST-OP1" USING OBJ VAR1 VAR2 VAR3-P ENV VAR0. CALL "CORBA-FREE" USING PARA2 OF VAR1. CALL "CORBA-FREE" USING VAR2. CALL "CORBA-FREE" USING VAR3-P. CALL "CORBA-FREE" USING VAR0.
(4)サーバアプリケーションで扱うパラメタ(固定長)
構造体(固定長)のパラメタ(in、out、inout)を扱う場合、構造体領域はスケルトンで自動的に獲得/解放されます。out/inoutパラメタをクライアントアプリケーションに渡す場合、処理結果を構造体メンバに設定します。
サーバアプリケーションでの処理例を以下に示します。
IDENTIFICATION DIVISION. PROGRAM-ID. "ODSAMPLE-STRUCTTEST-OP2". ENVIRONMENT DIVISION. CONFIGURATION SECTION. SPECIAL-NAMES. SYMBOLIC CONSTANT COPY SYMBOL-CONST IN CORBA. . 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. LINKAGE SECTION. 01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ. 01 STR1. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2. 02 PARA3 PIC X(10). 01 STR2. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2. 02 PARA3 PIC X(10). 01 STR3. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2. 02 PARA3 PIC X(10). 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 FIX. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA2. 02 PARA3 PIC X(10). PROCEDURE DIVISION USING OBJ STR1 STR2 STR3 ENV FIX. MAIN SECTION. * outパラメタの設定 MOVE 0 TO PARA1 OF STR2. MOVE 1 TO PARA2 OF STR2. MOVE "OUT" TO PARA3 OF STR2. * inoutパラメタの設定 MOVE 2 TO PARA1 OF STR3. MOVE 3 TO PARA2 OF STR3. MOVE "INOUT:2" TO PARA3 OF STR3. * 復帰値の処理 MOVE 4 TO PARA1 OF FIX. MOVE 5 TO PARA2 OF FIX. MOVE "RTN" TO PARA3 OF FIX. MAIN-END. END PROGRAM "ODSAMPLE-STRUCTTEST-OP2".
(5)サーバアプリケーションで扱うパラメタ(可変長)
サーバアプリケーションのパラメタの扱いについて、以下に示します。
パラメタ | クライアントからのパラメタ領域 | クライアントへのパラメタ領域 |
---|---|---|
in | 構造体領域/可変長データ域は、スケルトンで自動的に獲得/解放されます。 | - |
inout | 構造体領域/可変長データ域は、スケルトンで自動的に獲得されます。 | 可変長データ域をCORBA-FREE関数で一度解放し、データ域獲得関数で再獲得します。 |
out | - | 構造体/可変長データ域をXX-ALLOC関数/データ域獲得関数で獲得します。 |
サーバアプリケーションでの処理例を以下に示します。
IDENTIFICATION DIVISION. PROGRAM-ID. "ODSAMPLE-STRUCTTEST-OP1". ENVIRONMENT DIVISION. CONFIGURATION SECTION. SPECIAL-NAMES. SYMBOLIC CONSTANT COPY SYMBOL-CONST IN CORBA. . DATA DIVISION. WORKING-STORAGE SECTION. COPY CONST IN CORBA. 01 STR-WORK PIC X(30). LINKAGE SECTION. 01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ. 01 STR1. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 02 PARA2 USAGE IS POINTER. 01 STR2 USAGE IS POINTER. 01 STR2-P. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 02 PARA2 USAGE IS POINTER. 01 STR3 USAGE IS POINTER. 01 STR3-P. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 02 PARA2 USAGE IS POINTER. 01 STR0-P. 02 COPY LONG IN CORBA REPLACING CORBA-LONG BY PARA1. 02 PARA2 USAGE IS POINTER. 01 STR0 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. PROCEDURE DIVISION USING OBJ STR1 STR2 STR3 ENV STR0. MAIN SECTION. *outパラメタの処理 CALL "ODSAMPLE-SAMPLEVAR-ALLOC" USING STR2. SET ADDRESS OF STR2-P TO STR2. MOVE 12 TO PARA1 OF STR2-P. MOVE "(*str2)->para2" TO STR-WORK. MOVE FUNCTION LENG(STR-WORK) TO LSIZE CALL "CORBA-STRING-SET" USING PARA2 OF STR2-P LSIZE STR-WORK. *inoutパラメタの処理 SET ADDRESS OF STR3-P TO STR3. CALL “CORBA-FREE” USING PARA2 OF STR3-P. MOVE 12 TO PARA1 OF STR3-P. MOVE 16 TO LSIZE. MOVE "(*str3)->para2" TO STR-WORK. MOVE FUNCTION LENG(STR-WORK) TO LSIZE CALL "CORBA-STRING-SET" USING PARA2 OF STR3-P LSIZE STR-WORK. *復帰値の処理 CALL "ODSAMPLE-SAMPLEVAR-ALLOC" USING STR0. SET ADDRESS OF STR0-P TO STR0. MOVE 11 TO PARA1 OF STR0-P. MOVE 16 TO LSIZE. MOVE "(*str2)->para2" TO STR-WORK. MOVE FUNCTION LENG(STR-WORK) TO LSIZE CALL "CORBA-STRING-SET" USING PARA2 OF STR0-P LSIZE STR-WORK. MAIN-END. END PROGRAM "ODSAMPLE-STRUCTTEST-OP1".