|
|
1.1 root 1: /******************************************************************************\
2: *
3: * PROGRAM: ENUMPRT.C
4: *
5: * PURPOSE: Handles display of information returned by calls to
6: * EnumPrinters, EnumPrinterDrivers. Info formatted and
7: * displayed in a dialog box.
8: *
9: *
10: * FUNTIONS: EnumPrintersDlgProc - handles messages for dialog
11: * DisplayEnumPrintersInfo - retrieves printer info
12: * SetEnumPrintersDlgFields - formats & displays printer info
13: * ComplexEnumPrintersLine - formats bitfield printer info
14: * EnumPrinterDriversDlgProc- handles messages for dialog
15: * DisplayPrinterDriversInfo- retrieves, formats, & displays
16: * printer info
17: *
18: *
19: * Microsoft Developer Support
20: * Copyright (c) 1992 Microsoft Corporation
21: *
22: \******************************************************************************/
23:
24: #include <windows.h>
25: #include <string.h>
26: #include <drivinit.h>
27: #include <stdio.h>
28: #include <winspool.h>
29: #include "common.h"
30: #include "enumprt.h"
31:
32:
33:
34: /******************************************************************************\
35: *
36: * FUNCTION: EnumPrintersDlgProc (standard dialog procedure INPUTS/RETURNS)
37: *
38: * COMMENTS: Processes messages for EnumPrinters dialog box
39: *
40: \******************************************************************************/
41:
42: LRESULT CALLBACK EnumPrintersDlgProc (HWND hwnd, UINT msg, WPARAM wParam,
43: LPARAM lParam)
44: {
45: switch (msg)
46: {
47: case WM_INITDIALOG:
48: {
49: BOOL bReturn;
50:
51: //
52: // prompt user for EnumPrinters flags...
53: //
54:
55: if (DialogBox (GetModuleHandle (NULL), (LPCTSTR) "EnumPrtOpt",
56: NULL, (DLGPROC) EnumPrintersOptionsDlgProc))
57: {
58: //
59: // shove all the enum printer info in the list box
60: //
61:
62: SetCursor (LoadCursor (NULL, IDC_WAIT));
63: bReturn = DisplayEnumPrintersInfo (hwnd);
64: SetCursor (LoadCursor (NULL, IDC_ARROW));
65:
66: if (!bReturn)
67:
68: EndDialog (hwnd, TRUE);
69:
70: else
71:
72: SetWindowText (hwnd, (LPCTSTR)"EnumPrinters");
73: }
74: else
75:
76: EndDialog (hwnd, TRUE);
77:
78: break;
79: }
80:
81: case WM_COMMAND:
82:
83: switch (LOWORD (wParam))
84: {
85: case DID_OK:
86:
87: EndDialog (hwnd, TRUE);
88: break;
89: }
90: break;
91: }
92: return 0;
93: }
94:
95:
96:
97: /******************************************************************************\
98: *
99: * FUNCTION: EnumPrintersOptionsDlgProc (standard dlg proc INPUTS/RETURNS)
100: *
101: * COMMENTS: Processes messages for EnumPrtOpt dialog box
102: *
103: \******************************************************************************/
104:
105: LRESULT CALLBACK EnumPrintersOptionsDlgProc (HWND hwnd, UINT msg,
106: WPARAM wParam, LPARAM lParam)
107: {
108: switch (msg)
109: {
110: case WM_INITDIALOG:
111:
112: gdwEnumFlags = 0;
113: gszEnumName[0] = 0;
114: break;
115:
116: case WM_COMMAND:
117:
118: switch (LOWORD (wParam))
119: {
120: case DID_OK:
121:
122: if (gdwEnumFlags)
123: {
124: if (gdwEnumFlags & PRINTER_ENUM_NAME)
125: {
126: GetDlgItemText (hwnd, DID_EDITTEXT, (LPTSTR)gszEnumName,
127: BUFSIZE);
128:
129: if (!strlen (gszEnumName))
130: {
131: MessageBox (hwnd,
132: (LPCTSTR) "Please enter a valid domain/server name",
133: (LPCTSTR) "", MB_OK);
134: SetFocus (GetDlgItem (hwnd, DID_EDITTEXT));
135: break;
136: }
137: }
138:
139: EndDialog (hwnd, TRUE);
140: }
141:
142: else
143:
144: EndDialog (hwnd, FALSE);
145:
146: break;
147:
148: case DID_CANCEL:
149:
150: EndDialog (hwnd, FALSE);
151: break;
152:
153: default:
154:
155: if (HIWORD(wParam) == BN_CLICKED)
156: {
157: DWORD dwControlId = (DWORD) LOWORD (wParam);
158:
159: if (gdwEnumFlags & dwControlId)
160: {
161: //
162: // remove that flag, if PRINTER_ENUM_NAME disable edittext
163: //
164:
165: gdwEnumFlags &= ~dwControlId;
166:
167: if (dwControlId & PRINTER_ENUM_NAME)
168: {
169: SetDlgItemText (hwnd, DID_EDITTEXT, (LPCTSTR)"");
170: EnableWindow (GetDlgItem (hwnd, DID_EDITTEXT), FALSE);
171: }
172: }
173:
174: else
175: {
176: //
177: // add that flag, if PRINTER_ENUM_NAME enable edittext
178: //
179:
180: gdwEnumFlags |= dwControlId;
181:
182: if (dwControlId & PRINTER_ENUM_NAME)
183:
184: EnableWindow (GetDlgItem (hwnd, DID_EDITTEXT), TRUE);
185: }
186: }
187: break;
188: }
189: }
190: return 0;
191: }
192:
193:
194:
195: /******************************************************************************\
196: *
197: * FUNCTION: DisplayEnumPrintersInfo
198: *
199: * INPUTS: hwnd - handle of the EnumPrinters dialog box
200: *
201: * RETURNS: TRUE if successful,
202: * FALSE otherwise
203: *
204: \******************************************************************************/
205:
206: BOOL DisplayEnumPrintersInfo (HWND hwnd)
207: {
208: DWORD dwBytesNeeded;
209: DWORD dwPrtRet1, dwPrtRet2;
210: DWORD dwMaxPrt;
211: LPTSTR lpName = gdwEnumFlags & PRINTER_ENUM_NAME ? gszEnumName : NULL;
212:
213: LPPRINTER_INFO_1 pPrtInfo1;
214: LPPRINTER_INFO_2 pPrtInfo2;
215:
216: BOOL bReturn = TRUE;
217:
218: //
219: // get byte count needed for buffer, alloc buffer, the enum the printers
220: //
221:
222: EnumPrinters (gdwEnumFlags, lpName, 1, NULL, 0, &dwBytesNeeded,
223: &dwPrtRet1);
224:
225: //
226: // (simple error checking, if these work assume rest will too)
227: //
228:
229: if (!(pPrtInfo1 = (LPPRINTER_INFO_1) LocalAlloc (LPTR, dwBytesNeeded)))
230: {
231: ErrMsgBox ("EnumPrinters/LocalAlloc failed", ERR_MOD_NAME);
232: bReturn = FALSE;
233: goto display_prts_info_done1;
234: }
235:
236: if (!EnumPrinters (gdwEnumFlags, lpName, 1, (LPBYTE) pPrtInfo1,
237: dwBytesNeeded, &dwBytesNeeded, &dwPrtRet1))
238: {
239: ErrMsgBox ("EnumPrinters failed", ERR_MOD_NAME);
240: bReturn = FALSE;
241: goto display_prts_info_done2;
242: }
243:
244: //
245: // get byte count needed for buffer, alloc buffer, the enum the printers
246: //
247:
248: EnumPrinters (gdwEnumFlags, lpName, 2, NULL, 0, &dwBytesNeeded,
249: &dwPrtRet2);
250:
251: pPrtInfo2 = (LPPRINTER_INFO_2) LocalAlloc (LPTR, dwBytesNeeded);
252:
253: EnumPrinters (gdwEnumFlags, lpName, 2, (LPBYTE) pPrtInfo2,
254: dwBytesNeeded, &dwBytesNeeded, &dwPrtRet2);
255:
256: if (!dwPrtRet1 || !dwPrtRet2)
257: {
258: ErrMsgBox ("EnumPrinters returned 0 printers", "");
259: bReturn = FALSE;
260: goto display_prts_info_done3;
261: }
262:
263: dwMaxPrt = dwPrtRet1 > dwPrtRet2 ? dwPrtRet2 : dwPrtRet1;
264:
265: SetEnumPrintersDlgFields (hwnd, dwMaxPrt, pPrtInfo1,
266: pPrtInfo2);
267:
268: display_prts_info_done3:
269:
270: LocalFree (LocalHandle (pPrtInfo2));
271:
272: display_prts_info_done2:
273:
274: LocalFree (LocalHandle (pPrtInfo1));
275:
276: display_prts_info_done1:
277:
278: return bReturn;
279: }
280:
281:
282: /******************************************************************************\
283: *
284: * FUNCTION: SetEnumPrintersDlgFields
285: *
286: * INPUTS: hwnd - handle of the EnumPrinters dialog box
287: * dwMaxPrt - number of elements in the following two arrays
288: * pdisplay_prts_info1 - ptr to an array of PRINTER_INFO_1 structs
289: * pdisplay_prts_info2 - ptr to an array of PRINTER_INFO_2 structs
290: *
291: * COMMENTS: This function formats the info returned by EnumPrinters()
292: * into readable strings and inserts them in the listbox.
293: *
294: \******************************************************************************/
295:
296: void SetEnumPrintersDlgFields (HWND hwnd, DWORD dwMaxPrt,
297: LPPRINTER_INFO_1 pPrtInfo1,
298: LPPRINTER_INFO_2 pPrtInfo2)
299: {
300: char buf[256];
301: WORD i;
302: DWORD j;
303:
304: SendDlgItemMessage (hwnd, DID_LISTBOX, LB_RESETCONTENT, 0, 0);
305:
306: for (j = 0; j < dwMaxPrt; j++)
307: {
308: //
309: // Stick PRINTER_INFO_1 data in listbox
310: //
311:
312: SendDlgItemMessage (hwnd, DID_LISTBOX, LB_INSERTSTRING, (UINT)-1,
313: (LONG) gaEnumPrt[0]);
314:
315: outstr (gaEnumPrt[1], (pPrtInfo1 + j)->pDescription);
316: outstr (gaEnumPrt[2], (pPrtInfo1 + j)->pName);
317: outstr (gaEnumPrt[3], (pPrtInfo1 + j)->pComment);
318:
319: //
320: // Stick PRINTER_INFO_2 data in listbox
321: //
322:
323: SendDlgItemMessage (hwnd, DID_LISTBOX, LB_INSERTSTRING, (UINT)-1,
324: (LONG) gaEnumPrt[4]);
325:
326: outstr (gaEnumPrt[5], (pPrtInfo2 + j)->pServerName);
327: outstr (gaEnumPrt[6], (pPrtInfo2 + j)->pPrinterName);
328: outstr (gaEnumPrt[7], (pPrtInfo2 + j)->pShareName);
329: outstr (gaEnumPrt[8], (pPrtInfo2 + j)->pPortName);
330: outstr (gaEnumPrt[9], (pPrtInfo2 + j)->pDriverName);
331: outstr (gaEnumPrt[10], (pPrtInfo2 + j)->pComment);
332: outstr (gaEnumPrt[11], (pPrtInfo2 + j)->pLocation);
333:
334: if ((pPrtInfo2 + j)->pDevMode)
335: {
336: DWORD dwFields;
337:
338: outstr (gaEnumPrt[12], "");
339: outstr (gaEnumPrt[13], (pPrtInfo2 + j)->pDevMode->dmDeviceName);
340: outnum (gaEnumPrt[14], (pPrtInfo2 + j)->pDevMode->dmSpecVersion);
341: outnum (gaEnumPrt[15], (pPrtInfo2 + j)->pDevMode->dmDriverVersion);
342: outnum (gaEnumPrt[16], (pPrtInfo2 + j)->pDevMode->dmSize);
343: outnum (gaEnumPrt[17], (pPrtInfo2 + j)->pDevMode->dmDriverExtra);
344:
345: dwFields = (pPrtInfo2 + j)->pDevMode->dmFields;
346: ComplexEnumPrintersLine (hwnd, gaEnumPrt[18], gaFields, MAX_FIELDS,
347: dwFields);
348:
349: if (dwFields & DM_ORIENTATION)
350:
351: ComplexEnumPrintersLine (hwnd, gaEnumPrt[19], gaOrientation,
352: MAX_ORIENTATION,
353: (DWORD)
354: (pPrtInfo2+j)->pDevMode->dmOrientation);
355:
356: if (dwFields & DM_PAPERSIZE)
357:
358: ComplexEnumPrintersLine (hwnd, gaEnumPrt[20], gaPaperSize,
359: MAX_PAPERSIZE,
360: (DWORD)(pPrtInfo2 + j)->pDevMode->dmPaperSize);
361:
362: if (dwFields & DM_PAPERLENGTH)
363:
364: outnum (gaEnumPrt[21], (pPrtInfo2 + j)->pDevMode->dmPaperLength);
365:
366:
367: if (dwFields & DM_PAPERWIDTH)
368:
369: outnum (gaEnumPrt[22], (pPrtInfo2 + j)->pDevMode->dmPaperWidth);
370:
371: if (dwFields & DM_SCALE)
372:
373: outnum (gaEnumPrt[23], (pPrtInfo2 + j)->pDevMode->dmScale);
374:
375: if (dwFields & DM_COPIES)
376:
377: outnum (gaEnumPrt[24], (pPrtInfo2 + j)->pDevMode->dmCopies);
378:
379: if (dwFields & DM_DEFAULTSOURCE)
380:
381: ComplexEnumPrintersLine (hwnd, gaEnumPrt[25], gaDefaultSource,
382: MAX_DEFAULTSOURCE,
383: (DWORD)(pPrtInfo2+j)->pDevMode->dmDefaultSource);
384:
385: if (dwFields & DM_PRINTQUALITY)
386:
387: ComplexEnumPrintersLine (hwnd, gaEnumPrt[26], gaPrintQuality,
388: MAX_PRINTQUALITY,
389: (DWORD)(pPrtInfo2+j)->pDevMode->dmPrintQuality);
390:
391: if (dwFields & DM_COLOR)
392:
393: ComplexEnumPrintersLine (hwnd, gaEnumPrt[27], gaColor,
394: MAX_COLOR,
395: (DWORD)(pPrtInfo2 + j)->pDevMode->dmColor);
396:
397: if (dwFields & DM_DUPLEX)
398:
399: ComplexEnumPrintersLine (hwnd, gaEnumPrt[28], gaDuplex,
400: MAX_DUPLEX,
401: (DWORD)(pPrtInfo2 + j)->pDevMode->dmDuplex);
402:
403: if (dwFields & DM_YRESOLUTION)
404:
405: outnum (gaEnumPrt[29], NULL);
406:
407: if (dwFields & DM_TTOPTION)
408:
409: outnum (gaEnumPrt[29], NULL);
410:
411: if (dwFields & DM_COLLATE)
412:
413: outnum (gaEnumPrt[30], NULL);
414:
415: if (dwFields & DM_FORMNAME)
416:
417: outnum (gaEnumPrt[31], NULL);
418: }
419: else
420: {
421: outstr (gaEnumPrt[12], NULL);
422: }
423:
424: outstr (gaEnumPrt[33], (pPrtInfo2 + j)->pSepFile);
425: outstr (gaEnumPrt[34], (pPrtInfo2 + j)->pPrintProcessor);
426: outstr (gaEnumPrt[35], (pPrtInfo2 + j)->pDatatype);
427: outstr (gaEnumPrt[36], (pPrtInfo2 + j)->pParameters);
428:
429: ComplexEnumPrintersLine (hwnd, gaEnumPrt[37], gaAttributes,
430: MAX_ATTRIBUTES,
431: (pPrtInfo2 + j)->Attributes);
432:
433: for (i = 0; i < MAX_PRIORITIES; i++)
434:
435: if ((pPrtInfo2 + j)->Priority & gaPriorities[i].dwValue)
436: {
437: outstr (gaEnumPrt[38], gaPriorities[i].szValue);
438: break;
439: }
440:
441: if (i == MAX_PRIORITIES)
442:
443: outnum (gaEnumPrt[39], (pPrtInfo2 + j)->Priority);
444:
445: outnum (gaEnumPrt[40], (pPrtInfo2 + j)->DefaultPriority);
446: outnum (gaEnumPrt[41], (pPrtInfo2 + j)->StartTime);
447: outnum (gaEnumPrt[42], (pPrtInfo2 + j)->UntilTime);
448:
449: ComplexEnumPrintersLine (hwnd, gaEnumPrt[43], gaStatus, MAX_STATUS,
450: (pPrtInfo2 + j)->Status);
451:
452: outnum (gaEnumPrt[44], (pPrtInfo2 + j)->cJobs);
453: outnum (gaEnumPrt[45], (pPrtInfo2 + j)->AveragePPM);
454: }
455: }
456:
457:
458:
459: /******************************************************************************\
460: *
461: * FUNCTION: ComplexEnumPrintersLine
462: *
463: * INPUTS: hwnd - handle of the EnumPrinters dialog box
464: * pbuf - pointer to buffer containing a cap-type
465: * string
466: * pLkUp - pointer to a CAPSLOOKUP table
467: * iMaxEntries - # of enries in table pointed at by pLkUp
468: * iValue - an integer containing 1+ bit-value flags.
469: *
470: * COMMENTS: This function is used to expand an int containing
471: * multiple bit-values into a set of strings which are
472: * inserted into the DevCapsDlg listbox. The iValue
473: * parameter is checked against each iIndex entry in the
474: * CAPSLOOKUP table pointed at by pLkUp, and when matches
475: * are found the corresponding (lpszValue) string is
476: * inserted.
477: *
478: * The buffer pointed to by pbuf will be destroyed.
479: *
480: \******************************************************************************/
481:
482: void ComplexEnumPrintersLine (HWND hwnd, char *pstr, ENUMPRTLOOKUP *pLkUp,
483: int iMaxEntries, DWORD dwValue)
484: {
485: char buf [BUFSIZE];
486: int i;
487: BOOL bNewLine = FALSE;
488:
489: strcpy (buf, pstr);
490:
491: for (i = 0; i < iMaxEntries; i++)
492:
493: if (dwValue & (pLkUp + i)->dwValue)
494: {
495: if (bNewLine)
496: {
497: //
498: // Keep the first symbolic constant on the same line as the
499: // cap type, eg: "TECHNOLOGY: DT_RASDISPLAY".
500: //
501:
502: strcpy (buf, BLANKS);
503: strcat (buf, (pLkUp + i)->szValue);
504: }
505: else
506: {
507: //
508: // Put symbolic constant on new line, eg:
509: // " DT_RASPRINTER".
510: //
511:
512: strcat (buf, (pLkUp + i)->szValue);
513: bNewLine = TRUE;
514: }
515: SendDlgItemMessage (hwnd, DID_LISTBOX, LB_INSERTSTRING,
516: (UINT)-1, (LONG) buf);
517: }
518: }
519:
520:
521:
522: /******************************************************************************\
523: *
524: * FUNCTION: EnumPrinterDriversDlgProc (standard dlg proc INPUTS/RETURNS)
525: *
526: * COMMENTS: Processes messages for EnumPrinterDrivers dialog box
527: *
528: \******************************************************************************/
529:
530: LRESULT CALLBACK EnumPrinterDriversDlgProc (HWND hwnd, UINT msg,
531: WPARAM wParam, LPARAM lParam)
532: {
533: switch (msg)
534: {
535: case WM_INITDIALOG:
536: {
537: BOOL bReturn;
538:
539: SetCursor (LoadCursor (NULL, IDC_WAIT));
540: bReturn = DisplayPrinterDriversInfo (hwnd);
541: SetCursor (LoadCursor (NULL, IDC_ARROW));
542:
543: if (!bReturn)
544:
545: EndDialog (hwnd, TRUE);
546:
547: else
548:
549: SetWindowText (hwnd, (LPCTSTR) "EnumPrinterDrivers");
550:
551: break;
552: }
553:
554: case WM_COMMAND:
555:
556: switch (LOWORD (wParam))
557: {
558: case DID_OK:
559:
560: EndDialog (hwnd, TRUE);
561:
562: return 1;
563: }
564: break;
565: }
566: return 0;
567: }
568:
569:
570:
571: /******************************************************************************\
572: *
573: * FUNCTION: DisplayPrinterDriversInfo
574: *
575: * INPUTS: hwnd - handle of the EnumPrinterDrivers dialog box
576: *
577: * RETURNS: TRUE if successful,
578: * FALSE otherwise
579: *
580: * COMMENTS: Retrieves EnumPrinterDrivers info, formats, & inserts
581: * in listbox.
582: *
583: \******************************************************************************/
584:
585: BOOL DisplayPrinterDriversInfo (HWND hwnd)
586: {
587: DWORD dwBytesNeeded, dwDrvRet, i;
588: DRIVER_INFO_1 *pDriverInfo1;
589: DRIVER_INFO_2 *pDriverInfo2;
590: char buf[BUFSIZE];
591: BOOL bReturn = TRUE;
592:
593: //
594: // get byte count needed for buffer, alloc buffer, the enum the drivers
595: //
596:
597: EnumPrinterDrivers ((LPTSTR) NULL, (LPTSTR) NULL, 1, NULL,
598: 0, &dwBytesNeeded, &dwDrvRet);
599:
600: //
601: // simple error checking, if these work assume rest will too
602: //
603:
604: if (!(pDriverInfo1 = (DRIVER_INFO_1 *) LocalAlloc (LPTR, dwBytesNeeded)))
605: {
606: ErrMsgBox ("LocalAlloc failed", ERR_MOD_NAME);
607: bReturn = FALSE;
608: goto display_prt_drvs_info_done1;
609: }
610:
611: if (!EnumPrinterDrivers ((LPTSTR) NULL, (LPTSTR) NULL, 1,
612: (LPBYTE) pDriverInfo1, dwBytesNeeded, &dwBytesNeeded,
613: &dwDrvRet))
614: {
615: ErrMsgBox ("EnumPrinterDrivers returned 0 drivers", ERR_MOD_NAME);
616: bReturn = FALSE;
617: goto display_prt_drvs_info_done2;
618: }
619:
620: EnumPrinterDrivers ((LPTSTR) NULL,(LPTSTR) NULL, 2, NULL,
621: 0, &dwBytesNeeded, &dwDrvRet);
622:
623: pDriverInfo2 = (DRIVER_INFO_2 *) LocalAlloc (LPTR, dwBytesNeeded);
624:
625: EnumPrinterDrivers ((LPTSTR) NULL, (LPTSTR) NULL, 2,
626: (LPBYTE) pDriverInfo2, dwBytesNeeded, &dwBytesNeeded,
627: &dwDrvRet);
628:
629: if (!dwDrvRet)
630: {
631: ErrMsgBox ("EnumPrinterDrivers returned 0 drivers", "");
632: bReturn = FALSE;
633: goto display_prt_drvs_info_done3;
634: }
635:
636: //
637: // insert formatted info into listbox
638: //
639:
640: for (i = 0; i < dwDrvRet; i++)
641: {
642: sprintf (buf, gaDriverInfo[0]);
643: outstr3();
644:
645: sprintf (buf, gaDriverInfo[1], (pDriverInfo1 + i)->pName);
646: outstr3();
647:
648: sprintf (buf, gaDriverInfo[2]);
649: outstr3();
650:
651: sprintf (buf, gaDriverInfo[3], (pDriverInfo2 + i)->cVersion);
652: outstr3();
653:
654: sprintf (buf, gaDriverInfo[4], (pDriverInfo2 + i)->pName);
655: outstr3();
656:
657: sprintf (buf, gaDriverInfo[5], (pDriverInfo2 + i)->pEnvironment);
658: outstr3();
659:
660: sprintf (buf, gaDriverInfo[6], (pDriverInfo2 + i)->pDriverPath);
661: outstr3();
662:
663: sprintf (buf, gaDriverInfo[7], (pDriverInfo2 + i)->pDataFile);
664: outstr3();
665:
666: sprintf (buf, gaDriverInfo[8], (pDriverInfo2 + i)->pConfigFile);
667: outstr3();
668:
669: }
670:
671: display_prt_drvs_info_done3:
672:
673: LocalFree (LocalHandle (pDriverInfo2));
674:
675: display_prt_drvs_info_done2:
676:
677: LocalFree (LocalHandle (pDriverInfo1));
678:
679: display_prt_drvs_info_done1:
680:
681: return bReturn;
682: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.