*DECK FCSBDFN 
USETEXT TEXTFCS;
      PROC FCSBDFN (XFERCMD); 
*CALL COPYRITE
# TITLE FCSBDFN - PROCESS DISPLAY_DIRECTORY AND DISPLAY_FILE_NAMES.    #
  
      BEGIN                            # FCSBDFN                       #
  
# 
**    FCSBDFN - PROCESS DISPLAY_DIRECTORY AND DISPLAY_FILE_NAMES. 
* 
*     C. J. RAMSAY                     87/11/03 
* 
*     THIS PROCEDURE PROCESSES THE DISPLAY_DIRECTORY AND
*     DISPLAY_FILE_NAMES COMMANDS.
* 
*     PROC FCSBDFN (XFERCMD)
* 
*     ENTRY   XFERCMD    = *LIST* FOR DISPLAY_DIRECTORY.
*                        = *NLST* FOR DISPLAY_FILE_NAMES. 
*             PARMS[1]   = DIRECTORY NAME.
*             PARMS[2]   = LOCAL FILE TO RECEIVE DISPLAY INFORMATION. 
*             PARMS[3]   = STATUS VARIABLE (IGNORED). 
* 
*     EXIT    FTPERROR   = TRUE IF PROTOCOL ERROR DETECTED. 
*             FTPFAIL    = TRUE IF COMMAND FAILURE DETECTED.
*             FTPUSERE   = TRUE IF USER ERROR DETECTED. 
* 
*     METHOD  CHECK FOR REMOTE HOST CONNECTION. 
*             IF LOCAL FILE NAME NOT SPECIFIED THEN 
*               SET UP AN INTERNAL LOCAL FILE.
*             VALIDATE LOCAL FILE CHARACTERISTICS.
*             INITIALIZE MBT ENTRY FOR LOCAL FILE.
*             CREATE LOCAL FILE IF IT DOES NOT EXIST. 
*             CHANGE TRANSFER TYPE IF NOT ASCII.
*             CHANGE DEFAULT CODE SET IF NOT ASCII. 
*             PROCESS THE FTP FILE TRANSFER SEQUENCE
*               SENDING *STOR* FTP COMMAND TO LOCAL HOST. 
*               SENDING *LIST* OR *NLST* FTP COMMAND TO REMOTE HOST.
*             IF LOCAL FILE NAME NOT SPECIFIED THEN 
*               WRITE CONTENTS OF INTERNAL LOCAL FILE TO THE OUTPUT FILE. 
*               RETURN THE INTERNAL LOCAL FILE. 
*             RESTORE TRANSFER TYPE IF CHANGED. 
* 
# 
  
# 
****  PROC FCSBDFN - XREF LIST
# 
      XREF
        BEGIN 
        PROC FCSCCCS;                  # PROCESS CHANGE_CODE_SET       #
        PROC FCSCCTT;                  # PROCESS CHANGE_TRANSFER_TYPE  #
        FUNC FCSFFTS B;                # FTP FILE TRANSFER SEQUENCE    #
        PROC FCSOWOF;                  # WRITE TO OUTPUT FILE          #
        FUNC FCSUCRC B;                # CHECK FOR REMOTE CONNECTION   #
        FUNC FCSUIMB B;                # INITIALIZE MBT ENTRY          #
        FUNC FCSUVFC B;                # VALIDATE FILE CHARACTERISTICS #
        FUNC FCSUVFN B;                # VALIDATE NOS FILE NAME        #
        PROC FSTATUS;                  # CHECK IF LOCAL FILE EXISTS    #
        PROC MOVE;                     # MOVE A NUMBER OF WORDS        #
        PROC READC;                    # READ A CODED LINE             #
        PROC RECALL;                   # WAIT FOR OPERATION TO COMPLETE#
        PROC RETERN;                   # RETURN A LOCAL FILE           #
        PROC WRITEF;                   # WRITE END OF FILE             #
        END 
# 
****
# 
      ITEM XFERCMD       U;            # REMOTE FTP FILE TRANSFER CMD  #
  
      ITEM DISPLAY       B;            # DISPLAY TO OUTPUT FILE FLAG   #
      ITEM OLDCSET       C(10);        # OLD DEFAULT CODE SET          #
      ITEM OLDCSAS       U;            # OLD DEFAULT CODE SET (ASCII)  #
      ITEM OLDCSSZ       U;            # OLD DEFAULT CODE SET SIZE     #
      ITEM OLDERROR      B;            # OLD FTP ERROR FLAG            #
      ITEM OLDFAIL       B;            # OLD FTP FAILURE FLAG          #
      ITEM OLDTYPE       C(10);        # OLD TRANSFER TYPE             #
      ITEM RESULT        I;            # RESULT OF READC CALL          #
  
      ARRAY SAVPAR [00:00] S(PARSIZ$); # SAVED PARAMETER BLOCK         #
        BEGIN 
        ITEM SAV$WORD    U(00,00,60); 
        END 
      CONTROL EJECT;
# 
*     START MAIN PROCEDURE
# 
      DISPLAY = FALSE;                 # DEFAULT NOT TO OUTPUT FILE    #
      IF NOT FCSUCRC
      THEN
        BEGIN                          # NO REMOTE CONNECTION EXISTS   #
        RETURN;                        # GET OUT OF HERE QUICKLY       #
        END 
# 
*     IF LOCAL FILE NOT SPECIFIED THEN WE MUST DISPLAY TO OUTPUT FILE.
*     USE THE INTERNAL TRANSFER FILE TO RECEIVE THE LIST INFORMATION. 
*     IF LOCAL FILE SPECIFIED THEN VALIDATE LOCAL FILE CHARACTERISTICS. 
# 
      IF PARAMSZ[2] EQ 0
      THEN
        BEGIN                          # LOCAL_FILE NOT SPECIFIED      #
        DISPLAY = TRUE;                # DISPLAY TO OUTPUT FILE        #
        MOVE (PARSIZ$, XFERBLK[0],
              PARMS[2]);               # USE INTERNAL TRANSFER FILE    #
        END 
      ELSE
        BEGIN                          # LOCAL_FILE SPECIFIED          #
        IF NOT FCSUVFC (PARAMNZ[2], TRUE, FALSE, TRUE)
        THEN
          BEGIN                        # INVALID FILE CHARACTERISTICS  #
          RETURN;                      # GET OUT OF HERE QUICKLY       #
          END 
        END 
# 
*     ENSURE THAT TRANSFER TYPE IS SET TO ASCII.
# 
      OLDTYPE = FTPTYPE;               # PICK UP CURRENT TRANSFER TYPE #
      IF OLDTYPE NQ OPTASCII$ 
      THEN
        BEGIN                          # TRANSFER TYPE NOT ASCII       #
        MOVE (PARSIZ$, PARMS[1],
              SAVPAR[0]);              # SAVE DIRECTORY NAME           #
        PARAMNB[1] = OPTASCII$;        # CHANGE TRANSFER TYPE TO ASCII #
        FCSCCTT;                       # FAKE CHANGE_TRANSFER_TYPE     #
        IF (FTPUSERE OR FTPERROR OR FTPFAIL)
        THEN
          BEGIN                        # ANY ERROR ENCOUNTERED         #
          RETURN;                      # GET OUT OF HERE QUICKLY       #
          END 
        MOVE (PARSIZ$, SAVPAR[0], 
              PARMS[1]);               # RESTORE DIRECTORY NAME        #
        END 
# 
*     ENSURE THAT DEFAULT CODE SET IS SET TO ASCII. 
# 
      OLDCSET = FTPDCSET;              # PICK UP CURRENT CODE SET      #
      OLDCSAS = FTPDCSAS; 
      OLDCSSZ = FTPDCSSZ; 
      IF (OLDCSET NQ OPTASCII$) AND (OLDCSET NQ OPTA$)
      THEN
        BEGIN                          # DEFAULT CODE SET NOT ASCII    #
        MOVE (PARSIZ$, PARMS[1],
              SAVPAR[0]);              # SAVE DIRECTORY NAME           #
        PARAM[1] = PARA$;              # CHANGE DEFAULT CODE SET ASCII #
        PARAMSZ[1] = 1; 
        PARAMNB[1] = OPTA$; 
        FCSCCCS;                       # FAKE CHANGE_CODE_SET          #
        IF (FTPUSERE OR FTPERROR OR FTPFAIL)
        THEN
          BEGIN                        # ANY ERROR ENCOUNTERED         #
          RETURN;                      # GET OUT OF HERE QUICKLY       #
          END 
        MOVE (PARSIZ$, SAVPAR[0], 
              PARMS[1]);               # RESTORE DIRECTORY NAME        #
        END 
#                                                                        FCSBDFN
*     INITIALIZE MBT ENTRY AND CREATE LOCAL FILE IF IT DOES NOT EXIST.
# 
      IF FCSUIMB (FTXFER, PARAMNZ[2]) 
      THEN
        BEGIN                          # MBT ENTRY INITIALIZED         #
        FSTATUS (MBT[MBXX]);           # CHECK IF FILE EXISTS          #
        IF MBT$FSTAT[MBXX] EQ 0 
        THEN
          BEGIN                        # LOCAL FILE DOES NOT EXIST     #
          WRITEF (MBT[MBXX]);          # WRITE END OF FILE             #
          RECALL (MBT[MBXX]);          # WAIT FOR OPERATION TO COMPLETE#
          END 
# 
*     INITIATE FILE TRANSFER AND WHEN COMPLETE DISPLAY TO OUTPUT FILE 
*     IF LOCAL_FILE WAS NOT SPECIFIED.
# 
        IF FCSFFTS (FTPCSTOR, PARMS[2], 
                    XFERCMD, PARMS[1])
        THEN
          BEGIN                        # FILE TRANSFER SEQUENCE OKAY   #
          IF DISPLAY
          THEN
            BEGIN                      # DISPLAY TO OUTPUT FILE        #
            MBT$STAT[MBXX] = 1;        # CLEAR STATUS + SET COMPLETION #
            READC (MBT[MBXX], WORKBUF,
                   WORKSIZ$, RESULT);  # READ FIRST LINE OF 6/12 ASCII #
            FOR RESULT = RESULT 
              WHILE RESULT EQ 0 DO     # LOOP WHILE NOT END OF FILE    #
              BEGIN 
              FCSOWOF (WORKBUF, 
                       INTERNAL$);     # WRITE TO OUTPUT FILE          #
              READC (MBT[MBXX], WORKBUF,
                     WORKSIZ$, RESULT);# READ NEXT LINE OF 6/12 ASCII  #
              END 
            END 
          END 
# 
*     IF DISPLAYING TO OUTPUT FILE THEN RETURN THE INTERNAL TRANSFER
*     FILE USED.
# 
        IF DISPLAY
        THEN
          BEGIN                        # DISPLAY TO OUTPUT FILE        #
          RETERN (MBT[MBXX]);          # RETURN LOCAL FILE             #
          END 
        MBT$LFN[MBXX] = XFERLFN[0];    # RESTORE TRANSFER FILE NAME    #
        END 
# 
*     IF TRANSFER TYPE CHANGED THEN RESTORE THE ORIGINAL TRANSFER TYPE. 
# 
      IF OLDTYPE NQ OPTASCII$ 
      THEN
        BEGIN                          # CHANGED TRANSFER TYPE         #
        OLDERROR = FTPERROR;           # SAVE FTP ERROR FLAG           #
        OLDFAIL  = FTPFAIL;            # SAVE FTP FAILURE FLAG         #
        FTPERROR = FALSE;              # RESET FTP ERROR FLAG          #
        FTPFAIL  = FALSE;              # RESET FTP FAILURE FLAG        #
        PARAMNB[1] = OLDTYPE;          # CHANGE IT TO ORIGINAL TYPE    #
        FCSCCTT;                       # FAKE CHANGE_TRANSFER_TYPE     #
        FTPERROR = OLDERROR OR FTPERROR;# UPDATE FTP ERROR FLAG        #
        FTPFAIL  = OLDFAIL OR FTPFAIL; # UPDATE FTP FAILURE FLAG       #
        END 
# 
*     IF DEFAULT CODE SET CHANGED THEN RESTORE THE ORIGINAL VALUE.
# 
      IF (OLDCSET NQ OPTASCII$) AND (OLDCSET NQ OPTA$)
      THEN
        BEGIN                          # CHANGED DEFAULT CODE SET      #
        OLDERROR = FTPERROR;           # SAVE FTP ERROR FLAG           #
        OLDFAIL  = FTPFAIL;            # SAVE FTP FAILURE FLAG         #
        FTPERROR = FALSE;              # RESET FTP ERROR FLAG          #
        FTPFAIL  = FALSE;              # RESET FTP FAILURE FLAG        #
        PARAM[1] = OLDCSAS;            # CHANGE IT TO ORIGINAL CODE SET#
        PARAMSZ[1] = OLDCSSZ; 
        PARAMNB[1] = OLDCSET; 
        FCSCCCS;                       # FAKE CHANGE_CODE_SET          #
        FTPERROR = OLDERROR OR FTPERROR;# UPDATE FTP ERROR FLAG        #
        FTPFAIL  = OLDFAIL OR FTPFAIL; # UPDATE FTP FAILURE FLAG       #
        END 
  
      RETURN;                          # RETURN TO CALLER              #
  
      END                              # FCSBDFN                       #
  
      TERM
