home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 11 Util / 11-Util.zip / iniedit1.zip / PRINT.C < prev    next >
C/C++ Source or Header  |  1989-02-24  |  7KB  |  200 lines

  1. /******************************* Module Header ******************************\
  2. * Module Name: Print.c
  3. *
  4. *
  5. * Created by Microsoft Corporation, 1989
  6. *
  7. *
  8. * PM OS2.ini Editor
  9. *
  10. * Printing Functions
  11. *
  12. \***************************************************************************/
  13.  
  14.  
  15. #define LINT_ARGS
  16. #define INCL_WINSHELLDATA
  17. #define INCL_GPIBITMAPS
  18. #define INCL_GPIREGIONS
  19. #define INCL_GPILCIDS
  20. #define INCL_GPIPRIMITIVES
  21. #define INCL_DEV
  22.  
  23. #include <string.h>
  24. #include <stdio.h>
  25.  
  26. #include <os2.h>
  27.  
  28. #include "IniEdit.h"
  29.  
  30.  
  31. /******************************* Constants *********************************/
  32.  
  33. #define LEFT_MARGIN      3
  34. #define TOP_MARGIN       7
  35. #define BOTTOM_MARGIN   15
  36. #define    MAX_PRINT_LEN    1024
  37.  
  38.  
  39. /******************************* Externals *********************************/
  40.  
  41. extern USHORT        cAppNames;
  42. extern PGROUPSTRUCT  pGroups;
  43. extern HAB           habIniEdit;
  44. extern USHORT        usLineHeight;
  45. extern USHORT        usPrintFormat;
  46.  
  47. /******************************* Internals ********************************/
  48. CHAR    szBuf[MAX_STRING_LEN];            // Output character buffer
  49. CHAR    szPrinter[MAX_PRINT_LEN];        // Logical Printer Name
  50. CHAR    szDetails[MAX_PRINT_LEN];        // Logical Printer Details
  51.  
  52.  
  53. /***************************** Function Header *****************************\
  54. *
  55. * PrintThread
  56. *
  57. *
  58. * Prints the ini info in specified format
  59. *
  60. \***************************************************************************/
  61.  
  62. VOID PrintThread()
  63. {
  64.     HAB      habPrint;                          // HAB of Print Thread
  65.     HDC      hdcPrint;                          // DC of Printer
  66.     HPS      hpsPrint;                          // PS of Printer
  67.     SIZEL    sizel;                             // Size of PS to Create
  68.     POINTL   ptlOutput;                         // Output location
  69.     BYTE     abOut[50];                         // DevEscape Output
  70.     ULONG    ulOut;                             // DevEscape Output Count
  71.     USHORT   usHeight;                          // Height of Printer Page
  72.     USHORT   cch;                               // Count of Characters in buffer
  73.     INT      i,j;                               // Loop Counters
  74.     DEVOPENSTRUC  dop;                          // DevOpenDC Info
  75.     CHAR     szMessage[80];
  76.  
  77.     /* initialization of thread */
  78.     if (!(habPrint = WinInitialize(NULL))) DosExit(EXIT_THREAD, -1);
  79.  
  80.  
  81.     /*** Select Port ***/
  82.     /* get name of default logical printer */
  83.     cch = WinQueryProfileString(habPrint, "PM_SPOOLER", "PRINTER",
  84.                            "",                /* default  */
  85.                            szPrinter,
  86.                            MAX_PRINT_LEN);    /* max chars */
  87.  
  88.     szPrinter[cch-2] = 0;                     /* remove terminating ';' */
  89.  
  90.     /* get specifics of default logical printer */
  91.     cch = WinQueryProfileString(habPrint, "PM_SPOOLER_PRINTER", szPrinter,
  92.                            "",                /* default  */
  93.                            szDetails,
  94.                            MAX_PRINT_LEN);    /* max chars */
  95.  
  96.  
  97.     /* info in form of "port; driver; logical address" */
  98.     /* grab driver name; one past semicolon */
  99.     dop.pszDriverName = strchr( szDetails, ';' )+1;
  100.  
  101.     /* Grab logical address */
  102.     dop.pszLogAddress = strchr( dop.pszDriverName, ';' )+1;
  103.  
  104.     /* Make driver and Logical address Null terminated */
  105.     dop.pszLogAddress = strtok( dop.pszLogAddress, ",;" );
  106.     dop.pszDriverName = strtok( dop.pszDriverName, ",.;" );  /* Driver.Model */
  107.  
  108.     dop.pdriv = NULL;
  109.     dop.pszDataType = NULL;
  110.  
  111.     /* Create Printer DC */
  112.     hdcPrint = DevOpenDC( habPrint, OD_QUEUED, "*", 3L, (PDEVOPENDATA)&dop,
  113.             (HDC)NULL);
  114.  
  115.     if( hdcPrint == (HDC)NULL )
  116.         {
  117.     DosExit(EXIT_THREAD, -1);
  118.         }
  119.  
  120.     strcpy( szBuf, (usPrintFormat == APP_FORM) ? SZAPP : SZALL );
  121.     DevEscape( hdcPrint, DEVESC_STARTDOC, (LONG)strlen( szBuf ), (PBYTE)szBuf,
  122.             &ulOut, (PBYTE)NULL );
  123.  
  124.     /* Determine size of page */
  125.     DevQueryCaps( hdcPrint, CAPS_HEIGHT, 1L, (PLONG)&usHeight );
  126.     ptlOutput.y = usHeight - TOP_MARGIN - usLineHeight;
  127.     ptlOutput.x = LEFT_MARGIN;
  128.  
  129.     /* Create Printer PS */
  130.     sizel.cx = sizel.cy = 0L;
  131.     hpsPrint = GpiCreatePS( habPrint, hdcPrint, &sizel,
  132.             PU_PELS | GPIF_DEFAULT | GPIT_NORMAL | GPIA_ASSOC );
  133.  
  134.     if( hpsPrint == (HPS)NULL )
  135.         {
  136.     DosExit(EXIT_THREAD, -1);
  137.         }
  138.  
  139.  
  140.     /* print items */
  141.     if( usPrintFormat == APP_FORM )
  142.         {
  143.         for( i=0; i<cAppNames; i++ )
  144.             {
  145.             sprintf(szMessage,"CharString: X = %ld,  Y = %ld",
  146.                                 ptlOutput.x, ptlOutput.y);
  147.             GpiCharStringAt( hpsPrint, &ptlOutput, (LONG)strlen( pGroups[i].szAppName ),
  148.                     pGroups[i].szAppName );
  149.             ptlOutput.y -= usLineHeight;
  150.  
  151.             if( ptlOutput.y <= BOTTOM_MARGIN )
  152.                 {
  153.                 DevEscape( hdcPrint, DEVESC_NEWFRAME, 0L, (PBYTE)NULL , &ulOut, abOut );
  154.                 ptlOutput.y = usHeight - TOP_MARGIN - usLineHeight;
  155.                 }
  156.  
  157.             }
  158.         }  /* if */
  159.     else
  160.         {
  161.         /* Print App Names */
  162.         for( i=0; i<cAppNames; i++ )
  163.             {
  164.             GpiCharStringAt( hpsPrint, &ptlOutput, (LONG)strlen( pGroups[i].szAppName ),
  165.                     pGroups[i].szAppName );
  166.             ptlOutput.y -= usLineHeight;
  167.             if( ptlOutput.y <= BOTTOM_MARGIN )
  168.                 {
  169.                 DevEscape( hdcPrint, DEVESC_NEWFRAME, 0L, (PBYTE)NULL , &ulOut, abOut );
  170.                 ptlOutput.y = usHeight - TOP_MARGIN - usLineHeight;
  171.                 }
  172.  
  173.             /* Print Key Value Pairs for current App Name */
  174.             for( j=0; j<pGroups[i].cKeys; j++ )
  175.                 {
  176.                 sprintf( szBuf, "   %s: %s", pGroups[i].pPairs[j].szKey,
  177.                         pGroups[i].pPairs[j].szValue );
  178.  
  179.                 if( GpiCharStringAt( hpsPrint, &ptlOutput, (LONG)strlen( szBuf ), szBuf ) == GPI_ERROR )
  180.             ;
  181.  
  182.                 ptlOutput.y -= usLineHeight;
  183.                 if( ptlOutput.y <= BOTTOM_MARGIN )
  184.                     {
  185.                     DevEscape( hdcPrint, DEVESC_NEWFRAME, 0L, (PBYTE)NULL , &ulOut, abOut );
  186.                     ptlOutput.y = usHeight - TOP_MARGIN - usLineHeight;
  187.                     }
  188.                 }  /* for */
  189.             }  /* for */
  190.  
  191.         }
  192.  
  193.     /* Cleanup */
  194.     DevEscape( hdcPrint, DEVESC_ENDDOC, 0L, (PBYTE)NULL , &ulOut, abOut );
  195.     GpiAssociate( hpsPrint, (HDC)NULL );
  196.     GpiDestroyPS( hpsPrint );
  197.     DevCloseDC( hdcPrint );
  198.     DosExit(EXIT_THREAD, 0);
  199. }  /* PrintThread */
  200.