*DECK FFSDPDB 
USETEXT TEXTFFS 
      PROC FFSDPDB; 
*CALL COPYRITE
# TITLE FFSDPDB - PROCESS DATA BLOCK.                                  #
  
      BEGIN                            # FFSDPDB                       #
# 
**    FFSDPDB  PROCESS DATA BLOCK.
* 
*     A. LIM                           88/01/15 
* 
*     THIS PROCEDURE PROCESSES ALL NON-SUPERVISORY MESSAGES RECEIVED BY 
*     VALIDATING THEM TO BE A CORRECT BLOCK AND PASSING THE BLOCK ON TO 
*     THE TCP LAYER BY MAKING AN INDICATION IN THE *INDICATION* BLOCK.
* 
*     PROC FFSDP
* 
*     ENTRY    INPBUF = ARRAY CONTAINING INPUT DATA BLOCK.
*              P<ABH> = PTR TO INPUT APPLICATION BLOCK HEADER.
* 
*     EXIT     INDICATION[INAMTCP$] = DATA AVAILABLE INDICATION.
* 
*     METHOD   FIND THE FILE SERVER CONNECTION ENTRY. 
* 
*              IF THE CONNECTION STATE IS *NULL*, *PCONACRQ*, *PENDING*,
*              OR *RETRYPEND*, TREAT AS A NAM PROTOCOL ERROR. 
* 
*              IF THE CONNECTION STATE IS *ENDPEND*,
*              THEN THE DATA BLOCK IS IGNORED.
* 
*              IF THE CONNECTION STATE IS *ACTIVE* THEN THE 
*              ACTION TAKEN FOR THE DATA BLOCK IS DEPENDENT ON THE
*              BLOCK TYPE AS FOLLOWS: 
* 
*                IF THE BLOCK TYPE IS *APPBLK*, APMSG*, *APPQBLK*,
*                OR *APPQMSG*.
*                  PROCESS IT ACCORDINGLY.
*                ELSE 
*                  END THE CONNECTION.
* 
# 
  
# 
****  PROC FFSDP - XREF LIST
# 
      XREF
        BEGIN 
        PROC FFSEESC;    # END SINGLE FILE SERVER CONNECTION           #
        PROC FFSEEFS;    # END ALL FILE SERVER CONNECTIONS             #
        FUNC FFSUFCE B;  # UTILITY TO FIND FILE SERVER CONNECTION ENTRY#
        PROC NETPUT;
        END 
# 
****
# 
      ITEM CODE          I;            # FUNCTION CODE OF DATA BLOCK   #
      CONTROL EJECT;
  
#     START MAIN PROCEDURE                                             #
  
      P<APDT> = LOC(INPBUF);           # BASE DATA BLOCK POINTER       #
      CURACN  = ABHADR[0];             # PICK UP CONNECTION NUMBER     #
  
#     CONNECTION STATE IS *NULL* - TREAT AS A NAM PROTOCOL ERROR.      #
  
      IF NOT FFSUFCE                   # FIND CONNECTION ENTRY         #
      THEN
        BEGIN 
        FFSEEFS (NDATA);               # NAM PROTOCOL ERROR            #
        END;
# 
*     CONNECTION STATE IS *PCONACRQ*, *PENDING* OR *RETRYPEND*
*     - TREAT AS A NAM PROTOCOL ERROR.
# 
      IF ACN$STATE[ACNX] LAN
        (PCONACRQ + PENDING + RETRYPEND) NQ 0 
      THEN
        BEGIN 
        FFSEEFS (NDATA);               # NAM PROTOCOL ERROR            #
        END;
# 
*     CONNECTION STATE IS *ENDPEND* - IGNORE. 
# 
      IF ACN$STATE[ACNX] LAN
        (ENDPEND) NQ 0
      THEN
        BEGIN 
        RETURN;                        # GET OUT OF HERE QUICKLY       #
        END;
  
# 
*     CONNECTION STATE IS *ACTIVE* :  
*     SUPPORT ONLY *BLK*, *MSG*, *QBLK* AND *QMSG* BLOCKS.
*     FOR ALL OTHER BLOCK TYPES, TREAT AS A CONNECTION PROTOCOL ERROR.
# 
      IF     (ABHABT[0] NQ APPBLK)
         AND (ABHABT[0] NQ APMSG) 
         AND (ABHABT[0] NQ APPQBLK) 
         AND (ABHABT[0] NQ APPQMSG) 
      THEN
        BEGIN 
        FFSEESC;                       # END THE CONNECTION ABNORMALLY #
        ACN$STATE[ACNX] = ENDPEND;     # CHANGE STATE TO END PENDING   #
        RETURN;                        # GET OUT OF HERE QUICKLY       #
        END;
  
      IND$ICODE[INAMTCP$] = INAM"INDATAV";     # DATA AVAIL INDICATION #
      IND$ADDR[INAMTCP$]  = LOC(INPBUF);       # DATA BUFFER ADDRESS   #
      IND$LEN[INAMTCP$] = ABHTLC[0];           # DATA LENGTH           #
      IF ABHABT[0] EQ APPBLK
      THEN
        BEGIN 
        IND$M[INAMTCP$] = TRUE;        # MORE DATA                     #
        IND$Q[INAMTCP$] = FALSE;       # NOT QUALIFY DATA              #
        END 
  
      IF ABHABT[0] EQ APMSG 
      THEN
        BEGIN 
        IND$M[INAMTCP$] = FALSE;       # NO MORE DATA                  #
        IND$Q[INAMTCP$] = FALSE;       # NOT QUALIFY DATA              #
        END 
  
      IF ABHABT[0] EQ APPQBLK 
      THEN
        BEGIN 
        IND$M[INAMTCP$] = TRUE;        # MORE DATA                     #
        IND$Q[INAMTCP$] = TRUE;        # QUALIFY DATA                  #
        END 
  
      IF ABHABT[0] EQ APPQMSG 
      THEN
        BEGIN 
        IND$M[INAMTCP$] = FALSE;       # NO MORE DATA                  #
        IND$Q[INAMTCP$] = TRUE;        # QUALIFY DATA                  #
        END 
  
      RETURN;                          # RETURN TO CALLER              #
  
      END                              # NFSDP                         #
  
      TERM
