*DECK RHFXFR
USETEXT COMCBEG 
USETEXT COMADEF 
USETEXT COMACBF 
USETEXT COMACBX 
USETEXT COMADFM 
USETEXT COMAMCB 
PROC RHFXFR(ACN,FILENAME,OPCODE,STATIS,NOWAIT,DATADEC,TIMEOUT,ABL,
            FACIL,MBZ,ACKW,CRESNO,PRESNO);
# TITLE RHFXFR - INITIATE TRANSFER OF A FILE.  #
  
      BEGIN  # RHFXFR # 
  
# 
**    RHFXFR - INITIATE TRANSFER OF A FILE. 
* 
*     RHFXFR INITIATES DATA-TRANSFERS TO A REMOTE APPLICATION AND 
*     UNLESS IMMEDIATE RETURN IS REQUESTED, CALLS RHFXFRC UNTIL THE 
*     TRANSFER IS COMPLETE. 
* 
*     PROC RHFXFR(ACN,FILENAME,OPCODE,STATIS,NOWAIT,DATADEC,TIMEOUT)
* 
*     ENTRY      ACN        - APPLICATION CONNECTION NUMBER.
*                FILENAME   - FILE NAME TO BE TRANSFERRED, IN DISPLAY 
*                             CODE, 7 CHARACTERS MAXIMUM. 
*                OPCODE     = 0, FILE TO BE RECEIVED FROM THE NETWORK 
*                           .NE. 0, FILE TO BE SENT TO THE NETWORK. 
*                STATIS     - CALLING PROGRAM REPLY STATUS WORD 
*                NOWAIT     = 0, RETURN FROM NETXFR CALL WHEN THE FILE
*                             TRANSFER IS COMPLETED.
*                           = 1, RETURN FROM NETXFR CALL IMMEDIATELY. 
*                DATADEC    - FORMAT OF THE DATA THAT IS TO BE
*                             TRANSFERRED.
*                           = 0, UH - THE FILE CONTAINS BINARY DATA 
*                                     WITH EMBEDDED CONTROL WORDS.
*                             1, UU - THE FILE CONTAINS BINARY DATA IN
*                                     AN UNSTRUCTURED (NO EOR/EOFS) 
*                                     FORMAT. 
*                             2, US - THE FILE CONTAINS BINARY DATA IN
*                                     A STRUCTURED FORMAT.
*                             3, C6 - THE FILE CONTAINS 6-BIT DISPLAY 
*                                     CODE DATA WITH Z-BYTE RECORDS AND 
*                                     PHYSICAL BOUNDARIES (EOR/EOFS). 
*                             4, C8 - THE FILE CONTAINS 8-BIT ASCII IN
*                                     12-BIT BYTES, 5 CHARACTERS TO A 
*                                     WORD.  LINES ARE TERMINATED BY
*                                     Z-BYTES. PHYSICAL BOUNDAARIES MAY 
*                                     EXIST.
*                              NOTE:  CODED FILES (C6 AND C8) ARE CON-
*                                     VERTED TO A FILE STRUCTURE KNOWN
*                                     INTERNALLY BY FIP AS CN.  CN
*                                     FILES ARE 8-BIT ASCII IN 12-BIT 
*                                     BYTES USING UNIT SEPARATOR
*                                     CHARACTERS FOR END OF LINES.  THE 
*                                     CN FORMAT IS HOW ALL CODED FILES
*                                     ARE TRANSMITTED/RECEIVED BY FIP 
*                                     TO/FROM THE NETWORK DRIVER (NDR). 
*                                     CN MUST NOT BE SPECIFIED BY AN
*                                     APPLICATION.
*                TIMEOUT    - TIME IN SECONDS TO WAIT FOR A FUNCTION
*                             RESPONSE BEFORE TIMING OUT. 
* 
* 
*                THE FOLLOWING PARAMETERS ARE PROVIDED FOR NAM/AIP
*                NETXFR COMPATABILITY.
* 
*                ABL        - APPLICATION BLOCK LIMIT.
*                FACIL      - FACILITITIES. 
*                MBZ        - MAXIMUM DATA BLOCK SIZE.
*                ACKW       - ACKNOWLEDGE WINDOW. 
*                CRESNO     - RETURN VALUE. 
*                PRESNO     - RETURN VALUE. 
* 
* 
*     EXIT       STATIS =  TERMINATING. 
*                       =  INITIATING.
*                       =  IN PROCESS.
*                       =  COMPLETE, NO ERROR.
*                       =  UNDEFINED ERROR. 
*                       =  CONNECTION BROKEN DETECTED.  (APPLICATION
*                          IS EXPECTED TO SEND CON/END/R RESPONSE.) 
*                       =  PROTOCOL ERROR.
*                       =  TIMED OUT WAITING FOR RESPONSE FROM
*                          NETWORK. 
*                       =  OUTPUT BLOCK NOT DELIVERED AFTER THREE 
*                          RETRIES. 
*                       =  TOO MANY FILE TRANSFERS HAVE BEEN INITIATED. 
*                       =  ACN NOT WITHIN ALLOWABLE RANGE.
*                       =  SECOND FILE TRANSFER ATTEMPTED ON ACN. 
*                       =  CIO ERROR DETECTED.
*                       =  PREMATURE TERMINATION RECEIVED FROM
*                          REMOTE APPLICATION.
*                       =  TRANSFER COMPLETE WITH NO ERRORS, BUT
*                          RHF HAS REQUESTED IDLEDOWN.
*                       =  TRANSFER TERMINATED WITH ERROR AND 
*                          RHF HAS REQUESTED IDLEDOWN.
*                       =  RHF HAS ISSUED A DISABLE WARNING.
*                       =  NDR I/O ERROR. 
*                       =  INVALID DEVICE TYPE. 
*                       =  TIMED OUT WAITING FOR CODE CONVERSION. 
*                          (FOR NUMERICAL VALUES SEE FIP DOCUMENTAION)
* 
*     PROCESS    IF DATADEC VALUE OUT OF RANGE: 
*                  CALL DAYFMSG *BAD DD PARAMETER*, AND ABORT.
*                SET STATIS = INITIATING. 
*                IF ACN OUT OF RANGE: 
*                  CALL DAYFMSG *ACN XXXX NOT WITHIN RANGE* 
*                  SET STATIS = ACN$NWAR. 
*                IF MAX TRANSFERS IN PROGRESS:  
*                  CALL DAYFMSG *GT 4 FILE TRANSFERS INITIATED* 
*                  SET STATIS = GTMAXXFERS. 
*                IF STATIS = INITIATING:  
*                  INCREMENT NUMFILEXFR.
*                  SET LASTXFRACN = ACN.
*                  CALL XFRINIT TO INITIATE TRANSFER. 
*                  IF STATIS .NE. INITIATING: 
*                    RETURN.
*                  CALL XFRINIT TO INITIALIZE AND PREPARE FOR FILE
*                    TRANSFER.
*                  CALL CALLNP TO NETPUT A -LST/OFF/R- MESSAGE TO TURN
*                    OFF LIST PROCESSING FOR THIS ACN.
*                  IF NOWAIT IS FALSE,
*                  THEN:  
*                    SET RCLCNT = MAXFTTCOUNT 
*                    WHILE STATIS .LE. 0: 
*                      ENTER PERIODIC RECALL FOR 1/2 SEC
*                      CALL RHFXFRC TO CONTINUE ACTIVE TRANSFERS
*                      DECREMENT RCLCNT 
*                      IF RCLCNT .LE. 0 OR NOT TRANSFERRING DATA
*                        CALL CALLNG TO FETCH ASYNCHRONOUS MESSAGES 
*                        CALL PRASM TO PROCESS ASYNCH MESSAGES
*                        IF WAITING FOR CONVERT MODE RESOURCES
*                        THEN 
*                          CALL NETWAIT. (WAITING FOR CON. RES.)
*                          SET CON. RES. RETRY COUNT TO ZERO TO 
*                            ALLOW ANOTHER SELECT REQUEST IMMEDIATELY.
*                        SET RCLCNT = MAXFTTCOUNT 
*                        IF CONVERTING DATA 
*                          DIVIDE RCLCNT BY 10
*                        CALL RHFXFRC TO CONTINUE ACTIVE TRANSFERS
*                    IF IDLEDOWN IS TRUE, 
*                    THEN:  
*                      IF STATIS IS COMPLETE, NO ERROR, 
*                      THEN:  
*                        SET STATIS TO INDICATE COMPLETE, NO ERROR AND
*                          IDLEDOWN CONDTION. 
*                      ELSE:  
*                        SET STATIS TO INDICATE COMPLETE WITH ERROR 
*                        AND IDLEDOWN CONDITION.
*                ELSE:  
*                  CALL DAYFMSG TO WRITE ERROR MESSAGE INTO DAYFILE.
*                  SET STATIS TO INDICATE MORE THAN 4 FILE TRANSFERS
*                    ATTEMPTED. 
*                RETURN.
*                CALL INTAMSG SO THAT INTAMSG GETS LOADED WITH RHFXFR.
* 
*     NOTE    -  AN OVERLAY WHICH REFERENECES THIS MODULE MUST REMAIN 
*                IN CM UNTIL ALL FILE TRANSFERS ARE COMPLETE. 
* 
# 
      ITEM ACN        I;             # APPLICATION CONNECTION NUMBER #
      ITEM FILENAME   C(7);          # FILE NAME #
      ITEM OPCODE     I;             # OPERATION CODE # 
      ITEM STATIS     I;             # CALLER-S STATUS WORD # 
      ITEM NOWAIT     B;             # RETURN ASAP FLAG # 
      ITEM DATADEC    I;             # DATA DECLARATION # 
      ITEM TIMEOUT    I;             # TIME TO WAIT FOR RESPONSE #
      ITEM FACIL      C(1);        # FACILITIES # 
      ITEM ABL        I;           # APPLICATION BLOCK LIMIT #
      ITEM MBZ        I;           # MAXIMUM DATA BLOCK SIZE #
      ITEM ACKW       I;           # ACKNOWLEDGE WINDOW # 
      ITEM CRESNO     I;           # RETURN VALUE # 
      ITEM PRESNO     I;           # RETURN VALUE # 
  
      XDEF
        BEGIN 
        LABEL NETXFR1;               # DUMMY XDEF TO LOAD INTAMSG # 
        END 
                                     # AND TO LOAD PRSTFIP #
  
# 
****  PROC RHFXFR - XREF LIST BEGIN.
# 
  
      XREF
        BEGIN 
        PROC CALLNG;                 # NETGET A MESSAGE # 
        PROC DAYFMSG;                # DAYFILE A MESSAGE #
        FUNC DECCHF     C(10);       # DECIMAL DISPLAY CODE # 
        PROC INTAMSG;                # INTERCEPT ASYNCHRONOUS MESSAGES #
        PROC RHFXFRC;                # CONTINUE FILE TRANSFERS #
        PROC NPLSTM;                 # NETPUT LIST MESSAGE #
        PROC PRASM;                  # PROCESS AN ASYNCHRONOUS MESSAGE #
        PROC PRSTFIP;                # PRESET FIPXFR COMMON BLOCKS #
        PROC CALLSYS;                # MAKES RA+1 CALLS # 
        FUNC REPZERO    C(7);        # REPLACE TRAILING ZEROES #
        PROC XFRINIT;                # INITIALIZE FOR FILE TRANSFER # 
        END 
  
# 
****  PROC RHFXFR - XREF LIST END.
# 
      ITEM RCLCNT     I = 0;         # COUNT OF RECALLS # 
                                               CONTROL EJECT; 
      DBGXFR = DBGXFR + 1;
      P<STATUSWORD> = LOC (STATIS); 
  
      IF DATADEC LT MINDD OR
         DATADEC GT MAXDD 
      THEN
        BEGIN  # INVALID DATA DECLARATION # 
        FDFM$VALU2[BADDDP$ERR] = DECCHF (DATADEC,2);
        DAYFMSG (BADDDP$ERR);      # SEND MESSAGE AND ABORT CP #
        END 
  
      STATIS = INITIATING;         # INITIAL STATUS # 
      IF (ACN LT MINIACN)          # IF ACN INVALID # 
        OR (ACN GT MAXIACN) 
      THEN
        BEGIN 
        IDFM$ACNO[ACN$NWAR] = DECCHF(ACN,4);
        DAYFMSG (ACN$NWAR);        # DAYFILE MESSAGE #
        STATIS = ACN$NWAR;         # SET ERROR #
        END 
  
      IF NUMFILEXFR GE MAXFILEXFR  # IF MAX TRANSFERS IN PROGRESS # 
      THEN
        BEGIN 
        DAYFMSG (GTMAXXFERS);      # DAYFILE MESSAGE #
        STATIS = GTMAXXFERS;       # SET ERROR #
        END 
  
      IF STATIS EQ INITIATING      # IF NO ERROR #
      THEN
        BEGIN  # INITIATE A FILE TRANSFER  #
        NUMFILEXFR = NUMFILEXFR + 1;
        LASTXFRACN = ACN;            # SAVE ACN FOR ERROR PROCESSING #
  
# 
*     INITIATE THE FILE TRANSFER. 
# 
  
        IDFM$LFN2[INITIATING] = REPZERO(FILENAME);
        DAYFMSG (INITIATING); 
        XFRINIT (ACN, FILENAME, OPCODE, STATUSWORD, DATADEC,
                 TIMEOUT, NOWAIT);
        IF STATIS NE INITIATING    # IF ERROR DURING SETUP #
        THEN
          BEGIN 
          RETURN; 
          END 
  
  
# 
*       NETPUT A LST/OFF/R MESSAGE FOR THIS ACN.
# 
  
        LST$ONOFF[0] = FALSE; 
        LST$ACN[0] = ACN; 
        NPLSTM;                      # NETPUT LST/OFF/R MESSAGE # 
  
        IF NOT NOWAIT 
        THEN
          BEGIN  # COMPLETE THIS FILE TRANSFER AND CONTINUE ALL OTHERS #
          RCLCNT = MAXFTTCOUN;     # SET RHFXFRC CALL COUNTER # 
          ASLONGAS  STATIS  LE  IN$PROGRES  DO
            BEGIN 
            RCLRECALL[0] = FALSE; 
            RCLPERIOD[0] = XFRDELAY;
            CALLSYS (RCLCALL);       # ENTER PERIODIC RECALL #
            RHFXFRC;  # CONTINUE TRANSFER OF ACTIVE FILES # 
            RCLCNT = RCLCNT - 1;   # DECREMENT RHFXFRC CALL COUNTER # 
            IF RRB$DONE[0] AND
              ((RCLCNT LE 0)
                OR (FTTSTATE NE S"DATAXFRPRG")) 
            THEN
              BEGIN 
              RRB$ACN[0] = 0; 
              SSCXRECALL[0] = TRUE; 
              CALLNG (HWIASMSG, TAIASMSG);  # FETCH ANY ASYNC MSG # 
              IF FTTSTATE EQ S"WFORCMRES" 
                AND BKF$DONE[0] 
              THEN
                BEGIN 
                BKF$DONE[0] = FALSE;
                BKF$STIME[0] = FTTTIMEOUT/2;
                BKF$FNCNUM[0] = NETWAITFNC; 
                BKF$RTNFLG[0] = FALSE;
                BKF$WCM[0] = 1; 
                BKF$WCMACN[0] = FTTACN; 
                SSCXPARAMA[0] = LOC(BKFORRQRLY);
                SSCXRECALL[0] = TRUE; 
                CALLSYS(SSCXCALL);
                SSCXRECALL[0] = FALSE;
                FTTCOUNT = 1; 
                FTTDLYCTR = 0;
                END 
  
              SSCXRECALL[0] = FALSE;
              PRASM (HWIASMSG, TAIASMSG); 
# 
*             RESET RHFXFRC CALL COUNT. 
# 
              IF FTTCVTMODE        # IF CONVERTING DATA # 
              THEN
                BEGIN 
                RCLCNT = (MAXFTTCOUN+9)/10; 
                END 
  
              ELSE                 # IF NOT CONVERTING DATA # 
                BEGIN 
                RCLCNT = MAXFTTCOUN;
                END 
  
              RHFXFRC;  # CONTINUE TRANSFER OF ACTIVE FILES # 
              END 
            END 
  
          IF IDLEDOWN 
          THEN
            BEGIN 
            IF STATIS EQ CMPL$NO$ER 
            THEN
              BEGIN 
              STATIS = TCNOERRIDL;
              END 
  
            ELSE
              BEGIN 
              STATIS = TTERRIDLED;
              END 
  
            DAYFMSG(STATIS);       # SEND DAYFILE MESSAGE # 
            END 
  
          END 
  
        END 
  
      RETURN; 
  
NETXFR1:  
      INTAMSG (HWIASMSG, TAIASMSG);  # DUMMY CALL TO LOAD INTAMSG # 
      PRSTFIP;                       # DUMMY CALL TO LOAD PRSTFIP # 
  
      END    # RHFXFR # 
  
      TERM
