
|
*======================================================================== * 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 |