*DECK SFILS 
USETEXT COMCBEG 
USETEXT COMCAPR 
USETEXT COMCCAE 
USETEXT COMQDEF 
USETEXT COMQFIL 
USETEXT COMQKDS 
USETEXT COMQNET 
    PROC SFILS; 
      BEGIN    # SFILS #
# 
**    SFILS      UPDATE AND ADVANCE SERVICER FILE TABLE ENTRY STATUS. 
* 
*     SFILS IS CALLED PERIODICALLY FOR EACH FILE TABLE ENTRY TO 
*     DETERMINE THE CURRENT STATE OF THE FILE AND CONNECTION
*     AND TO INITIATE APPROPRIATE ACTION BASED THEREON. 
* 
*     PROC SFILS
* 
*     ENTRY      ACN = FILE TABLE ENTRY INDEX 
*                FILEFTS = CURRENT FILE TRANSFER STATE. 
* 
*     EXIT       FILEFTS = UPDATED IF POSSIBLE
*                XFRACN = IF NON-ZERO, ACN REQUIRING FILE TRANSFER
*                APPROPRIATE PROCESSORS CALLED. 
* 
*     PROCESS    CASE FILEFTS OF: 
*                  VACANT:  
*                    RETURN.
*                  INITIAL STATE: 
*                    INCREMENT ACNS-IN-USE
*                    FILEFTS = WAITING FOR NETWORK MESSAGE. 
*                  WAITING FOR NETWORK MESSAGE: 
*                    IF TIMEOUT EXPIRED:  
*                      CALL CONERR ("CONNECTION TIMEOUT."). 
*                  ASSIGNED AND CONNECTED:  
*                    IF CONNECTION NOT BROKEN:  
*                      CALL RELAFT TO RELEASE AFT ENTRY 
*                      RESTORE AFT CONNECTION-RELATED FIELDS
*                      FILEFTS = WAITING FOR NETWORK MESSAGE
*                    ELSE:  
*                      FILEFTS = TERMINATED.
*                  NETXFR REQUIRED: 
*                    IF NO OUTSTANDING NETXFR-INITIATION REQUEST: 
*                      SET FLAG TO CALL NETXFR. 
*                  NETXFR IN PROGRESS:  
*                    IF NETXFR COMPLETE:  
*                      CALL XFRERR TO PROCESS NETXFR COMPLETION STATUS
*                      IF CONNECTION NOT BROKEN:  
*                        FILEFTS = WAITING FOR NETWORK MESSAGE. 
*                      [NOTE: WHEN QTFS IS CONFIGURED TO ALLOW MULTIPLE 
*                             CONNECTIONS, DUE TO THE DESIGN OF THE 
*                             LEVEL 7 PROTOCOL AND NETXFR ITSELF, IT
*                             MAY BE POSSIBLE FOR THE STOP COMMAND TO BE
*                             RECEIVED AND PROCESSED BEFORE SFILS IS
*                             CALLED TO UPDATE STATUS.  THUS, A CHECK 
*                             IS MADE IN RCM04 (STOP COMMAND PROCESSOR) 
*                             FOR THIS SITUATION AND SFILS WILL BE
*                             CALLED FROM THERE IF NECESSARY. ] 
*                  TRANSFER COMPLETE AND SUCCESSFUL:  
*                    CALL QUEFIL TO QUEUE FILE
*                    IF CONNECTION NOT BROKEN:  
*                      FILEFTS = STOPR REQUIRED 
*                    ELSE:  
*                      FILEFTS = TERMINATED.
*                  STOPR REQUIRED:  
*                    BUILD STATE-OF-TRANSFER ATTRIBUTE
*                    CALL CMDPUT TO ISSUE STOPR 
*                    FILEFTS = WAITING FOR NETWORK MESSAGE. 
*                  TRANSFER COMPLETE, CONNECTION ENDED: 
*                    CLEAR FLAGS
*                    FILEFTS = VACANT.
*                  OTHERWISE: 
*                    ABORTQ("INVALID STATE.").
# 
  
# 
****  XREF
# 
      XREF
        BEGIN 
        PROC ABORTQ;               # INTERNAL ERROR # 
        PROC ACSTORE;              # STORE LEVEL 7 COMMAND #
        PROC ACTLOG;               # LOG ACCOUNTING MESSAGES #
        PROC APSTOR;               # STORE LEVEL 7 PARAMETER #
        FUNC CCOUNT     U;         # COUNT SIGNIFICANT CHARACTERS # 
        FUNC CLOCK      C(10);     # RETURN SYSTEM CLOCK #
        PROC CMDPUT;               # SEND LEVEL 7 COMMAND # 
        PROC CMMAGR;               # ASSIGN CMM GROUP # 
        PROC CONERR;               # PROCESS CONNECTION ERROR # 
        PROC FREENTA;              # SET NETWORK BUFFER ADDRESS # 
        PROC MSGLOG;               # ISSUE MESSAGE #
        PROC NAME;                 # DEBUG CODE # 
        FUNC PRUCNT     U;         # DETERMINE FILE SIZE #
        PROC QUEFIL;               # ROUTE FILE TO QUEUE #
        PROC RELAFT;               # RELEASE AFT ENTRY #
        PROC RMTSMB;               # SEND MESSAGES TO REMOTE HOST # 
        FUNC TIMADT     U;         # ADJUST TIMER # 
        PROC TXTREL;               # RELEASE TEXT BUFFERS # 
        PROC UPKTR1;               # UPDATE TRANSFER K DISPLAY #
        PROC XFRERR;               # PROCESS NETXFR STATUS #
        FUNC XCDD       C(10);     # CONVERT TO DECIMAL DISPLAY CODE #
        END 
  
# 
****  XREF END
# 
  
  
      ITEM I          I;           # FOR LOOP INDEX # 
      ITEM PREVSTATE  I;           # PREVIOUS TRANSFER STATE #
      ITEM TIMELEFT   I;           # SECONDS LEFT UNTIL TIMEOUT # 
      ITEM TMPABL     U;           # TEMPORARY ABL #
      ITEM TMPABN     U;           # TEMPORARY ABN #
      ITEM TMPCPD     U;           # TEMPORARY CPD #
      ITEM TMPDBZ     U;           # TEMPORARY DBZ #
      ITEM TMPNHA     U;           # TEMPORARY NHA #
      ITEM TMPRBN     U;           # TEMPORARY RBN #
  
      DEF LEMSG7     #21#;
      ITEM EMSG7      C(LEMSG7) = "CONNECTION TIMED OUT.";
  
      DEF LEMSGACN  #56#; 
      ITEM EMSGACN C(LEMSGACN) =
         " QTF, COUNT OF ACTIVE CONNECTIONS DECREMENTED BELOW ZERO."; 
  
*CALL COMQSWI 
  
        $BEGIN
        NAME("SFILS");
        $END
  
      IF AFT[ACN] EQ 0
      THEN
        BEGIN 
        RETURN; 
        END 
  
      P<FILETAB> = AFT[ACN];
      PREVSTATE = -1; 
      ASLONGAS PREVSTATE NE FILEFTS 
      DO
        BEGIN 
        PREVSTATE = FILEFTS;
        GOTO FTSIS[FILEFTS];       # SIMULATED CASE STATEMENT # 
  
SWI$VACANT: 
  
# 
*     UNUSED ENTRY. 
# 
  
          GOTO SWIEND;             # DO NOTHING # 
  
SWI$INIT: 
  
# 
*     INITIAL STATE.
# 
  
          ACNNO = ACNNO + 1;
          MSGWFAACN1 = " "; 
          MSGWFAACN2 = ACNNO + O"33"; 
          FILESTR = CLOCK(TMPCPD);
          FILEFTS = FTS$WNMSG;
          GOTO SWIEND;
  
SWI$WNMSG:  
  
# 
*     WAITING FOR NETWORK MESSAGE.
# 
  
          IF (FILETIM NE 0) 
          THEN
            BEGIN 
            TIMELEFT = TIMADT(FILETOU, FILETIM);
            IF (TIMELEFT EQ 0)
            THEN
              BEGIN 
              CONERR(LOC(EMSG7),LEMSG7); # PROCESS TIMEOUT ERROR #
              END 
  
            END 
  
          GOTO SWIEND;
  
SWI$ASGCON: 
  
# 
*     ASSIGNED AND CONNECTED. 
# 
  
          IF FILECE                # IF CONNECTION ENDED #
          THEN
            BEGIN 
            FILEFTS = FTS$CMPCNT; 
            END 
  
          ELSE
            BEGIN 
            TMPABL = FILEABL; 
            TMPCPD = FILECPD; 
            TMPABN = FILEABN; 
            TMPDBZ = FILEDBZ; 
            TMPNHA = FILENHA; 
            FILENHA = 0;
            TMPRBN = FILERBN; 
            RELAFT; 
            FILECM = TRUE;         # CONNECTION MADE #
            CMMAGR(0, I);          # ASSIGN NEW GROUP # 
            FILECMM = I;
            FILECPD = TMPCPD;      # RESTORE CPD #
            FILEABL = TMPABL;      # RESTORE ABL #
            FILEABN = TMPABN;      # RESTORE ABN #
            FILEDBZ = TMPDBZ;      # RESTORE DBZ #
            FILENHA = TMPNHA;      # RESTORE NHA #
            FILERBN = TMPRBN;      # RESTORE RBN #
            FILETIM = TIMT;        # RESTORE TIME # 
            FILESTR = CLOCK(TMPCPD);
            FILETOU = TIMEOUT;
            FILEFTS = FTS$WNMSG;
            END 
  
          GOTO SWIEND;
  
SWI$XFRREQ: 
  
# 
*     NETXFR REQUIRED.
# 
  
          IF XFRACN EQ 0
          THEN
            BEGIN 
            XFRACN = ACN;          # SET FLAG FOR QTFXFR #
            END 
  
          GOTO SWIEND;
  
SWI$XFRIPG: 
  
# 
*     NETXFR IN PROGRESS. 
# 
  
          IF FILESTS GT 0          # IF NETXFR COMPLETE # 
          THEN
            BEGIN 
            XFRERR;                # PROCESS NETXFR STATUS #
            IF NOT FILECE          # IF CONNECTION STILL VIABLE # 
            THEN
              BEGIN 
              FILEFTS = FTS$WNMSG; # WAITING FOR NETWORK MESSAGE #
              FILETIM = TIMT; 
              END 
  
            END 
  
          GOTO SWIEND;
  
SWI$CMPOK:  
  
# 
*     TRANSFER SUCCESSFUL.
# 
  
          IF FILELFN NE 0 
          THEN
            BEGIN 
            FILESIZ = PRUCNT(FILELFNC); 
            QUEFIL;                # ROUTE FILE TO QUEUE #
            END 
  
          IF NOT FILECE            # IF CONNECTION NOT ENDED #
          THEN
            BEGIN 
            FILEFTS = FTS$STPREQ;  # STOPR REQUIRED # 
            END 
  
          ELSE
            BEGIN 
            FILEFTS = FTS$CMPCNT;  # TERMINATED # 
            END 
  
          GOTO SWIEND;
  
SWI$STPREQ: 
  
# 
*     STOPR REQUIRED. 
# 
  
          FREENTA;                 # SET NETWORK BUFFER ADDRESS # 
          ACSTORE (NTA$B, CM$STPR, NTLMAX); 
          IF (NOT FILECER)         # IF NO ERROR #
            AND FILER3             # AND GO RECEIVED #
            AND (FILESTX EQ STO$NORMAL) 
          THEN
            BEGIN 
            APSTOR(NTA$B,AT$JN,ATQ$S,CCOUNT(FILEJBN),FILEJBN);
            NOLFN = NOLFN + 1;
            KL$TINF = XCDD(NOLFN);
            ACTLOG;                # LOG ACCOUNTING MESSAGES #
            END 
  
          APSTOR(NTA$B,AT$ST,ATQ$S,AT$STL,STO$STX[FILESTX]);
          RMTSMB;                  # SEND ANY MESSAGES TO REMOTE #
          FILES5 = TRUE;           # STOPR SENT # 
          FILEBNO = CM$STPR;
          CMDPUT;                  # SEND COMMAND # 
          TXTREL;                  # RELEASE TEXT BUFFERS # 
          FILEFTS = FTS$ASGCON;    # CLEAN UP AFT ENTRY # 
          GOTO SWIEND;
  
SWI$CMPCNT: 
  
# 
*     TRANSFER COMPLETE, CONNECTION TERMINATED. 
# 
  
          ACNNO = ACNNO - 1;
          IF ACNNO LS 0 
          THEN
            BEGIN 
            ACNNO=0;
            MSGLOG(LOC(EMSGACN),LEMSGACN);
            END 
  
          MSGWFAACN2 = ACNNO + O"33"; 
          RELAFT;                  # RELEASE AFT ENTRY #
          GOTO SWIEND;
  
# 
*     ALL OTHER STATES ARE INVALID IN QTFS. 
# 
  
SWI$ASGUNC: 
SWI$ETPREQ: 
SWI$UNCNFA: 
SWI$CONNFA: 
SWI$UNCWQR: 
SWI$CONWQR: 
  
          ABORTQ("SFILS");
  
SWIEND: 
  
# 
*     END OF SIMULATED CASE STATEMENT.
# 
  
        END                        # ASLONGAS # 
  
      IF FILEPTS NE FILEFTS        # IF FILE STATE CHANGED #
      THEN
        BEGIN 
        FILEPTS = FILEFTS;         # UPDATE DISPLAY # 
        UPKTR1(ACN);
        END 
  
      END  # SFILS #
    TERM
