*DECK FCSNWDB 
USETEXT TEXTFCS;
      PROC FCSNWDB (FCODE, ID); 
*CALL COPYRITE
# TITLE FCSNWDB - WAIT FOR DATA BLOCK.                                 #
  
      BEGIN                            # FCSNWDB                       #
  
# 
**    FCSNWDB - WAIT FOR DATA BLOCK.
* 
*     C. J. RAMSAY                     87/11/03 
* 
*     THIS PROCEDURE WAITS FOR THE NEXT DATA BLOCK FROM THE NETWORK 
*     AND VALIDATES THE DATA BLOCK. 
* 
*     PROC FCSNWDB (FCODE, ID)
* 
*     ENTRY   FCODE      = FUNCTION CODE OF BLOCK EXPECTED. 
*             ID         = CONNECTION IDENTIFIER OF BLOCK EXPECTED. 
* 
*     EXIT    INPBUF     = BUFFER CONTAINING DATA BLOCK.
*             P<APDT>    = PTR TO INPUT BUFFER (INPBUF).
*             INPLEN     = NUMBER OF OCTETS IN INPUT BUFFER.
*             FTPID      = CONNECTION IDENTIFIER OF DATA BLOCK. 
*             FTPFC      = FUNCTION CODE OF DATA BLOCK. 
* 
*     NOTES   THE FUNCTION CODE OF THE RECEIVED BLOCK IS
*             PROCESSED ACCORDING TO THE FOLLOWING TABLE. 
* 
*                          ---------------------------------------- 
*                          ! EXPECTED   ! EXPECTED   ! EXPECTED   ! 
*                          ! *AIPICR*   ! *AIPISCR*  ! *AIPIDI*   ! 
*                          !            !            !            ! 
*             -------------!------------!------------!------------! 
*             ! RECEIVED   !            !            !            ! 
*             ! *AIPICR*   !  PROCESS   !   ABORT    !   ABORT    ! 
*             !            !            !            !            ! 
*             !------------!------------!------------!------------! 
*             ! RECEIVED   !            !            !            ! 
*             ! *AIPISCR*  !   IGNORE   !  PROCESS   !   IGNORE   ! 
*             !            !            !            !            ! 
*             !------------!------------!------------!------------! 
*             ! RECEIVED   !            !            !            ! 
*             ! *AIPIDI*   !   IGNORE   !  PROCESS   !  PROCESS   ! 
*             !            !            !            !            ! 
*             !------------!------------!------------!------------! 
*             ! RECEIVED   !            !            !            ! 
*             ! *XXXXXXX*  !   ABORT    !   ABORT    !   ABORT    ! 
*             !            !            !            !            ! 
*             ----------------------------------------------------- 
* 
* 
*             THE CONNECTION IDENTFIER OF THE RECEIVED BLOCK IS 
*             PROCESSED ACCORDING TO THE FOLLOWING TABLE. 
* 
*                          ---------------------------------------- 
*                          !  EXPECTED  !  EXPECTED  !  EXPECTED  ! 
*                          ! *LOCALID*  ! *REMOTEID* !  EITHER    ! 
*                          !            !            !            ! 
*             -------------!------------!------------!------------! 
*             ! RECEIVED   !            ! PROCESS IF !            ! 
*             ! *LOCALID*  !  PROCESS   ! EXP AIPISCR!  PROCESS   ! 
*             !            !            ! ELSE ABORT !            ! 
*             !------------!------------!------------!------------! 
*             ! RECEIVED   ! PROCESS IF !            !            ! 
*             ! *REMOTEID* ! EXP AIPISCR!  PROCESS   !  PROCESS   ! 
*             !            ! ELSE ABORT !            !            ! 
*             !------------!------------!------------!------------! 
*             ! RECEIVED   !            !            !            ! 
*             ! *XXXXXXX*  !   ABORT    !   ABORT    !   ABORT    ! 
*             !            !            !            !            ! 
*             ----------------------------------------------------- 
* 
*     METHOD  WAIT FOR NETWORK TRAFFIC. 
*             PROCESS ANY SUPERVISORY MESSAGES. 
*             PROCESS ANY DATA BLOCKS AS PER ABOVE TABLES.
* 
# 
  
# 
****  PROC FCSNWDB - XREF LIST
# 
      XREF
        BEGIN 
        PROC ABORT;                    # ABORT JOB                     #
        PROC FCSNPSM;                  # PROCESS SUPERVISORY MESSAGE   #
        PROC FCSNWNT;                  # WAIT FOR NETWORK TRAFFIC      #
        END 
# 
****
# 
      ITEM FCODE         U;            # FUNCTION CODE OF EXPECTED BLK #
      ITEM ID            I;            # CONNECTION IDENTIFIER EXPECTED#
  
      ITEM COMPLETE      B;            # CORRECT DATA BLOCK RECEIVED   #
      ITEM I             I;            # LOOP INDUCTION VARIABLE       #
  
      CONTROL EJECT;
# 
*     START MAIN PROCEDURE
# 
      COMPLETE = FALSE;                # INITIALIZE COMPLETION FLAG    #
      FOR I = 0 
        WHILE NOT COMPLETE DO 
        BEGIN 
        FCSNWNT;                       # WAIT FOR NETWORK TRAFFIC      #
        IF ABHADR[0] EQ 0 
        THEN
          BEGIN                        # SUPERVISORY MESSAGE RECEIVED  #
          FCSNPSM;                     # PROCESS SUPERVISORY MESSAGE   #
          END 
# 
*     VALIDATE LENGTH OF DATA BLOCK.
# 
        ELSE
          BEGIN                        # DATA BLOCK RECEIVED           #
          INPLEN = ABHTLC[0];          # PICK UP LENGTH OF BLOCK       #
          IF INPLEN LS AIPIHDR$ 
          THEN
            BEGIN                      # NOT AT LEAST HEADER           #
            FTPABORT = EINVDB;         # SET UP ABORT CODE             #
            ABORT;                     # ABORT JOB                     #
            END 
# 
*     VALIDATE FUNCTION CODE OF DATA BLOCK. 
# 
          FTPFC = AIPI$FC[0];          # PICK UP FUNCTION CODE         #
          IF FTPFC EQ AIPICR
          THEN
            BEGIN                      # RECEIVED *AIPICR* BLOCK       #
            COMPLETE = FCODE EQ AIPICR; 
            IF (FCODE EQ AIPISCR) OR
               (FCODE EQ AIPIDI)
            THEN
              BEGIN                    # NOT EXPECTING *AIPICR* BLOCK  #
              FTPABORT = EUNEXDB;      # SET UP ABORT CODE             #
              ABORT;                   # ABORT JOB                     #
              END 
            END 
          ELSE IF FTPFC EQ AIPISCR
          THEN
            BEGIN                      # RECEIVED *AIPISCR* BLOCK      #
            COMPLETE = FCODE EQ AIPISCR;
            END 
          ELSE IF FTPFC EQ AIPIDI 
          THEN
            BEGIN                      # RECEIVED *AIPIDI* BLOCK       #
            COMPLETE = (FCODE EQ AIPISCR) OR
                       (FCODE EQ AIPIDI); 
            END 
          ELSE
            BEGIN                      # RECEIVED UNKNOWN DATA BLOCK   #
            FTPABORT = EINVDB;         # SET UP ABORT CODE             #
            ABORT;                     # ABORT JOB                     #
            END 
          END 
        END 
# 
*     VALIDATE CONNECTION IDENTIFIER OF DATA BLOCK. 
# 
      FTPID = AIPI$ID[0];              # PICK UP CONNECTION IDENTIFIER #
      IF FTPID EQ LOCALID 
      THEN
        BEGIN                          # RECEIVED BLOCK FROM *LOCALID* #
        IF (ID EQ REMOTEID) AND 
           (FCODE NQ AIPISCR) 
        THEN
          BEGIN                        # RECEIVED WRONG CONNECTION ID  #
          FTPABORT = EUNEXDB;          # SET UP ABORT CODE             #
          ABORT;                       # ABORT JOB                     #
          END 
        END 
      ELSE IF FTPID EQ REMOTEID 
      THEN
        BEGIN                          # RECEIVED BLOCK FROM *REMOTEID*#
        IF (ID EQ LOCALID) AND
           (FCODE NQ AIPISCR) 
        THEN
          BEGIN                        # RECEIVED WRONG CONNECTION ID  #
          FTPABORT = EUNEXDB;          # SET UP ABORT CODE             #
          ABORT;                       # ABORT JOB                     #
          END 
        END 
      ELSE
        BEGIN                          # RECEIVED BLOCK FROM NEITHER   #
        FTPABORT = EINVDB;             # SET UP ABORT CODE             #
        ABORT;                         # ABORT JOB                     #
        END 
  
      RETURN;                          # RETURN TO CALLER              #
  
      END                              # FCSNWDB                       #
  
      TERM
