2 * Printing interface for PuTTY.
7 struct printer_enum_tag
{
16 struct printer_job_tag
{
20 static char *printer_add_enum(int param
, DWORD level
, char *buffer
,
21 int offset
, int *nprinters_ptr
)
23 DWORD needed
, nprinters
;
25 buffer
= sresize(buffer
, offset
+512, char);
28 * Exploratory call to EnumPrinters to determine how much space
29 * we'll need for the output. Discard the return value since it
30 * will almost certainly be a failure due to lack of space.
32 EnumPrinters(param
, NULL
, level
, buffer
+offset
, 512,
38 buffer
= sresize(buffer
, offset
+needed
, char);
40 if (EnumPrinters(param
, NULL
, level
, buffer
+offset
,
41 needed
, &needed
, &nprinters
) == 0)
44 *nprinters_ptr
+= nprinters
;
49 printer_enum
*printer_start_enum(int *nprinters_ptr
)
51 printer_enum
*ret
= snew(printer_enum
);
52 char *buffer
= NULL
, *retval
;
54 *nprinters_ptr
= 0; /* default return value */
55 buffer
= snewn(512, char);
58 * Determine what enumeration level to use.
59 * When enumerating printers, we need to use PRINTER_INFO_4 on
60 * NT-class systems to avoid Windows looking too hard for them and
61 * slowing things down; and we need to avoid PRINTER_INFO_5 as
62 * we've seen network printers not show up.
63 * On 9x-class systems, PRINTER_INFO_4 isn't available and
64 * PRINTER_INFO_5 is recommended.
67 if (osVersion
.dwPlatformId
!= VER_PLATFORM_WIN32_NT
) {
73 retval
= printer_add_enum(PRINTER_ENUM_LOCAL
| PRINTER_ENUM_CONNECTIONS
,
74 ret
->enum_level
, buffer
, 0, nprinters_ptr
);
80 switch (ret
->enum_level
) {
82 ret
->info
.i4
= (LPPRINTER_INFO_4
)buffer
;
85 ret
->info
.i5
= (LPPRINTER_INFO_5
)buffer
;
88 ret
->nprinters
= *nprinters_ptr
;
99 char *printer_get_name(printer_enum
*pe
, int i
)
103 if (i
< 0 || i
>= pe
->nprinters
)
105 switch (pe
->enum_level
) {
107 return pe
->info
.i4
[i
].pPrinterName
;
109 return pe
->info
.i5
[i
].pPrinterName
;
115 void printer_finish_enum(printer_enum
*pe
)
119 switch (pe
->enum_level
) {
130 printer_job
*printer_start_job(char *printer
)
132 printer_job
*ret
= snew(printer_job
);
134 int jobstarted
= 0, pagestarted
= 0;
136 ret
->hprinter
= NULL
;
137 if (!OpenPrinter(printer
, &ret
->hprinter
, NULL
))
140 docinfo
.pDocName
= "PuTTY remote printer output";
141 docinfo
.pOutputFile
= NULL
;
142 docinfo
.pDatatype
= "RAW";
144 if (!StartDocPrinter(ret
->hprinter
, 1, (LPSTR
)&docinfo
))
148 if (!StartPagePrinter(ret
->hprinter
))
156 EndPagePrinter(ret
->hprinter
);
158 EndDocPrinter(ret
->hprinter
);
160 ClosePrinter(ret
->hprinter
);
165 void printer_job_data(printer_job
*pj
, void *data
, int len
)
172 WritePrinter(pj
->hprinter
, data
, len
, &written
);
175 void printer_finish_job(printer_job
*pj
)
180 EndPagePrinter(pj
->hprinter
);
181 EndDocPrinter(pj
->hprinter
);
182 ClosePrinter(pj
->hprinter
);