home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional / OS2PRO194.ISO / os2 / print / nec95 / nec95.c next >
C/C++ Source or Header  |  1994-02-03  |  5KB  |  173 lines

  1. /* nec95.c
  2.  *
  3.  * Capture the output to a parallel port to which no printer is
  4.  * connected, and redirect it to another file/device.  On open,
  5.  * prepend the escape code to switch an NEC Silentwriter Model 95
  6.  * to HP LaserJet III mode, send the data, and on close switch
  7.  * back to native PostScript mode.
  8.  *
  9.  * usage is:
  10.  *
  11.  *    NEC95 LPTx LPTy|filename|devicename
  12.  *
  13.  * Written by John W. Cocula 920408
  14.  * from source originally written by Jim Gilliland
  15.  */
  16.  
  17. #define   INCL_DOSFILEMGR
  18. #define   INCL_DOSMONITORS
  19. #define   INCL_DOSPROCESS
  20. #include <os2.h>
  21.  
  22. #include <stdio.h>
  23. #include <string.h>
  24. #include <process.h>
  25. #include <malloc.h>
  26. #define   LAST        2
  27.  
  28. void main( int argc, char *argv[] );
  29.  
  30. #pragma pack(1)
  31.  
  32. static struct
  33.    {
  34.    int length;
  35.    char data[158];
  36.    } ibuffer;
  37.  
  38. static struct
  39.    {
  40.    int length;
  41.    char data[158];
  42.    } obuffer;
  43.  
  44. static struct
  45.    {
  46.    unsigned char mflag;
  47.    unsigned char dflag;
  48.    unsigned int sysfilenum;
  49.    char wdata[128];
  50.    } wbuffer;
  51.  
  52. #pragma pack()
  53.  
  54. void main( int argc, char *argv[] )
  55. {
  56.    HMONITOR    hmon;
  57.    HFILE       hfOutput;
  58.    USHORT      usRC;
  59.    USHORT      cbData, usAction, cbWritten;
  60.    PSZ         pszNULLs;
  61.  
  62.    static CHAR achIntroString[] =
  63.       "\004serverdict begin 0 exitserver statusdict begin 5 setsoftwareiomode end\004~N16";
  64.    static CHAR achEndString[] =
  65.       "\033*rB\033E\033\177""0\004~N16\004";
  66.  
  67.    puts( "NEC 95 mode-switching device monitor" );
  68.  
  69.    pszNULLs = (PSZ)calloc(8192,1);
  70.  
  71.    if ((argc != 3) || !strcmpi( argv[1], argv[2] ))
  72.    {
  73.       puts(
  74. "\nNEC95 - usage is:\r\n"
  75. "\n\tNEC95 LPTx filename|devicename"
  76. "\n\twhere:"
  77. "\n\t\t LPTx     = port set up as LaserJet III (with no printer attached)"
  78. "\n\t\t LPTy     = port to redirect PCL data stream to\r\n"
  79. "\n\tNote: x and y must be different.\r\n" );
  80.       exit( 1 );
  81.    }
  82.  
  83.    /* Open the device monitor */
  84.  
  85.    if (0 != (usRC = DosMonOpen( argv[1], &hmon )))
  86.    {
  87.       fprintf( stderr, "DosMonOpen returned code: %u", usRC );
  88.       exit( 1 );
  89.    }
  90.  
  91.    ibuffer.length = obuffer.length = 160;
  92.  
  93.    if (0 != (usRC = DosMonReg( hmon,
  94.                                (PBYTE) &ibuffer,
  95.                                (PBYTE) &obuffer, LAST, 1 )))
  96.       printf( "DosMonReg returned code: %u", usRC );
  97.  
  98.    while (usRC == 0)
  99.    {
  100.       cbData = 132;
  101.  
  102.       if (0 != (usRC = DosMonRead( (PBYTE) &ibuffer, 0,
  103.                                    (PBYTE) &wbuffer, &cbData )))
  104.          printf( "DosMonRead returned code: %u", usRC );
  105.  
  106.       /* printf( " mflag=%02x,dflag=%02x -- ", wbuffer.mflag, wbuffer.dflag ); */
  107.  
  108.       if (wbuffer.mflag & 1)
  109.       {
  110.          /* printf( " Received open packet\n" ); */
  111.  
  112.          if (0 != (usRC = DosOpen( argv[2], &hfOutput, &usAction,
  113.                                    0L, 0, 0x01, 0x0012, 0L )))
  114.          {
  115.             printf( "Error opening output file/device %s, return code: %u.",
  116.                      argv[2], usRC );
  117.          }
  118.          else
  119.          {
  120.             if (0 != (usRC = DosWrite( hfOutput, achIntroString,
  121.                                        sizeof achIntroString - 1,
  122.                                        &cbWritten )))
  123.                printf( " DosWrite returned code: %u", usRC );
  124.  
  125.             if (0 != (usRC = DosWrite( hfOutput, pszNULLs, 8192,
  126.                                        &cbWritten )))
  127.                printf( " DosWrite returned code: %u", usRC );
  128.          }
  129.  
  130.          continue;
  131.       }
  132.  
  133.       if (wbuffer.mflag & 2)
  134.       {
  135.          /* printf( " Received close packet\n" ); */
  136.          if (0 != (usRC = DosWrite( hfOutput, achEndString,
  137.                                     sizeof achEndString - 1,
  138.                                     &cbWritten )))
  139.             printf( " DosWrite returned code: %u", usRC );
  140.  
  141.          DosClose( hfOutput );
  142.  
  143.          continue;
  144.       }
  145.  
  146.       if (wbuffer.mflag & 4)
  147.       {
  148.          /* printf( " Received flush packet\n" ); */
  149.          if (0 != (usRC = DosMonWrite( (PBYTE) &obuffer,
  150.                                        (PBYTE) &wbuffer, cbData )))
  151.             printf( " DosMonWrite returned code: %u", usRC );
  152.  
  153.           continue;
  154.       }
  155.  
  156.       if (wbuffer.dflag == 0)
  157.       {
  158.          /* printf( " Writing %u bytes\n", cbData - 4 ); */
  159.          if (0 != (usRC = DosWrite( hfOutput, wbuffer.wdata, cbData-4,
  160.                                     &cbWritten )))
  161.             printf( " DosWrite returned code: %u", usRC );
  162.       }
  163.  
  164.    }  /* end while */
  165.  
  166.    /* printf( "Exiting DosMonRead loop\n" ); */
  167.  
  168.    DosMonClose( hmon );
  169.  
  170.    DosExit( 0, 0 );
  171. }
  172.  
  173.