ページの先頭行へ戻る
Interstage Application Server アプリケーション作成ガイド(CORBAサービス編)

6.8.4 シーケンス型

(1)IDLマッピング

  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定義例をもとに説明します。

IDL言語

シーケンス(基本型)

  module ODsample{
      interface  seqtest{
          typedef sequence<long>  sampleseq; 
          sampleseq op1(in sampleseq seq1, out sampleseq seq2, 
                        inout sampleseq seq3 ); 
      };
  };

シーケンス(構造体型)

  module ODsample{
      interface  seqtest{
	    struct  structV {  string  st;  };
          typedef sequence<structV>  sampleseq; 
          sampleseq op1(in sampleseq seq1, out sampleseq seq2, 
                        inout sampleseq seq3 ); 
      };
  };
COBOL
    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.

(2)クライアントアプリケーションで扱うパラメタ

  クライアントアプリケーションのパラメタの扱いについて、以下に示します。

パラメタ

サーバへ渡すパラメタ

サーバから渡されたパラメタ

in

シーケンス構造体のメンバとして、配列の最大個数/使用個数/データ域のアドレスを設定します。

シーケンス構造体/SEQ-BUFFERの領域獲得する場合、XX-ALLOC関数/XX-ALLOCBUF関数を用います。

inout

シーケンス構造体のメンバとして、配列の最大個数/使用個数/データ域のアドレスを設定します。

シーケンス構造体/SEQ-BUFFERの領域獲得する場合、XX-ALLOC関数/XX-ALLOCBUF関数を用います。

リリースフラグにCORBA-TRUE-VALUEを設定する場合、データ部の領域はスタブにより解放されます。
リリースフラグにCORBA-FALSE-VALUEを設定する、またはリリースフラグを設定しない場合、スタブではデータ域の解放を行いません。この場合、アプリケーション内で領域を保持し、不要になった段階で解放処理を実施してください。

領域はスタブで自動的に獲得されます(各メンバも設定されます)。
この際、獲得した領域にはリリースフラグに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.

シーケンス(構造体型)

   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. 
    01OP1-IN-P. 
       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 OP1-OUT-P USAGE POINTER. 
    01 OP1-IO-P USAGE POINTER. 
    01 OP1-RESULT USAGE IS POINTER.
    01 TMP-ODSAMPLE-SEQTEST-STRUCTV.. 
      02 ST USAGE IS POINTER.
    01 COPY ULONG IN CORBA REPLACING CORBA-UNSIGNED-LONG BY WS-NUM.
    01 TMP-POINTER USAGE IS POINTER.
    01 TMP-SEQ-ADDR USAGE IS POINTER.
    01 TMP-BUF	PIC X(20).
01 COPY ULONG IN CORBA REPLACING CORBA-UNSIGNED-LONG BY TMP-LEN.
  LINKAGE SECTION.
    01 TMP-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.

   PROCEDURE DIVISION. 

  * inパラメタの処理
    MOVE 10 TO SEQ-MAXIMUM OF OP1-IN-P. 
    MOVE 10 TO SEQ-LENGTH OF OP1-IN-P. 
    CALL "CORBA-SEQUENCE-ODSAMPLE-SEQTEST-STRUCTV-ALLOCBUF" USING 
          SEQ-MAXIMUM OF OP1-IN-P
          SEQ-BUFFER OF OP1-IN-P.
    MOVE 10 TO LONG-V.
    MOVE FUNCTION ADDR( OP1-IN-P ) TO TMP-SEQ-ADDR.
    PERFORM VARYING WS-NUM FROM 1 BY 1 UNTIL WS-NUM > SEQ-LENGTH OF OP1-IN-P
        MOVE "ABC" TO TMP-BUF
        MOVE FUNCTION LENG( TMP-BUF ) TO TMP-LEN
        CALL "CORBA-STRING-SET" USING
            ST OF TMP-ODSAMPLE-SEQTEST-STRUCTV
            TMP-LEN
            TMP-BUF
        MOVE FUNCTION ADDR( TMP-ODSAMPLE-SEQTEST-STRUCTV ) TO TMP-POINTER
        CALL "CORBA-SEQUENCE-ELEMENT-SET" USING
            TMP-SEQ-ADDR
            WS-NUM
            TMP-POINTER
    END-PERFORM.
    MOVE FUNCTION ADDR( OP1-IN-P ) TO TMP-SEQ-ADDR
    PERFORM VARYING WS-NUM FROM 1 BY 1 UNTIL WS-NUM > SEQ-LENGTH OF OP1-IN-P
        CALL "CORBA-SEQUENCE-ELEMENT-GET" USING
            TMP-SEQ-ADDR
            WS-NUM
            TMP-POINTER
        SET ADDRESS OF TMP-ODSAMPLE-SEQTEST-STRUCTV-L TO TMP-POINTER
        MOVE FUNCTION LENG( TMP-BUF ) TO TMP-LEN
        CALL "CORBA-STRING-GET" USING
            ST OF TMP-ODSAMPLE-SEQTEST-STRUCTV-L
            TMP-LEN
            TMP-BUF
    END-PERFORM.

  * inoutパラメタの処理
    CALL "CORBA-SEQUENCE-ODSAMPLE-SEQTEST-STRUCTV-ALLOC" USING 
        OP1-IO-P. 
    SET ADDRESS OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ TO OP1-IO-P.
    MOVE 10 TO SEQ-MAXIMUM OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ.
    MOVE 10 TO SEQ-LENGTH OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ.
    CALL "CORBA-SEQUENCE-ODSAMPLE-SEQTEST-STRUCTV-ALLOCBUF" USING
            SEQ-MAXIMUM OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ
            SEQ-BUFFER OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ
    MOVE FUNCTION ADDR( TMP-ODSAMPLE-SEQTEST-SAMPLESEQ ) TO TMP-SEQ-ADDR
    PERFORM VARYING WS-NUM FROM 1 BY 1 UNTIL WS-NUM > SEQ-LENGTH 
        OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ
        MOVE "DEF" TO TMP-BUF
        MOVE FUNCTION LENG( TMP-BUF ) TO TMP-LEN
        CALL "CORBA-STRING-SET" USING
            ST OF TMP-ODSAMPLE-SEQTEST-STRUCTV
            TMP-LEN
            TMP-BUF
        MOVE FUNCTION ADDR( TMP-ODSAMPLE-SEQTEST-STRUCTV ) TO TMP-POINTER
        CALL "CORBA-SEQUENCE-ELEMENT-SET" USING
            TMP-SEQ-ADDR
            WS-NUM
            TMP-POINTER
    END-PERFORM.
    SET ADDRESS OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ TO OP1-IO-P.
    MOVE FUNCTION ADDR( TMP-ODSAMPLE-SEQTEST-SAMPLESEQ ) TO TMP-SEQ-ADDR
    PERFORM VARYING WS-NUM FROM 1 BY 1 UNTIL WS-NUM > SEQ-LENGTH
        OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ
        CALL "CORBA-SEQUENCE-ELEMENT-GET" USING
           TMP-SEQ-ADDR
            WS-NUM
          TMP-POINTER
        SET ADDRESS OF TMP-ODSAMPLE-SEQTEST-STRUCTV-L TO TMP-POINTER
        MOVE FUNCTION LENG( TMP-BUF ) TO TMP-LEN
        CALL "CORBA-STRING-GET" USING
            ST OF TMP-ODSAMPLE-SEQTEST-STRUCTV-L
            TMP-LEN
            TMP-BUF
    END-PERFORM.
    CALL "CORBA-SEQUENCE-SET-RELEASE" USING
          OP1-IO-P
          CORBA-TRUE-VALUE. 
    CALL "ODSAMPLE-SEQTEST-OP1" USING
        OBJ
        OP1-IN-P
        OP1-OUT-P
        OP1-IO-P
        ENV
        OP1-RESULT. 
    CALL "CORBA-FREE" USING 
        OP1-RESULT. 
    CALL "CORBA-FREE" USING 
        SEQ-BUFFER OF OP1-IN-P. 
    CALL "CORBA-FREE" USING 
       OP1-OUT-P. 
    CALL "CORBA-FREE" USING 
       OP1-IO-P.

(3)サーバアプリケーションで扱うパラメタ

  シーケンス構造体のメンバとして、配列の最大個数/使用個数/データ域のアドレスを設定します。
  シーケンス構造体/SEQ-BUFFERの領域獲得する場合、XX-ALLOC関数/XX-ALLOCBUF関数を用います。

  サーバアプリケーションのパラメタの扱いについて、以下に示します。

パラメタ

クライアントから渡されたパラメタ

クライアントへ渡すパラメタ

in

各領域(シーケンス構造体/データ域)はスケルトンで自動的に獲得/解放されます。

inout

各領域(シーケンス構造体/データ域)はスケルトンで自動的に獲得されます。
この際、リリースフラグの設定には、CORBA-TRUE-VALUEが設定されています。

inoutデータの領域を更新する場合には、以下の処理を実施してください。
SEQ-BUFFER域をCORBA-FREE関数で一度解放し、XX-ALLOCBUF関数で再獲得します。

リリースフラグにCORBA-TRUE-VALUEを設定する、またはリリースフラグを設定しない場合、領域はスケルトンで自動的に解放されます。
リリースフラグにCORBA-FALSE-VALUEを設定する場合、スケルトンでは領域の解放を行いません。この場合、C言語などの他言語と連携させて領域を保持し、不要になった段階で解放処理を実施してください。

out
復帰値

シーケンス構造体/SEQ-BUFFER域をXX-ALLOC関数/XX-ALLOCBUF関数で獲得します。

リリースフラグにCORBA-TRUE-VALUEを設定する場合、領域はスケルトンで自動的に解放されます。
リリースフラグにCORBA-FALSE-VALUEを設定する、またはリリースフラグを設定しない場合、スケルトンでは領域の解放を行いません。この場合、C言語などの他言語と連携させて領域を保持し、不要になった段階で解放処理を実施してください。

  以下にサーバアプリケーションでの処理例を示します。


シーケンス(基本型)

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

シーケンス(構造体型)

  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 TMP-POINTER USAGE IS POINTER.
    01 TMP-SEQ-ADDR USAGE IS POINTER.
    01 TMP-BUF	PIC X(20).
    01 COPY ULONG IN CORBA REPLACING CORBA-UNSIGNED-LONG BY TMP-LEN.
    01 COPY ULONG IN CORBA REPLACING CORBA-UNSIGNED-LONG BY WS-NUM.
    01 COPY LONG IN CORBA REPLACING CORBA-LONG BY WS-LONG.
    01 TMP-ODSAMPLE-SEQTEST-STRUCTV.
       02 ST USAGE IS POINTER.
   LINKAGE SECTION.
    01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ.
    01 COPY ENVIRONMENT IN CORBA REPLACING CORBA-ENVIRONMENT BY ENV.
    01 OP1-IN-P.
      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 OP1-OUT-P USAGE IS POINTER.
    01 OP1-IO-P	 USAGE IS POINTER.
    01 OP1-RESULT USAGE IS POINTER.
    01 TMP-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. 
    01 TMP-ODSAMPLE-SEQTEST-STRUCTV-L.
      02 ST USAGE IS POINTER.

  PROCEDURE DIVISION USING
        OBJ
        OP1-IN-P
        OP1-OUT-P
        OP1-IO-P
        ENV
        OP1-RESULT. 

  MAIN. 
  * outパラメタの処理
    CALL "CORBA-SEQUENCE-ODSAMPLE-SEQTEST-STRUCTV-ALLOC" USING OP1-OUT-P.
    CALL "CORBA-SEQUENCE-SET-RELEASE" USING OP1-OUT-P CORBA-TRUE-VALUE.
    SET ADDRESS OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ TO OP1-OUT-P.
    MOVE 10 TO SEQ-MAXIMUM OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ.
    MOVE 10 TO SEQ-LENGTH OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ.
    CALL "CORBA-SEQUENCE-ODSAMPLE-SEQTEST-STRUCTV-ALLOCBUF" USING
            SEQ-MAXIMUM OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ
            SEQ-BUFFER OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ
    MOVE FUNCTION ADDR( TMP-ODSAMPLE-SEQTEST-SAMPLESEQ ) TO TMP-SEQ-ADDR
    PERFORM VARYING WS-NUM FROM 1 BY 1 UNTIL WS-NUM > SEQ-LENGTH
        OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ
        MOVE "JKL" TO TMP-BUF
        MOVE FUNCTION LENG( TMP-BUF ) TO TMP-LEN
        CALL "CORBA-STRING-SET" USING
            ST OF TMP-ODSAMPLE-SEQTEST-STRUCTV
            TMP-LEN
            TMP-BUF
        MOVE FUNCTION ADDR( TMP-ODSAMPLE-SEQTEST-STRUCTV ) TO TMP-POINTER
        CALL "CORBA-SEQUENCE-ELEMENT-SET" USING
            TMP-SEQ-ADDR
            WS-NUM
            TMP-POINTER
    END-PERFORM.
    SET ADDRESS OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ TO OP1-OUT-P.
    MOVE FUNCTION ADDR( TMP-ODSAMPLE-SEQTEST-SAMPLESEQ ) TO TMP-SEQ-ADDR
    PERFORM VARYING WS-NUM FROM 1 BY 1 UNTIL WS-NUM > SEQ-LENGTH
        OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ
        CALL "CORBA-SEQUENCE-ELEMENT-GET" USING
            TMP-SEQ-ADDR
            WS-NUM
            TMP-POINTER
        SET ADDRESS OF TMP-ODSAMPLE-SEQTEST-STRUCTV-L TO TMP-POINTER
        MOVE FUNCTION LENG( TMP-BUF ) TO TMP-LEN
        CALL "CORBA-STRING-GET" USING
            ST OF TMP-ODSAMPLE-SEQTEST-STRUCTV-L
            TMP-LEN
            TMP-BUF
    END-PERFORM.
    CALL "CORBA-SEQUENCE-SET-RELEASE" USING
       OP1-OUT-P
       CORBA-TRUE-VALUE. 

  * inoutパラメタの処理
    CALL "CORBA-SEQUENCE-ODSAMPLE-SEQTEST-STRUCTV-ALLOC" USING OP1-IO-P.
    CALL "CORBA-SEQUENCE-SET-RELEASE" USING OP1-IO-P CORBA-TRUE-VALUE.
    SET ADDRESS OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ TO OP1-IO-P.
    MOVE 10 TO SEQ-MAXIMUM OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ.
    MOVE 10 TO SEQ-LENGTH OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ.
    CALL "CORBA-SEQUENCE-ODSAMPLE-SEQTEST-STRUCTV-ALLOCBUF" USING
            SEQ-MAXIMUM OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ
            SEQ-BUFFER OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ
    MOVE FUNCTION ADDR( TMP-ODSAMPLE-SEQTEST-SAMPLESEQ ) TO TMP-SEQ-ADDR
    PERFORM VARYING WS-NUM FROM 1 BY 1 UNTIL WS-NUM > SEQ-LENGTH
        OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ
        MOVE "GHI" TO TMP-BUF
        MOVE FUNCTION LENG( TMP-BUF ) TO TMP-LEN
        CALL "CORBA-STRING-SET" USING
            ST OF TMP-ODSAMPLE-SEQTEST-STRUCTV
            TMP-LEN
            TMP-BUF
        MOVE FUNCTION ADDR( TMP-ODSAMPLE-SEQTEST-STRUCTV ) TO TMP-POINTER
        CALL "CORBA-SEQUENCE-ELEMENT-SET" USING
           TMP-SEQ-ADDR
            WS-NUM
           TMP-POINTER
    END-PERFORM.
    SET ADDRESS OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ TO OP1-IO-P.
    MOVE FUNCTION ADDR( TMP-ODSAMPLE-SEQTEST-SAMPLESEQ ) TO TMP-SEQ-ADDR
    PERFORM VARYING WS-NUM FROM 1 BY 1 UNTIL WS-NUM > SEQ-LENGTH
        OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ
        CALL "CORBA-SEQUENCE-ELEMENT-GET" USING
            TMP-SEQ-ADDR
            WS-NUM
            TMP-POINTER
        SET ADDRESS OF TMP-ODSAMPLE-SEQTEST-STRUCTV-L TO TMP-POINTER
        MOVE FUNCTION LENG( TMP-BUF ) TO TMP-LEN
        CALL "CORBA-STRING-GET" USING
            ST OF TMP-ODSAMPLE-SEQTEST-STRUCTV-L
            TMP-LEN
            TMP-BUF
    END-PERFORM.
    CALL "CORBA-SEQUENCE-SET-RELEASE" USING
       OP1-IO-P
       CORBA-TRUE-VALUE. 

  * 復帰値の処理
    CALL "CORBA-SEQUENCE-ODSAMPLE-SEQTEST-STRUCTV-ALLOC" USING OP1-RESULT.
    CALL "CORBA-SEQUENCE-SET-RELEASE" USING OP1-RESULT CORBA-TRUE-VALUE.
    SET ADDRESS OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ TO OP1-RESULT.
    MOVE 10 TO SEQ-MAXIMUM OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ.
    MOVE 10 TO SEQ-LENGTH OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ.
    CALL "CORBA-SEQUENCE-ODSAMPLE-SEQTEST-STRUCTV-ALLOCBUF" USING
            SEQ-MAXIMUM OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ
            SEQ-BUFFER OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ
    MOVE FUNCTION ADDR( TMP-ODSAMPLE-SEQTEST-SAMPLESEQ ) TO TMP-SEQ-ADDR
    PERFORM VARYING WS-NUM FROM 1 BY 1 UNTIL WS-NUM > SEQ-LENGTH
        OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ
        MOVE "MNO" TO TMP-BUF
        MOVE FUNCTION LENG( TMP-BUF ) TO TMP-LEN
        CALL "CORBA-STRING-SET" USING
            ST OF TMP-ODSAMPLE-SEQTEST-STRUCTV
            TMP-LEN
            TMP-BUF
        MOVE FUNCTION ADDR( TMP-ODSAMPLE-SEQTEST-STRUCTV ) TO TMP-POINTER
        CALL "CORBA-SEQUENCE-ELEMENT-SET" USING
            TMP-SEQ-ADDR
            WS-NUM
            TMP-POINTER
    END-PERFORM.
    SET ADDRESS OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ TO OP1-RESULT.
    MOVE FUNCTION ADDR( TMP-ODSAMPLE-SEQTEST-SAMPLESEQ ) TO TMP-SEQ-ADDR
    PERFORM VARYING WS-NUM FROM 1 BY 1 UNTIL WS-NUM > SEQ-LENGTH
        OF TMP-ODSAMPLE-SEQTEST-SAMPLESEQ
        CALL "CORBA-SEQUENCE-ELEMENT-GET" USING
            TMP-SEQ-ADDR
            WS-NUM
            TMP-POINTER
        SET ADDRESS OF TMP-ODSAMPLE-SEQTEST-STRUCTV-L TO TMP-POINTER
        MOVE FUNCTION LENG( TMP-BUF ) TO TMP-LEN
        CALL "CORBA-STRING-GET" USING
            ST OF TMP-ODSAMPLE-SEQTEST-STRUCTV-L
            TMP-LEN
            TMP-BUF
    END-PERFORM.
    CALL "CORBA-SEQUENCE-SET-RELEASE" USING
       OP1-RESULT
       CORBA-TRUE-VALUE. 
    MAIN-END. 
   END PROGRAM "ODSAMPLE-SEQTEST-OP1".