Liste les dossiers/documents Office et CDROM

BoTTom |
      *========================================================================
      * CE PGM UTILISE LES APIS HFS (HIERARCHICAL FILE SYSTEM)
      *
      *  CE PRINCIPE PERMET D'ORGANISER SUR AS UN SYSTEME DE FICHIERS
      *   À ORGANISATION HIERARCHIQUE (ARBORESCENCE TYPE DOS OU UNIX)
      *
      *  IL FAUT DÉFINIR AUX YEUX DU SYSTEME UN GROUPE DE FICHIERS HFS
      *  (UNE SORTE DE REPERTOIRE RACINE PAR SYSTEME DE FICHIER)
      *
      *  IL EXISTE PAR DEFAUT UN SYSTEME DE FICHIER DE CE GENRE SUR L'AS
      *            ==> QDLS (DIRECTORY LIBRARY SERVICE)
      *                     = LES DOCUMENTS OFFICE ET PCS/400
      *            ==> QOPT (DISQUE OPTIQUE)
      *                     = LES DOCUMENTS SUR CD-ROM
      *
      *  LES API HFS PERMETTENT DONC DE SE DEPLACER DANS L'ARBORESCENCE
      *   C'EST À DIRE D'OBTENIR LA LISTE DES DOCUMENTS AVEC DES TEMPS DE
      *   REPONSE "STYLE API" (RAPIDE).
      *========================================================================
     FLSTDLSD CF  E                    WORKSTN
     F                                        L     KSFILE SFL
     E                    TP       1024  1
     E                    TE        512  1
     E                    PTH        63  1
      *========================================================================
      * STRUCTURES HFS
      *
      * L'API HFS RENVOI: !NB DE POSTES! OFFSET P1 ! OFFSET P2 !.....!P1!P2 !P-!
      *                   <--BIN(4,0)-><--BIN(4,0) <--BIN(4,0)>      <-les->
      *                                                               postes
      * OFFSET = DEPLACEMENT RELATIF À PARTIR DU DEBUT DE LA VARIABLE
      *          À EFFECTUER POUR OBTENIR LE POSTE
      * (MÊME TECHNIQUE QUE LES LISTE COMPLEXES POUR LES CPP DE COMMANDES)
      *
      * LA STRUCTURE QUI SUIT RECONNAIT LE NOMBRE DE POSTE
      * (UN POSTE = DES INFOS SUR UN DOCUMENT)
      *  ET CHERCHE POUR CHAQUE POSTE LE DÉPLACEMENT (OFFSET)
      *  QUI SERA PLACÉ DANS "BINDS" = VARIABLE BINAIRE
     IRT          DS
     I                                    B   1   40NBP
     I                                        11024 TP
      *  CHAQUE POSTE EST DECOUPÉ COMME LA ZONE DE RETOUR GÉNÉRAL
      *  un poste = !<-nb d'entrées->!<-offset entrée 1->!........!entrée 1!
      *   MAIS DONNE NOMBRE D'ENTRÉES ET DEPLACEMENT  RELATIF AU POSTE 


|
      *  (UNE ENTREE = UNE INFORMATION SUR UN DOCUMENT)
      *
     IPST         DS
     I                                    B   1   40NBE
     I                                        1 512 TE
      *  UNE ENTREE =
      *   BIN(4,0) LG DE L'ATTRIBUT ("NOM" DE L'INFO)
      *                              QNAME = NOM DU DOCUMENT
      *                              QFILATTR = ATTRIBUTS/DOCUMENT
      *                              (voir découpage ATTR)
      *                              DIACA....= infos DIA
      *                              (architecture de document
      *                               = infos propres  à DLS)
      *   BIN(4,0) LG DE LA VALEUR   (SUIVANT ATTRIBUT)
      *   BIN(4,0) X'00000000'       (RESERVÉ)
      *   CHAR(??)                   ATTRIBUT
      *   CHAR(??)                   VALEUR = NOM DU DOC SI QNAME
      *                                     = ATTR SI QFILATTR
      *                                     = INFOS DIA SI DIACA......
     IENT         DS
     I                                    B   1   40LGA
     I                                    B   5   80LGV
     I                                    B   9  120XZERO
     I                                       13 126 ATT
      * DECOUPAGE D'UNE VALEUR POUR "QFILATTR"
      *
      * ON RECHERCHE SI CE POSTE EST UN DOCUMENT (TRAITEMENT POSSIBLE)
      *                          OU  UN DOSSIER  (NIVEAU SUIVANT)
      *                    POS 4 À 4
     IATTR        DS
     I                                        1   1 READO
     I                                        2   2 HIDEN
     I                                        3   3 SYSTEM
     I                                        4   4 DIR
     I                                        5   5 MODIF
     I                                        6  10 RESTE
      * variable de travail pout cvt alpha -> binaire
     IBINDS       DS
     I                                    B   1   40B
      *
      * a suivre table à envoyer à l'api
      *
      * (doit être renseignée par le pgm, ICI: DS initialisée)
      *


|
      * STRUCTURE QUI DÉFINIT A QHFOPNDR LES INFOS RECHERCHÉES PAR LE PGM.
      * (INUTILE DE PRECISER "QNAME" QUI EST RENVOYÉ SYSTéMATIQUEMENT)
     ITABDS       DS
      * NOMBRE D'INFOS (2 = QFILATTR + DIACA04C706)
     I I            2                     B   1   40TNBP
      * OFFSET 1ERE INFO  (déplacement pour TLGA1)
     I I            12                    B   5   80TOFF1
      * OFFSET 2EME INFO  (déplacement pour TLGA2)
     I I            26                    B   9  120TOFF2
      * LONGUEUR          (lg TATTR)
     I I            10                    B  13  160TLGA1
      * VALEUR = ATTRIBUTS DOCUMENT
     I I            'QFILATTR'               17  26 TATTR
      * LONGUEUR          (lg DIA)
     I I            12                    B  27  300TLGA2
      * VALEUR = INFORMATIONS DIA
      *   VALIDE UNQIUEMENT AVEC DLS (SYSTEME DE DOCUMENTS OFFICE)
      *   "DIACA04C706" = TYPE DE DOCUMENT (X'000E' = FICHIER PC)
      *   "DIACA04C701" = GRAPHIC CODE PAGE
      *   "DIACA04C700" = TEXTE
     I I            'DIA.CA04C706'           31  42 DIA
      * DIVERSES VARIABLES EN BINAIRE
     ITABDIV      DS
     I I            42                    B   1   40TLEN
     I I            68                    B   5   80PLEN
     I I            '10      '                9  16 TPARM
     I I            0                     B  17  200CODERR
     I I            1024                  B  21  240RTLEN
     I I            8                     B  25  280NBDOC
     I I            0                     B  29  320NBLU
     I I            0                     B  33  360LGLU
      * DECOUPAGE DU CHEMIN
     IPATHDS      DS
     I                                        1   1 Q
     I                                        2   5 DLSOPT
     I                                        6  68 PATH
     I                                        6  68 PTH
      * DECOUPAGE D'UNE VALEUR POUR "DIA.CA04C706"
      *
      * ON RECHERCHE SI CE POSTE EST UN FICHIER PC
      *                          DIATYP = X'000E'
      *                          POS 4 À 5
     IDIADS       DS
     I                                        1   2 DIACOD


|
     I                                        3   3 DIAVAL
     I                                        4   5 DIATYP
      * CONSTANTE POUR WRKOPTVOL
     I              'WRKOPTVOL'           C         WRKOPT
     C           *LIKE     DEFN PATH      PATHS
      *
      * racine obligatoire pour l' api mais non visualisée
     C                     MOVEL'/QDLS/*' PATHDS
     C                     MOVEL'QDLS'    SYSHFS
      *
     C           *IN03     DOUEQ*ON
      * mise en place du chemin
     C                     Z-ADD63        P       20
     C                     Z-ADD0         PR      20
     C                     Z-ADD0         DR      20
      * changement de système de fichiers
     C           SYSHFS    IFNE DLSOPT
     C                     MOVE *BLANK    ATTR
     C                     MOVE *BLANK    TYP
      * mise à blanc aprés "/" (on enleve toute directory)
      *  on ajoute le nom de volume (obligatoire)
     C           '/'       CAT  SYSHFS:0  PATHDS    P
      *    puis ajout du caractère joker "/*"
     C           SYSHFS    IFEQ 'QOPT'
     C                     CAT  '/':0     PATHDS    P
     C                     CAT  VOLUME:0  PATHDS
     C                     ENDIF
     C                     CAT  '/*':0    PATHDS
     C                     ENDIF
      * recherche de droite à gauche du premier "/" (PR)
      * et du suivant "/" '(DR)
     C           P         DOWGT0
     C           DR        ANDEQ0
     C           PTH,P     IFEQ '/'
     C           PR        IFEQ 0
     C                     Z-ADDP         PR
     C                     ELSE
     C                     Z-ADDP         DR
     C                     ENDIF
     C                     ENDIF
     C                     SUB  1         P
     C                     ENDDO
      * si F12 (niveau précédent)
      * mise à blanc aprés "/" (le deuxieme en partant de la droite)


|
     C           *IN12     IFEQ *ON
     C           DR        IFNE 0
     C                     ADD  1         DR
      * mise à blanc aprés "/" (on enleve la dernière directory)
     C                     MOVEA*BLANK    PTH,DR
      * puis ajout du caractère joker "*"
     C                     MOVE '*'       PTH,DR
     C                     ENDIF
     C                     ENDIF
      * si Ajout d'un niveau (3 = niveau suivant)
      * mise à blanc aprés "/" (le premier en partant de la droite)
     C           ADD       IFEQ 'O'
     C                     MOVE ' '       ADD     1
     C           PR        IFNE 0
     C                     ADD  1         PR
      * mise à blanc aprés "/" (on enleve le caractère joker "*")
     C                     MOVEA*BLANK    PTH,PR
      * ajout de la directory
     C                     CAT  DIRECT:0  PATH
      * puis du caractère joker
     C                     CAT  '/*':0    PATH
     C                     ENDIF
     C                     ENDIF
      * recherche longueur du chemin (QHFOPNDR en à besoin)
     C           ' '       CHEKRPATHDS    PLEN
      * "OUVERTURE" DE LA DIRECTORY, LE SYSTEME LIT ET PREPARE LES INFOS
     C                     CALL 'QHFOPNDR'             25
     C                     PARM           HDL    16
     C                     PARM           PATHDS
     C                     PARM           PLEN
     C                     PARM           TPARM
     C                     PARM           TABDS
     C                     PARM           TLEN
     C                     PARM           CODERR
     C                     MOVEA'00'      *IN,30
     C                     WRITECTL
     C                     MOVE *ON       *IN31
     C                     Z-ADD0         L       40
     C                     WRITETITRE
     C           *IN25     IFEQ *OFF
      * lecture et chargement du sous fichier
      *
      * la variable en retour est assez grande pour 8 postes
      * ==> si NBP est < à 8 , il n'y a plus de poste à lire


|
     C           NBP       DOULT8
      * LECTURE DES INFOS PREPARÉES par QHFOPNDR
      *  A CHAQUE APPEL LE SYSTEME SE DECALE
      * ( ICI LECTURE 8 PAR 8)
     C                     CALL 'QHFRDDR'
     C                     PARM           HDL    16
     C                     PARM           RT
     C                     PARM           RTLEN
     C                     PARM           NBDOC
     C                     PARM           NBLU
     C                     PARM           LGLU
     C                     PARM           CODERR
      * RT contient le résultat de la lecture
      * de 1 à 4 en binaire NBP (nombre de postes lus)
      * de 5 à 1024 table (TP) de x fois 1 caractère
     C           NBP       IFGT 0
     C                     Z-ADD1         D       40
      * suivant nombre de postes
     C                     DO   NBP
      * mise en place de l'offset n° D dans une variable de travail
     C                     ADD  4         D
     C                     MOVEATP,D      BINDS
      * B contient le déplacement ==> mise en place d'un poste dans PST
     C                     ADD  1         B
     C                     MOVEATP,B      PST
      * PST contient un poste
      * de 1 à 4 en binaire NBE (nombre d'entrées)
      * de 5 à 512 table (TE) de x fois 1 caractère
     C                     Z-ADD1         D2      40
      * suivant nombre d'entrées
     C                     DO   NBE
      * mise en place de l'offset n° D2 dans une variable de travail
      * (D2 est relatif au poste (TE)
     C                     ADD  4         D2
     C                     MOVEATE,D2     BINDS
      * B contient le déplacement ==> mise en place d'une entrée dans ENT
     C                     ADD  1         B
     C                     MOVEATE,B      ENT
      * rappel sur la structure ENT
      *
      *   IENT         DS
      *   I                                    B   1   40LGA
      *   I                                    B   5   80LGV
      *   I                                    B   9  120XZERO


|
      *   I                                       13 126 ATT
      * ATT contient le nom de l'info suivit de l'info elle même
      *
     C                     Z-ADD1         X       30
      *         lg à extraire      :x = à partir de (résultat placé en ZR)
     C           LGA       SUBSTATT:X     ATTNAM 12 P
      *  déplacement de la longueur extraite
     C                     ADD  LGA       X
     C           LGV       IFNE 0
     C           LGV       SUBSTATT:X     ATTVAL120 P
      * mise en place dans les variables du pgm
     C           ATTNAM    IFEQ 'QNAME'
     C           SYSHFS    IFEQ 'QDLS'
     C                     MOVELATTVAL    DOCNAM
     C                     ELSE
     C           PLEN      SUB  6         PL      30
     C                     SUBSTATTVAL:PL DOCNAM
     C                     ENDIF
     C                     ENDIF
     C           ATTNAM    IFEQ 'QFILATTR'
     C                     MOVELATTVAL    ATTR
     C                     ENDIF
     C           ATTNAM    IFEQ DIA
     C                     MOVELATTVAL    DIADS
     C                     ENDIF
     C                     ENDIF
      * boucle "DO NBE"
     C                     ENDDO
      * fin de boucle, toutes les entrées ont étées traitées
      * ===> préparation et écriture sous fichier
     C           DIR       IFEQ '1'
     C                     MOVE 'DIR'     TYP
     C                     ELSE
     C           DIR       IFEQ '0'
     C                     MOVE 'DOC'     TYP
     C           DIATYP    IFEQ X'000E'
     C                     MOVE '*PC'     TYP
     C                     ENDIF
     C                     ENDIF
     C                     ENDIF
      * ecriture
     C                     ADD  1         L
     C                     WRITESFL
      * boucle "DO NBP"


|
     C                     ENDDO
     C                     ENDIF
      * boucle "NBP DOULT 8"
     C                     ENDDO
      * "FERMETURE" DE LA DIRECTORY
     C                     CALL 'QHFCLODR'
     C                     PARM           HDL    16
     C                     PARM           CODERR
     C                     ENDIF
      * sous fichier chargé ==> affichage
     C           *IN03     DOUEQ*ON
     C           *IN12     OREQ *ON
     C           ADD       OREQ 'O'
     C           SYSHFS    ORNE DLSOPT
     C           L         IFGT 0
     C                     MOVE *ON       *IN30
     C                     ELSE
     C                     WRITEVIDE
     C                     ENDIF
     C                     EXFMTCTL
     C           *IN21     IFEQ *ON
     C                     CALL 'QCMDEXC'              99
     C                     PARM WRKOPT    CDE    10
     C                     PARM 10        CDEL   155
     C                     ENDIF
     C           *IN03     IFEQ *OFF
     C           *IN12     ANDEQ*OFF
     C           L         ANDGT0
     C                     EXSR LEC
     C                     ENDIF
      * jusqu'à ce que 1/ demande de niveau suivant (option 3)
      *                2/ demande de retour au niveau précedent (F12)
      *                3/ demande de sortie (F3)
     C                     ENDDO
      * sortie de cette boucle conditionnée par F3
      * ==> changement de niveau (suivant ou précédent = boucle)
     C                     ENDDO
     C                     MOVE *ON       *INLR
      *
      *  sous prog.
      *
      * lecture des enregs modifiés (recherche 3 = niveau suivant)
     C           LEC       BEGSR
     C                     READCSFL                      90


|
     C           *IN90     DOWEQ*OFF
     C           FLD001    IFEQ '3'
     C           TYP       ANDEQ'DIR'
     C           FLD001    OREQ '3'
     C           TYP       ANDEQ'   '
     C                     MOVE DOCNAM    DIRECT 12
      * ADD = flag utilisé en debut de pgm lors de la mise en place du chemin
     C                     MOVE 'O'       ADD
      * à la première demande de niveau suivant==> sortie de boucle readc
      * et retour en début de pgm (boucle générale conditionnée par NON F3)
     C                     LEAVE
     C                     ELSE
     C           FLD001    IFEQ '5'
     C           TYP       ANDNE'DIR'
     C                     EXSR BRWDOC
     C                     ENDIF
     C                     MOVE ' '       FLD001
     C                     UPDATSFL
     C                     ENDIF
     C                     READCSFL                      90
     C                     ENDDO
     C                     ENDSR
      *
     C           BRWDOC    BEGSR
     C                     MOVE PATH      PATHS
     C                     Z-ADD63        P2      20
     C                     Z-ADD0         P3      20
      * recherche de droite à gauche du premier "/" (PR)
     C           P2        DOWGT0
     C           P3        ANDEQ0
     C           PTH,P2    IFEQ '/'
     C                     Z-ADDP2        P3
     C                     ENDIF
     C                     SUB  1         P2
     C                     ENDDO
     C           P3        IFNE 0
     C                     ADD  1         P3
     C                     MOVEA*BLANK    PTH,P3
     C                     MOVELPATHDS    FLR    83 P
     C                     CAT  DOCNAM:0  FLR
     C                     CALL '£DSPDLS'              51
     C                     PARM           FLR
     C                     PARM           TYP
     C                     ENDIF


|
     C                     MOVE PATHS     PATH
     C                     ENDSR




©AF400