*DECK QFSMAIN 
USETEXT COMCBEG 
USETEXT COMCAPR 
USETEXT COMCCAE 
USETEXT COMQDEF 
USETEXT COMQFIL 
USETEXT COMQNET 
    PROC QFSMAIN; 
      BEGIN    # QFSMAIN #
# 
**    QFSMAIN    QTFS MAIN ROUTINE. 
* 
*     QFSMAIN IS THE MAIN QTFS ROUTINE.  IT CONTROLS ALL ACTIVITY 
*     IN QTFS.
* 
*     PROC QFSMAIN
* 
*     ENTRY      (FROM QTFRES). 
* 
*     EXIT       (TO QTFRES)
*                IF XFRACN = 0: 
*                  STOP.
*                ELSE:  
*                  CALLS QTFXFR TO INITIATE FILE TRANSFER 
*                  RETURN TO QFSMAIN. 
* 
*     PROCESS    IF FIRST CALL: 
*                  PERFORM INITIALIZATIONS. 
*                IF RETURNING FROM NETXFR CALL: 
*                  CALL SFILS TO UPDATE STATUS. 
*                WHILE WORK TO DO:  
*                  IF NETWORK MESSAGE AVAILABLE:  
*                    CALL NMSG TO PROCESS MESSAGE.
*                  FOR EACH FILE TABLE ENTRY: 
*                    CALL SFILS TO UPDATE STATUS. 
*                  IF NO MESSAGES AVAILABLE 
*                    AND NOT RETURNING TO QTFRES: 
*                    CALL NETWAIT TO DELAY. 
# 
  
# 
****  XREF
# 
      XREF
        BEGIN 
        PROC FTUOFF;               # DISCONNECT FROM SUBSYSTEM #
        PROC INITS;                # INITIALIZE QTFS #
        PROC MSGLOG;               # LOG MESSAGE #
        PROC NAME;                 # DEBUG CODE # 
        PROC NMSG;                 # PROCESS NETWORK MESSAGE #
        PROC QTFWAIT;              # WAIT FOR TIME OR EVENT # 
        PROC RSECS;                # GET REAL-TIME CLOCK #
        PROC SFILS;                # UPDATE AND ADVANCE STATUS #
        FUNC XCDD       C(10);     # CONVERT TO DECIMAL DISPLAY CODE #
        END 
  
# 
****  XREF END
# 
  
  
      DEF LEMSGNFT   #31#;
      ARRAY EMSGNFT    S(4);
        BEGIN 
        ITEM $DNFT      C(00,00,LEMSGNFT) = 
                 [" QTF, XXXXXX FILES TRANSFERRED."]; 
        ITEM EMSGNFTNF  C(00,36,06);
        END 
  
      ARRAY S(1); 
        BEGIN 
        ITEM DUMWORD    C(00,00,10);
        ITEM DUMWDR6    C(00,24,06);
        END 
  
      ITEM DOIT       B;           # MAIN LOOP CONTROL #
      ITEM WAITTIME   U;           # SECONDS TO WAIT #
      ITEM ZEROACNS   I;           # INACTIVE LOOP COUNT #
  
        $BEGIN
        NAME("QFSMAIN");
        $END
  
      IF XFRACN GT 0               # IF RETURNING FROM NETXFR # 
      THEN
        BEGIN 
        ACN = XFRACN;              # FILE TABLE INDEX # 
        P<FILETAB> = AFT[ACN];
        XFRACN = 0;                # NO NETXFR CALL OUTSTANDING # 
        NOMSGCNT = 0;              # RESET SHORT WAIT COUNTER # 
        RSECS(TIM);                # GET REAL-TIME CLOCK #
        SFILS;                     # UPDATE AND ADVANCE AFT ENTRY # 
        END 
  
      ELSE
        BEGIN 
        IF XFRACN LT 0             # IF FIRST TIME CALLED # 
        THEN
          BEGIN 
          INITS;                   # NETON AND INITIALIZE # 
          XFRACN = 0; 
          END 
  
        END 
  
      DOIT = TRUE;                 # SET LOOP CONTROL FLAG #
      ASLONGAS DOIT                # MAIN LOOP #
      DO
        BEGIN 
        RSECS(TIM);                # GET REAL-TIME CLOCK #
        IF NSUPIORS                # IF NETWORK MESSAGES AVAILABLE #
        THEN
          BEGIN 
          ZEROACNS = 0;            # RESET INACTIVE LOOP COUNT #
          NMSG;                    # PROCESS NETWORK MESSAGE #
          END 
  
        IF SHUTDOWN 
        THEN
          BEGIN 
          DOIT = FALSE;            # TERMINATE LOOP # 
          CYCLE;
          END;
  
        SLOWFOR ACN = 1 STEP 1 UNTIL LACNMAX
        DO
          BEGIN 
          SFILS;                   # UPDATE AND ADVANCE AFT ENTRY # 
          END 
  
        DOIT = XFRACN EQ 0;        # EXIT IF NETXFR REQUIRED #
        IF (NOT NSUPIORS)          # IF NO NETWORK MESSAGES # 
          AND DOIT                 #   AND NOT EXITING #
        THEN
          BEGIN 
          WAITTIME = 60;
          IF ACNNO EQ 0            # IF NO CONNECTIONS ACTIVE # 
          THEN
            BEGIN 
            ZEROACNS = ZEROACNS + 1; # INCREMENT INACTIVE LOOP COUNT #
            IF ZEROACNS GT 1       # IF INACTIVE COUNT EXCEEDED # 
            THEN
              BEGIN 
              SHUTDOWN = TRUE;
              DOIT = FALSE;        # EXIT LOOP AND STOP # 
              CYCLE;
              END 
  
            WAITTIME = 10;         # WAIT FOR NEW CONNECTION #
            END 
  
          QTFWAIT (WAITTIME); 
          END 
  
        END  # ASLONGAS DOIT #
  
      IF SHUTDOWN 
      THEN
        BEGIN 
        FTUOFF; 
        IF NOLFN EQ 0 
        THEN
          BEGIN 
          EMSGNFTNF = "    NO"; 
          END 
  
        ELSE
          BEGIN 
          DUMWORD = XCDD(NOLFN);
          EMSGNFTNF = DUMWDR6;
          END 
  
        MSGLOG(LOC(EMSGNFT),LEMSGNFT);
        END 
  
      END  # QFSMAIN #
    TERM
