Sample program paperinfo.cbl

0 Likes

Problem:

The documentation for the "extend Interoperability Suite" includes references to a sample program named paperinfo.cbl, which obtains paper and tray information from the system's printers.  Unfortunately this sample is no longer included in the installation.

Resolution:

Here is the complete PaperInfo.cbl program:

       IDENTIFICATION               DIVISION.
       PROGRAM-ID.                  PaperInfo.
       ENVIRONMENT                  DIVISION.
       CONFIGURATION                SECTION.
       SPECIAL-NAMES.

       FILE-CONTROL.
       SELECT EnumPrinter           ASSIGN TO "Printerlist.txt"
           ORGANIZATION             IS LINE SEQUENTIAL.

       FILE SECTION.
       FD  EnumPrinter.
       01  EprintRec                PIC X(100).

       WORKING-STORAGE SECTION.
       77  CALL-RESULT              SIGNED-INT VALUE 0.
       77  TmpStr                   PIC X(15).
       77  WS-HA                    pic 9(03).
       77  WS-HB                    pic 9(03).
       77  WS-LAST                  pic 9(03).
       77  WS-HS                    PIC X(34).

       COPY "WINPRINT.DEF".

       PROCEDURE   DIVISION.
       MAIN SECTION.
       MAIN-001.

           OPEN    OUTPUT           EnumPrinter.
           INITIALIZE                    WINPRINT-SELECTION.
           MOVE    1                TO WINPRINT-NO-OF-PRINTERS.
           CALL    "WIN$PRINTER"    USING
                   WINPRINT-GET-PRINTER-INFO-EX
                   WINPRINT-SELECTION
                   GIVING           CALL-RESULT.

           PERFORM UNTIL            CALL-RESULT NOT > 0
                   IF               CALL-RESULT < 1
                                    EXIT PERFORM CYCLE
                                    END-IF
                   INITIALIZE       EPrintRec
                   WRITE            EPrintRec FROM WINPRINT-NAME
                   PERFORM          GET-MEDIA
                   WRITE            EPrintRec FROM SPACES
                   ADD              1 TO WINPRINT-NO-OF-PRINTERS
                   CALL             "WIN$PRINTER" USING
                                    WINPRINT-GET-PRINTER-INFO-EX
                                    WINPRINT-SELECTION
                                    GIVING CALL-RESULT
                                    END-CALL
                   END-PERFORM.
           CLOSE   EnumPrinter.
           STOP    RUN.

       MAIN-900.
       MAIN-EXIT.
           EXIT.

      *Windows provides a vast set of standard paper sizes and trays
      *these are however not all supported by the particular printer
      *driver. Hence, we inquire the printer for these values rather
      *than showing the Windows standard list, which may cause to
      *incorrect results.

      *Note that the WINPRINT-GET-PRINTER-MEDIA returns a table of
      *of the printer paper sizes and trays represented by numeric
      *entries, not by text. This is done to preserve memory and
      *time, this media id (for both paper size and trays) can then
      *be matched to the predefined table in winprint.def. Note
      *however that the particular instance of the printer driver
      *may have defined a tray and/or paper sizes that is not present
      *in Windows standard. In that case we present the paper size / tray
      *as either user defined (id above 256) or unknown (paper size
      *between 41 and 256, paper tray between 15 and 256)
       GET-MEDIA SECTION.
       GET-MEDIA-001.
           INITIALIZE               WINPRINT-MEDIA
                                    EPrintRec
                                    WS-LAST.
           WRITE   EPrintRec        FROM "Paper formats".
           MOVE    WINPRINT-NAME    TO WINPRINT-MEDIA-PRINTER.
           MOVE    WINPRINT-PORT    TO WINPRINT-MEDIA-PORT.
           CALL    "WIN$PRINTER"    USING
                   WINPRINT-GET-PRINTER-MEDIA
                   WINPRINT-MEDIA
                   GIVING           CALL-RESULT.

           IF      CALL-RESULT      NOT > 0
                   EXIT             SECTION
                   END-IF.

           PERFORM VARYING          WS-HA FROM 1 BY 1
                   UNTIL            WS-HA > WINPRINT-MEDIA-PAPERCOUNT
                   PERFORM          BUILD-PAPER
           END-PERFORM.

           INITIALIZE               WS-LAST
                                    EPrintRec.
           WRITE   EPrintRec        FROM SPACES. 
           WRITE   EPrintRec        FROM "Paper Trays" .

           PERFORM VARYING WS-HA FROM 1 BY 1
                   UNTIL WS-HA > WINPRINT-MEDIA-TRAYCOUNT
                   PERFORM          BUILD-TRAY
           END-PERFORM.

       GET-MEDIA-900.
       GET-MEDIA-EXIT.
           EXIT.

       BUILD-PAPER SECTION.
       BUILD-PAPER-001.

           MOVE    WINPRINT-MEDIA-PAPER(WS-HA) TO WS-HB.
           INITIALIZE               EPrintRec.

           IF      WS-HB            = 0
           OR      WS-HB            = WS-LAST
                   EXIT             SECTION
                   END-IF.

           MOVE    WS-HB            TO WS-LAST.

           IF      WS-HB            < MAX-PAPER-SIZES
           OR      WS-HB            = MAX-PAPER-SIZES
                   STRING           "  (" WS-HB ") - "
                                    PAPER-SIZE-TABLE(WS-HB)
                                    INTO  EPrintRec
                                    END-STRING
                   END-IF.

           IF      WS-HB            > MAX-PAPER-SIZES
           AND     WS-HB            < 256
                   STRING           "  (" WS-HB ") - Undefined" 
                                    INTO  EPrintRec
                                    END-STRING
                   END-IF.

           IF      WS-HB            > 256
                   STRING           "  (" WS-HB ") - User defined" 
                                    INTO  EPrintRec
                                    END-STRING
                   END-IF.

           WRITE   EPrintRec.

       BUILD-PAPER-900.
       BUILD-PAPER-EXIT.
           EXIT.

       BUILD-TRAY SECTION.
       BUILD-TRAY-001.

           MOVE    WINPRINT-MEDIA-TRAYS(WS-HA) TO WS-HB.
           INITIALIZE               EprintRec.

           IF      WS-HB            = 0
           OR      WS-HB            = WS-LAST
                   EXIT             PARAGRAPH
                   END-IF.

           MOVE    WS-HB            TO WS-LAST.

      *For some weird reason, the Windows standard does not have defined
      *entries 12 and 13, but 14 and 15. For convenience we map this back
      *and forth. See also SET-ATTRIBUTES section.
           IF      WS-HB            = 14
                   STRING           "  (14) - "
                                    PAPER-TRAY-TABLE(12)
                                    INTO  EPrintRec
                                    END-STRING
                   END-IF.

           IF      WS-HB            = 15
                   STRING           "  (15) - "
                                    PAPER-TRAY-TABLE(13)
                                    INTO  EPrintRec
                                    END-STRING
                   END-IF.

           IF      WS-HB            < MAX-PAPER-TRAYS
           OR      WS-HB            = MAX-PAPER-TRAYS
                   STRING           "  (" WS-HB ") - "
                                    PAPER-TRAY-TABLE(WS-HB)
                                    INTO  EPrintRec
                                    END-STRING
                   END-IF.

           IF      WS-HB            > 15
           AND     WS-HB            < 256
                   STRING           "  (" WS-HB ") - Undefined"
                                    INTO  EPrintRec
                                    END-STRING
                   END-IF.

           IF      WS-HB            > 256
                   STRING           "  (" WS-HB ") - User defined"
                                    INTO  EPrintRec
                                    END-STRING
                   END-IF.

           WRITE   EPrintRec.

       BUILD-TRAY-900.
       BUILD-TRAY-EXIT.
           EXIT.
Comment List
Anonymous
Related Discussions
Recommended