Bonjour,
J'ai fait une commande qui permet d'envoyer dans une OUTQ un fichier binaire provenant de l'IFS tel quel sans la moindre modification.
Le problème est que cela fonctionne seulement "presque" comme je le souhaiterais
Je vous présente ici mon développement et en dessous mon problème.
Ci-dessous les sources :
Le *CMD PRTRAW
Code :
1 2 3 4 5 6 7 8
| CMD PROMPT('Impr RAW d''un fichier IFS')
PARM KWD(IFSFILE) TYPE(*CHAR) LEN(256) MIN(1) EXPR(*YES) PROMPT('FICHIER IFS')
PARM KWD(OUTQ) TYPE(QUAL1) MIN(1) PROMPT('Nom de l''OUTQ')
PARM KWD(TYPE) TYPE(*CHAR) LEN(4) RSTD(*YES) DFT(*PDF) SPCVAL((*PDF)) PROMPT('Type de fichier')
QUAL1: QUAL TYPE(*NAME) LEN(10) MIN(1)
QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) SPCVAL((*LIBL) (*CURLIB)) PROMPT('Bibliothèque') |
Le CLLE PRTRAWC
Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| pgm parm(&ifsfile &outq &type)
/****************************************************************/
/* ATTENTION : BLANCS INTERDITS DANS LE NOM DE FICHIER &ifsfile */
/****************************************************************/
dcl var(&ifsfile) type(*char) len(256) /* Nom complet avec chemin du fichier brut */
dcl var(&outq) type(*char) len(20) /* Nom de l'outq destinataire nom+bib */
dcl var(&type) type(*char) len(4) /* Type de fichier : *PDF, ... */
dcl var(&cmd) type(*char) len(1000) /* Commande QSH */
dcl var(&pcl) type(*char) len(22) /* Nom du fichier temporaire PCL */
dcl var(&numtrav) type(*char) len(6) /* Numéro du travail */
dcl var(&noutq) type(*char) len(10) /* Nom de l'outq destinataire */
dcl var(&boutq) type(*char) len(10) /* Bibliothèque de l'outq destinataire */
rtvjoba nbr(&numtrav)
chgvar var(&pcl) value('/tmp/avirer_' *cat &numtrav *cat '.pcl')
if cond(&type *eq '*PDF') then(do)
/* Variable d'environnement nécessaire pour le pgm ghostscript */
addenvvar envvar(GS_LIB) replace(*yes) +
value('/QOpenSys/usr/local/bin:+
/QOpenSys/usr/local/share/ghostscript/8.54/lib:+
/QOpenSys/usr/local/share/ghostscript/8.54/Resource/fonts')
/* Conversion du PDF en PCL */
chgvar var(&cmd) +
value('/QOpenSys/usr/local/bin/gs -q -dQUIET -dBATCH -dNOPAUSE ' *cat +
'-dNORANGEPAGESIZE -sPAPERSIZE=a4 -sDEVICE=ljet4 -sOutputFile="' *cat +
&pcl *tcat '" -f ' *cat &ifsfile *bcat '> /dev/null 2>&1')
strqsh cmd(&cmd)
enddo
/* Impression en raw du fichier PCL */
chgvar var(&noutq) value(%sst(&outq 1 10))
chgvar var(&boutq) value(%sst(&outq 11 10))
ovrprtf file(qsysprt) tofile(qsys/qsysprt) outq(&boutq/&noutq) +
rplunprt(*no) devtype(*userascii) spool(*yes) ovrscope(*job)
/* ovrscope(*job) car prtraw£ qui est un pgm C n'est pas dans le même actgrp */
call pgm(util/prtraw£) parm(&pcl)
dltovr file(qsysprt) lvl(*job)
/* Suppression du fichier PCL temporaire */
del objlnk(&pcl)
fin:endpgm |
Le C PRTRAW£
Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| /*****************************************************/
/* Ce programme doit être compilé avec les options : */
/* SYSIFCOPT(*IFSIO) et TGTCCSID(*HEX) */
/*****************************************************************************************************/
/* argv[1] est le nom complet du fichier IFS par ex /home/bafolrg/test.pcl */
/* voir : http://newsgroups.derkeiler.com/Archive/Comp/comp.sys.ibm.as400.misc/2006-07/msg00274.html */
/*****************************************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <recio.h>
#define LONG_ENREG_PRTF 132
int main(int argc, char *argv[])
{
FILE *FichierEntree;
_RFILE *prtf;
char buffer[LONG_ENREG_PRTF+1];
char ModeEcritureFichierPRTF[50];
int len;
FichierEntree = fopen(argv[1], "rb, o_ccsid=65535");
if(FichierEntree == NULL) return(1);
sprintf(ModeEcritureFichierPRTF, "wr, lrecl=%d", LONG_ENREG_PRTF);
prtf = _Ropen("QSYSPRT", ModeEcritureFichierPRTF);
memset(buffer, 0x00, sizeof(buffer));
len = fread(buffer, sizeof(char), LONG_ENREG_PRTF, FichierEntree);
while(len>0)
{
_Rwrite(prtf, buffer, LONG_ENREG_PRTF);
memset(buffer, 0x00, sizeof(buffer));
len = fread(buffer, sizeof(char), LONG_ENREG_PRTF, FichierEntree);
}
_Rclose(prtf);
fclose(FichierEntree);
return 0;
} |
Les commandes pour la compilation de tout cela
Code :
1 2 3
| crtbndc pgm(util/prtraw£) srcfile(util/qsrcspool) output(*print) sysifcopt(*ifsio) tgtccsid(*hex)
crtbndcl pgm(util/prtrawc) srcfile(util/qsrcspool) dftactgrp(*no) actgrp(*caller)
crtcmd cmd(util/prtraw) srcfile(util/qsrcspool) pgm(util/prtrawc) |
Maintenant le problème.
Avec la commande suivante seule, le fichier PDF ne s'imprime pas et il ne se passe strictement rien sur l'imprimante :
Code :
PRTRAW IFSFILE('/home/outq/FRKO_WAG_2/KS735831.pdf') OUTQ(BAFOINFO)
En revanche les commandes suivantes impriment le PDF correctement :
Code :
1 2
| CALL PGM(util/bizarre)
PRTRAW IFSFILE('/home/outq/FRKO_WAG_2/KS735831.pdf') OUTQ(BAFOINFO) |
Le programme bizarre fait la chose suivante :
Code :
1 2 3
| pgm
crtbndrpg pgm(qtemp/bizarre£) srcfile(util/qsrcspool) dftactgrp(*no) actgrp(SPOOL) output(*none) replace(*yes)
fin:endpgm |
et le contenu de bizarre£ est on ne peu plus simple :
Et pour chaque impression de PDF que je veux faire, si je ne lance pas la compilation de ce programme bizarre£ qui n'est jamais utilisé, cela ne fonctionne pas

Je n'arrive pas à faire le moindre lien entre l'impression correcte et la compilation du programme bizarre£

Est-ce une histoire de groupe d'activation ? D'ovrprtf incorrect ?
Qui a une idée ?
Ou bien suis-je condamné à compiler avant chaque impression ?
A oui encore une info : je suis en V5R3