2 * Printing interface for PuTTY.
9 * Boggle. Flipping between the two branches of this #if appears to
10 * make all the difference as to whether network printers show up
11 * under PRINTER_ENUM_CONNECTIONS on NT 4. I don't pretend to
16 #define ENUM_PTR LPPRINTER_INFO_5
17 #define ENUM_TYPE PRINTER_INFO_5
18 #define ENUM_MEMBER pPrinterName
21 #define ENUM_PTR LPPRINTER_INFO_1
22 #define ENUM_TYPE PRINTER_INFO_1
23 #define ENUM_MEMBER pName
26 struct printer_enum_tag
{
31 struct printer_job_tag
{
35 static char *printer_add_enum(int param
, char *buffer
,
36 int offset
, int *nprinters_ptr
)
38 DWORD needed
, nprinters
;
40 buffer
= sresize(buffer
, offset
+512, char);
43 * Exploratory call to EnumPrinters to determine how much space
44 * we'll need for the output. Discard the return value since it
45 * will almost certainly be a failure due to lack of space.
47 EnumPrinters(param
, NULL
, ENUM_LEVEL
, buffer
+offset
, 512,
53 buffer
= sresize(buffer
, offset
+needed
, char);
55 if (EnumPrinters(param
, NULL
, ENUM_LEVEL
, buffer
+offset
,
56 needed
, &needed
, &nprinters
) == 0)
59 *nprinters_ptr
+= nprinters
;
64 printer_enum
*printer_start_enum(int *nprinters_ptr
)
66 printer_enum
*ret
= snew(printer_enum
);
67 char *buffer
= NULL
, *retval
;
69 *nprinters_ptr
= 0; /* default return value */
70 buffer
= snewn(512, char);
72 retval
= printer_add_enum(PRINTER_ENUM_LOCAL
| PRINTER_ENUM_CONNECTIONS
,
73 buffer
, 0, nprinters_ptr
);
79 ret
->info
= (ENUM_PTR
)buffer
;
80 ret
->nprinters
= *nprinters_ptr
;
91 char *printer_get_name(printer_enum
*pe
, int i
)
95 if (i
< 0 || i
>= pe
->nprinters
)
97 return pe
->info
[i
].ENUM_MEMBER
;
100 void printer_finish_enum(printer_enum
*pe
)
108 printer_job
*printer_start_job(char *printer
)
110 printer_job
*ret
= snew(printer_job
);
112 int jobstarted
= 0, pagestarted
= 0;
114 ret
->hprinter
= NULL
;
115 if (!OpenPrinter(printer
, &ret
->hprinter
, NULL
))
118 docinfo
.pDocName
= "PuTTY remote printer output";
119 docinfo
.pOutputFile
= NULL
;
120 docinfo
.pDatatype
= "RAW";
122 if (!StartDocPrinter(ret
->hprinter
, 1, (LPSTR
)&docinfo
))
126 if (!StartPagePrinter(ret
->hprinter
))
134 EndPagePrinter(ret
->hprinter
);
136 EndDocPrinter(ret
->hprinter
);
138 ClosePrinter(ret
->hprinter
);
143 void printer_job_data(printer_job
*pj
, void *data
, int len
)
150 WritePrinter(pj
->hprinter
, data
, len
, &written
);
153 void printer_finish_job(printer_job
*pj
)
158 EndPagePrinter(pj
->hprinter
);
159 EndDocPrinter(pj
->hprinter
);
160 ClosePrinter(pj
->hprinter
);