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