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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
PRTRAW IFSFILE('/home/outq/FRKO_WAG_2/KS735831.pdf') OUTQ(BAFOINFO)
En revanche les commandes suivantes impriment le PDF correctement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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