|
|
1.1 root 1: /******************************************************************************\
2: *
3: * MODULE: ENUMPRT.C
4: *
5: * PURPOSE: To enumerate all system printers and to display the
6: * corresponding PRINTER_INFO_1 and PRINTER_INFO_2 info.
7: *
8: * FUNTIONS: EnumPrtDlgProc() - processes dialog messages
9: * SetEnumPrtDlgFields() - formats data returned by
10: * EnumPrinters and inserts in
11: * listbox.
12: *
13: \******************************************************************************/
14:
15: #include <windows.h>
16: #include <winspool.h>
17: #include <string.h>
18: #include "lookup.h"
19: #include "enumprt.h"
20: #include "printer.h"
21:
22:
23:
24: /******************************************************************************\
25: *
26: * FUNCTION: EnumPrtDlgProc (standard dialog procedure INPUTS/RETURNS)
27: *
28: * LOCAL VARS: pPrtInfo1 - pointer to array of PRINTER_INFO_1 structs
29: * pPrtInfo2 - pointer to array of PRINTER_INFO_2 structs
30: * dwMaxPrt - number of printers returned by EnumPrinters()
31: * dwCurrPrt - index of printer whose info is currently
32: * listed in listbox
33: *
34: * COMMENTS: On the WM_CREATE we go out & enum all system printers,
35: * Then we throw all the info about the first on the the
36: * dialog's listbox, and allow user to look at next/prev
37: * printer's info also.
38: *
39: \******************************************************************************/
40:
41: BOOL APIENTRY EnumDlgProc (HWND hDlg, UINT message, UINT wParam,
42: LONG lParam)
43: {
44: static LPPRINTER_INFO_1 pPrtInfo1;
45: static LPPRINTER_INFO_2 pPrtInfo2;
46:
47: static DWORD dwMaxPrt;
48:
49: switch (message)
50: {
51: case WM_INITDIALOG:
52: {
53: DWORD dwEnumFlags = PRINTER_ENUM_LOCAL | PRINTER_ENUM_FAVORITE;
54: DWORD dwBytesNeeded;
55: DWORD dwPrtRet1, dwPrtRet2;
56:
57: EnumPrinters (dwEnumFlags, NULL, 1, NULL, 0, &dwBytesNeeded,
58: &dwPrtRet1);
59:
60: pPrtInfo1 = (LPPRINTER_INFO_1) LocalAlloc (LPTR, dwBytesNeeded + 4);
61:
62: EnumPrinters (dwEnumFlags, NULL, 1, (LPBYTE) pPrtInfo1,
63: dwBytesNeeded, &dwBytesNeeded, &dwPrtRet1);
64:
65: EnumPrinters (dwEnumFlags, NULL, 2, NULL, 0, &dwBytesNeeded,
66: &dwPrtRet2);
67:
68: pPrtInfo2 = (LPPRINTER_INFO_2) LocalAlloc (LPTR, dwBytesNeeded + 4);
69:
70: EnumPrinters (dwEnumFlags, NULL, 2, (LPBYTE) pPrtInfo2,
71: dwBytesNeeded, &dwBytesNeeded, &dwPrtRet2);
72:
73: dwMaxPrt = dwPrtRet1 > dwPrtRet2 ? dwPrtRet2 : dwPrtRet1;
74: SetEnumPrtDlgFields (hDlg, dwMaxPrt, pPrtInfo1, pPrtInfo2);
75: break;
76: }
77: case WM_COMMAND:
78:
79: switch (LOWORD(wParam))
80: {
81: case IDOK:
82: {
83: LocalFree (LocalHandle ((LPSTR) pPrtInfo1));
84: LocalFree (LocalHandle ((LPSTR) pPrtInfo2));
85: EndDialog(hDlg, TRUE);
86: break;
87: }
88: }
89: return (TRUE);
90: }
91: return (FALSE);
92: UNREFERENCED_PARAMETER(lParam);
93: }
94:
95:
96:
97: /******************************************************************************\
98: *
99: * FUNCTION: SetEnumPrtDlgFields
100: *
101: * LOCAL VARS: buf - temp string buffer
102: * i - loop variables
103: *
104: * COMMENTS: This function formats the info returned by EnumPrinters()
105: * into readable strings and inserts them in the listbox.
106: *
107: \******************************************************************************/
108:
109: void SetEnumPrtDlgFields (HWND hDlg, DWORD dwMaxPrt,
110: LPPRINTER_INFO_1 pPrtInfo1,
111: LPPRINTER_INFO_2 pPrtInfo2)
112: {
113: char buf[256];
114: WORD i;
115: DWORD j;
116:
117: SendDlgItemMessage (hDlg, DID_LISTBOX, LB_RESETCONTENT, 0, 0);
118:
119: for (j = 0; j < dwMaxPrt; j++)
120: {
121: /**************************************************************************\
122: * Stick PRINTER_INFO_1 data in listbox
123: \**************************************************************************/
124:
125: SendDlgItemMessage (hDlg, DID_LISTBOX, LB_INSERTSTRING, (UINT)-1,
126: (LONG) enumstr[0]);
127:
128: // nothing for Flags yet
129:
130: outstr (enumstr[1], (pPrtInfo1 + j)->pDescription);
131: outstr (enumstr[2], (pPrtInfo1 + j)->pName);
132: outstr (enumstr[3], (pPrtInfo1 + j)->pComment);
133:
134:
135: /**************************************************************************\
136: * Stick PRINTER_INFO_2 data in listbox
137: \**************************************************************************/
138:
139: SendDlgItemMessage (hDlg, DID_LISTBOX, LB_INSERTSTRING, (UINT)-1,
140: (LONG) enumstr[4]);
141:
142: outstr (enumstr[5], (pPrtInfo2 + j)->pServerName);
143: outstr (enumstr[6], (pPrtInfo2 + j)->pPrinterName);
144: outstr (enumstr[7], (pPrtInfo2 + j)->pShareName);
145: outstr (enumstr[8], (pPrtInfo2 + j)->pPortName);
146: outstr (enumstr[9], (pPrtInfo2 + j)->pDriverName);
147: outstr (enumstr[10], (pPrtInfo2 + j)->pComment);
148: outstr (enumstr[11], (pPrtInfo2 + j)->pLocation);
149:
150: if ((pPrtInfo2 + j)->pDevMode)
151: {
152: outstr (enumstr[12], "");
153: outstr (enumstr[13], (pPrtInfo2 + j)->pDevMode->dmDeviceName);
154: outstr (enumstr[14], NULL);
155: outstr (enumstr[15], NULL);
156: outstr (enumstr[16], NULL);
157: outstr (enumstr[17], NULL);
158: outstr (enumstr[18], NULL);
159: outstr (enumstr[19], NULL);
160: outstr (enumstr[20], NULL);
161: outstr (enumstr[21], NULL);
162: outstr (enumstr[22], NULL);
163: outstr (enumstr[23], NULL);
164: outstr (enumstr[24], NULL);
165: outstr (enumstr[25], NULL);
166: outstr (enumstr[26], NULL);
167: outstr (enumstr[27], NULL);
168: }
169: else
170: {
171: outstr (enumstr[12], NULL);
172: }
173:
174: outstr (enumstr[28], (pPrtInfo2 + j)->pSepFile);
175: outstr (enumstr[29], (pPrtInfo2 + j)->pPrintProcessor);
176: outstr (enumstr[30], (pPrtInfo2 + j)->pDatatype);
177: outstr (enumstr[31], (pPrtInfo2 + j)->pParameters);
178:
179: wsprintf (buf, enumstr[32]);
180: for (i = 0; i < MAX_NUM_PRT_ATTRIBUTES; i++)
181:
182: if ((pPrtInfo2 + j)->Attributes & attributes[i].x.dwIndex)
183:
184: strcat (buf, attributes[i].lpszValue);
185:
186: outstr2 (buf);
187:
188: for (i = 0; i < MAX_NUM_PRT_PRIORITIES; i++)
189:
190: if ((pPrtInfo2 + j)->Priority & priorities[i].x.dwIndex)
191: {
192: outstr (enumstr[33], priorities[i].lpszValue);
193: break;
194: }
195: if (i == MAX_NUM_PRT_PRIORITIES)
196:
197: outnum (enumstr[34], (pPrtInfo2 + j)->Priority);
198:
199: outnum (enumstr[35], (pPrtInfo2 + j)->DefaultPriority);
200: outnum (enumstr[36], (pPrtInfo2 + j)->StartTime);
201: outnum (enumstr[37], (pPrtInfo2 + j)->UntilTime);
202:
203: outstr2 (enumstr[38]);
204: for (i = 0; i < MAX_NUM_PRT_STATUS; i++)
205:
206: if ((pPrtInfo2 + j)->Status & status[i].x.dwIndex)
207:
208: outstr2 (status[i].lpszValue);
209:
210: outnum (enumstr[39], (pPrtInfo2 + j)->cJobs);
211: outnum (enumstr[40], (pPrtInfo2 + j)->AveragePPM);
212: }
213: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.