*DECK NETXFRC 
*IF DEF,XFR 
USETEXT AIPDEF
USETEXT NP$GETS 
USETEXT HEADER
USETEXT NP$NWL
USETEXT NP$TAA
USETEXT NX$ACBX 
USETEXT NX$ACBF 
USETEXT NX$MSG
PROC NETXFRC; 
 #
*1DC  NETXFRC 
* 
*    1.PROC NAME      AUTHOR            DATE
*      NETXFRC        L.T.NGUYEN        83/03/25
* 
*    2.FUNCTINAL DESCRIPTION: 
*      CONTINUE TO PROCESS FILE TRANSFER UNTIL ENCOUNTER
*      A NULL BLOCK.
* 
*    3.METHOD : 
*                SET MORETODO = TRUE
*                LOOP UNTIL MORETODO IS FALSE:  
*                  GET BLOCK FROM LIST 1. 
*                  IF BLOCK TYPE IS NULL
*                    THEN SET MORETODO = FALSE. 
*                  ELSE 
*                    CALL PRDATA FOR APPROPRIATE ACTION BY STATE TABLE
*                    PROCESSOR. 
*                  END OF LOOP
* 
*                GET CURRENT TIME.
*                CHECK FOR TIME EXPIRED.
*                IF TIME EXPIRED
*                  THEN CALL STATE TABLE PROCESSOR WITH TIME OUT TRIGGER. 
*                RETURN.
* 
*    4.INPUT PARAMS:  
*                FTTINDEX - INDEX INTO FTT TABLE ( GLOBAL ).
* 
*    5.EXIT PARAMS: 
*                NONE.
* 
*    6.PROC CALLED: 
*                NP$GET - TO GET BLOCK. 
*                PRDATA - PROCESS DATA. 
* 
* 
* 
* 
 #
      BEGIN 
      XREF
        BEGIN 
        PROC NP$MSG ; 
        PROC NP$SMSG ;
        PROC NP$DATA; 
        PROC NP$GET ; 
        PROC NP$XLOC ;
        PROC NP$RCL;
        PROC NP$RTIM ;
        PROC NP$STPR ;
        END 
  
      SWITCH ST$ORD ST$ORD0,ST$ORD1,ST$ORD2,ST$ORD3,CALL$ST,ST$ORD4 ; 
      ITEM I ;
      ITEM BTRIG ;
      ITEM TRIGGER U ;
  
      MORETODO = TRUE ;      # ASSUMING THERE IS THINGS TO DO          #
  
      FOR I = I WHILE MORETODO AND (ID$FLAG NQ 0) AND (SD$FLAG EQ 0)
                      AND (HEAD EQ FOOT)
      DO
        BEGIN                # LOOP TO GET BLOCK                       #
        ACLN = XFR$LIST ;              # GET ONLY FROM XFR (1) LIST    #
        LOC$HA = LOC(DATA$WORD[0]);    # APPL. BLOCK HEADER            #
        LOC$TA = LOC(DATA$WORD[1]);    # TEXT AREA                     #
        TLMX = MXIVT$SIZE ;            # MAX BLOCK SIZE                #
  
        OPCODE = OP$GETL ;
        NWL[NEXT] = 0 ; 
        NWL$TA[NEXT] = LOC$TA ; 
        BS = OPABHSIZ ; 
  
        NP$GET ;                       # GO GET IT                     #
  
        P<HEADER> = LOC$HA ;
        IF ABHABT[0] EQ APPNULL 
        THEN
          MORETODO = FALSE ;           # LIST FOR XFR IS EMPTY         #
        ELSE
          BEGIN 
          NP$XLOC(ABHADR[0]) ;         # LOCATE THE FTT ENTRY          #
          IF ABHABT[0] EQ APPCMD
          THEN
            NP$SMSG ; 
          ELSE
            NP$DATA ;                  # CALL TO PROCESS APPROPRIATELY #
          END 
  
        END                            # LOOP TO GET                   #
      FOR I = 0 STEP 1 WHILE I LS MAXFILEXFR
      DO
        BEGIN                          # LOOP TO FIND TIME OUT CONN.   #
        FTTINDEX = I ;
        P<STATUSWORD> = FTTSTATUS[I] ;
        IF FTTACN[I] NQ 0 
           AND STATUSWD LQ IN$PROG       # NO ERROR FOUND YET          #
        THEN
          BEGIN                        # ACTIVE ENTRY                  #
          NP$RTIM(TIME$WORD) ;
          IF (FTTTIME[I] + FTTTIMOUT[I]) LQ TIME$SEC[0] 
          THEN
            BEGIN                      # TIMEOUT DETECTED              #
            GOTO ST$ORD[FTTSTORD[I]] ;
  
            ST$ORD0:                     # SENDER/PRU                  #
              IF FTTSTATE[I] NQ NSPDATR 
              THEN
                BEGIN                  # NOT IN DATA PHASE             #
                TRIGGER = NRSTIMO;     # TIME OUT TRIGGER              #
                GOTO CALL$ST ;
                END 
              ELSE
                GOTO ST$ORD4 ;
  
            ST$ORD1:                     # RECEIVER/PRU                #
              IF FTTSTATE[I] NQ NRPPRDA 
              THEN
                BEGIN                  # NOT IN DATA PHASE             #
                TRIGGER = NRSTIMO;     # TIME OUT                      #
                GOTO CALL$ST ;
                END 
              ELSE
                GOTO ST$ORD4 ;
  
            ST$ORD2: TRIGGER = NSCTIMO;  # SENDER/CHARACTER            #
                     GOTO CALL$ST;
            ST$ORD3: TRIGGER = NRCTIMO;  # RECEIVER/CHARACTER          #
                     GOTO CALL$ST;
            CALL$ST:                     # READY TO CALL STATE TABLE   #
              NP$STPR(FTTINDEX,TRIGGER,0)   ;# CALL THE PROCESSOR      #
  
            ST$ORD4:  
              # 
              CONTINUE THE FOR LOOP.
              # 
  
            END                        # TIME OUT DETECTED             #
          ELSE
            BEGIN                        # NO TIME OUT                 #
            IF FTTSTORD[I] EQ CHARSEND   # CHAR SENDER                 #
            THEN
              BEGIN 
              IF FTTSTATE[I] EQ NSCCABL  # WAITING FOR WINDOW OPEN     #
              THEN
                BEGIN 
                NP$RCL(0);               # TIME RECALL                 #
                END 
              ELSE
                BEGIN 
                IF FTTSTATE[I] EQ NSCDATA    # IN DATA STATE           #
                THEN
                  BEGIN                  # IN SENDING DATA MODE        #
                  TRIGGER = NSCTSND ;    # SEND TRIGGER TO STATE TABLE #
                  FOR I = I WHILE TRIGGER NQ NIL
                  DO
                    BEGIN                # LOOP UNTIL NO BACK TRIGGER  #
                    NP$STPR(FTTINDEX,TRIGGER,BTRIG) ; 
                    TRIGGER = BTRIG ; 
                    END 
                  END 
                END 
              END                      # ACTIVE ENTRY                  #
            END                        # LOOP TO FIND TIME OUT CONN.   #
          END 
        END 
        RETURN; 
      END 
      TERM
*ENDIF
