| Interstage Application Server アプリケーション作成ガイド (CORBAサービス編) |
目次
索引
![]()
|
| 第7章 アプリケーションの開発(COBOL) | > 7.8 データ型に対するマッピング |
IDL言語でシーケンス型sequenceを指定した場合、COBOLでは以下の構造体(シーケンス構造体)をデータ宣言します。また、シーケンス構造体の領域獲得関数(関数名は"CORBA-SEQUENCE-データ型-ALLOC"、以降XX-ALLOC関数と呼ぶ)と、シーケンスデータ域の獲得関数(関数名は"CORBA-SEQUENCE-データ型-ALLOCBUF"、以降XX-ALLOCBUF関数と呼ぶ)がIDLコンパイラで生成されます。
01 CORBA-SEQUENCE.
* シーケンス配列の最大個数
03 SEQ-MAXIMUM PIC S9(9) COMP-5.
* シーケンス配列の使用個数
03 SEQ-LENGTH PIC S9(9) COMP-5.
* シーケンスのデータ域へのポインタ
03 SEQ-BUFFER USAGE POINTER.
以降では、以下のIDL定義例をもとに説明します。
module ODsample{
interface seqtest{
typedef sequence<long> sampleseq;
sampleseq op1(in sampleseq seq1, out sampleseq seq2,
inout sampleseq seq3 );
};
};
01 ODSAMPLE-SEQTEST-SAMPLESEQ.
* シーケンスの最大長
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-MAXIMUM.
* シーケンスの長さ
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-LENGTH.
* シーケンスのデータ
02 SEQ-BUFFER USAGE IS POINTER.
クライアントアプリケーションのパラメタの扱いについて、以下に示します。
|
パラメタ |
サーバへ渡すパラメタ |
サーバから渡されたパラメタ |
|
in |
シーケンス構造体のメンバとして、配列の最大個数/使用個数/データ域のアドレスを設定します。 シーケンス構造体/SEQ-BUFFERの領域獲得する場合、XX-ALLOC関数/XX-ALLOCBUF関数を用います。 |
− |
|
inout |
シーケンス構造体のメンバとして、配列の最大個数/使用個数/データ域のアドレスを設定します。 シーケンス構造体/SEQ-BUFFERの領域獲得する場合、XX-ALLOC関数/XX-ALLOCBUF関数を用います。 リリースフラグにCORBA-TRUE-VALUEを設定する場合、データ部の領域はスタブにより解放されます。 |
領域はスタブで自動的に獲得されます(各メンバも設定されます)。 |
|
out |
− |
(inoutパラメタと同じ) |
クライアントおよびスタブで獲得した領域は、不要になった時点でCORBA-FREE関数で解放する必要があります。このとき、データ域の領域(XX-ALLOCBUF関数で獲得)を解放するかどうかを、リリースフラグで指定します。
リリースフラグの参照と設定は、以下の関数/フラグを使用します。
[関数]
CALL "CORBA-SEQUENCE-GET-RELEASE" USING
BUFFER
RET-VAL.
CALL "CORBA-SEQUENCE-SET-RELEASE" USING
BUFFER
CORBA-TRUE-VALUE.
[フラグ] CORBA-TRUE-VALUE : CORBA-FREE関数発行時、SEQ-BUFEERの指す領域も解放される CORBA-FALSE-VALUE: CORBA-FREE関数発行時、SEQ-BUFEERの指す領域は解放されない(デフォルト)
なお、スタブで獲得されたoutパラメタ、復帰値のリリースフラグは、CORBA-TRUE-VALUEに設定されます。
以下にクライアントアプリケーションでの処理例を示します。
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 SEQ1.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-MAXIMUM.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-LENGTH.
02 SEQ-BUFFER USAGE IS POINTER.
01 SEQ2 USAGE POINTER.
01 SEQ3-P USAGE POINTER.
01 COPY LONG IN CORBA REPLACING CORBA-LONG BY I.
01 COPY LONG IN CORBA REPLACING CORBA-LONG BY LONG-V.
01 BUF-IN-P USAGE POINTER.
01 LONG-IN-P USAGE POINTER.
01 BUF-IO-P USAGE POINTER.
01 LONG-IO-P USAGE POINTER.
LINKAGE SECTION.
01 SEQ3.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-MAXIMUM.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-LENGTH.
02 SEQ-BUFFER USAGE IS POINTER.
PROCEDURE DIVISION.
* inパラメタの処理
MOVE 2 TO SEQ-MAXIMUM OF SEQ1.
MOVE 2 TO SEQ-LENGTH OF SEQ1.
CALL "CORBA-SEQUENCE-LONG-ALLOCBUF" USING
SEQ-LENGTH OF SEQ1
SEQ-BUFFER OF SEQ1.
MOVE 10 TO LONG-V.
MOVE FUNCTION ADDR (SEQ1) TO BUF-IN-P.
PERFORM VARYING I FROM 1 BY 1 UNTIL I > SEQ-LENGTH OF SEQ1
COMPUTE LONG-V = 20 + LONG-V
MOVE FUNCTION ADDR(LONG-V) TO LONG-IN-P
CALL "CORBA-SEQUENCE-ELEMENT-SET" USING
BUF-IN-P
I
LONG-IN-P
END-PERFORM
* inoutパラメタの処理
CALL "CORBA-SEQUENCE-LONG-ALLOC" USING
SEQ3-P.
SET ADDRESS OF SEQ3 TO SEQ3-P.
MOVE 3 TO SEQ-MAXIMUM OF SEQ3.
MOVE 3 TO SEQ-LENGTH OF SEQ3.
CALL "CORBA-SEQUENCE-LONG-ALLOCBUF" USING
SEQ-LENGTH OF SEQ3
SEQ-BUFFER OF SEQ3.
MOVE 5 TO LONG-V.
MOVE FUNCTION ADDR (SEQ3) TO BUF-IO-P.
PERFORM VARYING I FROM 1 BY 1 UNTIL I > SEQ-LENGTH OF SEQ3
COMPUTE LONG-V = 30 + LONG-V
MOVE FUNCTION ADDR(LONG-V) TO LONG-IO-P
CALL "CORBA-SEQUENCE-ELEMENT-SET" USING
BUF-IO-P
I
LONG-IO-P
END-PERFORM
CALL "CORBA-SEQUENCE-SET-RELEASE" USING
SEQ3-P
CORBA-TRUE-VALUE.
CALL "ODSAMPLE-SEQTEST-OP1" USING
OBJ
SEQ1
SEQ2
SEQ3-P
ENV
SEQ0.
CALL "CORBA-FREE" USING
SEQ0.
CALL "CORBA-FREE" USING
SEQ-BUFFER OF SEQ1.
CALL "CORBA-FREE" USING
SEQ2.
CALL "CORBA-FREE" USING
SEQ3-P.
シーケンス構造体のメンバとして、配列の最大個数/使用個数/データ域のアドレスを設定します。
シーケンス構造体/SEQ-BUFFERの領域獲得する場合、XX-ALLOC関数/XX-ALLOCBUF関数を用います。
サーバアプリケーションのパラメタの扱いについて、以下に示します。
|
パラメタ |
クライアントから渡されたパラメタ |
クライアントへ渡すパラメタ |
|
in |
各領域(シーケンス構造体/データ域)はスケルトンで自動的に獲得/解放されます。 |
− |
|
inout |
各領域(シーケンス構造体/データ域)はスケルトンで自動的に獲得されます。 |
inoutデータの領域を更新する場合には、以下の処理を実施してください。 リリースフラグにCORBA-TRUE-VALUEを設定する、またはリリースフラグを設定しない場合、領域はスケルトンで自動的に解放されます。 |
|
out |
− |
シーケンス構造体/SEQ-BUFFER域をXX-ALLOC関数/XX-ALLOCBUF関数で獲得します。 リリースフラグにCORBA-TRUE-VALUEを設定する場合、領域はスケルトンで自動的に解放されます。 |
以下にサーバアプリケーションでの処理例を示します。
IDENTIFICATION DIVISION.
PROGRAM-ID. "ODSAMPLE-SEQTEST-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 USAGE POINTER.
01 COPY LONG IN CORBA REPLACING CORBA-LONG BY LSIZE.
01 STR-WORK PIC X(30).
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 COPY LONG IN CORBA REPLACING CORBA-LONG BY I.
01 COPY LONG IN CORBA REPLACING CORBA-LONG BY NUM.
01 LONG-OUT-P USAGE POINTER.
01 LONG-IO-P USAGE POINTER.
01 LONG-RET-P USAGE POINTER.
01 BUF-OUT-P USAGE POINTER.
01 BUF-IO-P USAGE POINTER.
01 BUF-RET-P USAGE POINTER.
LINKAGE SECTION.
01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ.
01 SEQ.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-MAXIMUM.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-LENGTH.
02 SEQ-BUFFER USAGE POINTER.
01 SEQ1.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-MAXIMUM.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-LENGTH.
02 SEQ-BUFFER USAGE POINTER.
01 SEQ2.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-MAXIMUM.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-LENGTH.
02 SEQ-BUFFER USAGE POINTER.
01 SEQ3.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-MAXIMUM.
02 COPY LONG IN CORBA REPLACING CORBA-LONG BY SEQ-LENGTH.
02 SEQ-BUFFER USAGE POINTER.
01 SEQ1-P USAGE POINTER.
01 SEQ2-P USAGE POINTER.
01 SEQ3-P USAGE 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.
01 SEQ-P USAGE POINTER.
PROCEDURE DIVISION USING
OBJ
SEQ1
SEQ2-P
SEQ3-P
ENV
SEQ-P.
MAIN.
* outパラメタの処理
CALL "CORBA-SEQUENCE-LONG-ALLOC" USING
SEQ2-P
SET ADDRESS OF SEQ2 TO SEQ2-P.
MOVE 4 TO SEQ-MAXIMUM OF SEQ2.
MOVE 4 TO SEQ-LENGTH OF SEQ2.
CALL "CORBA-SEQUENCE-LONG-ALLOCBUF" USING
SEQ-LENGTH OF SEQ2
SEQ-BUFFER OF SEQ2.
MOVE FUNCTION ADDR (SEQ2) TO BUF-OUT-P.
PERFORM VARYING I FROM 1 BY 1 UNTIL I > SEQ-LENGTH OF SEQ2
COMPUTE NUM = I * 100
MOVE FUNCTION ADDR(NUM) TO LONG-OUT-P
CALL "CORBA-SEQUENCE-ELEMENT-SET" USING
BUF-OUT-P
I
LONG-OUT-P
END-PERFORM
CALL "CORBA-SEQUENCE-SET-RELEASE" USING
SEQ2-P
CORBA-TRUE-VALUE.
* inoutパラメタの処理
SET ADDRESS OF SEQ3 TO SEQ3-P.
CALL "CORBA-FREE" USING
SEQ-BUFFER OF SEQ3.
MOVE 5 TO SEQ-MAXIMUM OF SEQ3.
MOVE 5 TO SEQ-LENGTH OF SEQ3.
CALL "CORBA-SEQUENCE-LONG-ALLOCBUF" USING
SEQ-LENGTH OF SEQ3
SEQ-BUFFER OF SEQ3.
MOVE FUNCTION ADDR (SEQ3) TO BUF-IO-P.
PERFORM VARYING I FROM 1 BY 1 UNTIL I > SEQ-LENGTH OF SEQ3
COMPUTE NUM = I * 1000
MOVE FUNCTION ADDR(NUM) TO LONG-IO-P
CALL "CORBA-SEQUENCE-ELEMENT-SET" USING
BUF-IO-P
I
LONG-IO-P
END-PERFORM
CALL "CORBA-SEQUENCE-SET-RELEASE" USING
SEQ3-P
CORBA-TRUE-VALUE.
* 復帰値の処理
CALL "CORBA-SEQUENCE-LONG-ALLOC" USING
SEQ-P.
SET ADDRESS OF SEQ TO SEQ-P.
MOVE 6 TO SEQ-MAXIMUM OF SEQ.
MOVE 6 TO SEQ-LENGTH OF SEQ.
MOVE FUNCTION ADDR(SEQ) TO BUF-RET-P.
CALL "CORBA-SEQUENCE-LONG-ALLOCBUF" USING
SEQ-LENGTH OF SEQ
SEQ-BUFFER OF SEQ.
PERFORM VARYING I FROM 1 BY 1 UNTIL I > SEQ-LENGTH OF SEQ
COMPUTE NUM = I * 10000
MOVE FUNCTION ADDR(NUM) TO LONG-RET-P
CALL "CORBA-SEQUENCE-ELEMENT-SET" USING
BUF-RET-P
I
LONG-RET-P
END-PERFORM
CALL "CORBA-SEQUENCE-SET-RELEASE" USING
SEQ-P
CORBA-TRUE-VALUE.
MAIN-END.
END PROGRAM "ODSAMPLE-SEQTEST-OP1".
目次
索引
![]()
|