2 * Printing interface for PuTTY.
8 struct printer_enum_tag
{
10 LPPRINTER_INFO_5 info
;
13 struct printer_job_tag
{
17 printer_enum
*printer_start_enum(int *nprinters_ptr
)
19 printer_enum
*ret
= smalloc(sizeof(printer_enum
));
21 DWORD needed
, nprinters
;
23 *nprinters_ptr
= 0; /* default return value */
24 buffer
= smalloc(512);
25 if (EnumPrinters(PRINTER_ENUM_LOCAL
, NULL
, 5,
26 buffer
, 512, &needed
, &nprinters
) == 0)
30 buffer
= srealloc(buffer
, needed
);
32 if (EnumPrinters(PRINTER_ENUM_LOCAL
, NULL
, 5,
33 (LPBYTE
)buffer
, needed
, &needed
, &nprinters
) == 0)
40 ret
->info
= (LPPRINTER_INFO_5
)buffer
;
41 ret
->nprinters
= *nprinters_ptr
= nprinters
;
51 char *printer_get_name(printer_enum
*pe
, int i
)
55 if (i
< 0 || i
>= pe
->nprinters
)
57 return pe
->info
[i
].pPrinterName
;
60 void printer_finish_enum(printer_enum
*pe
)
68 printer_job
*printer_start_job(char *printer
)
70 printer_job
*ret
= smalloc(sizeof(printer_job
));
72 int jobstarted
= 0, pagestarted
= 0;
75 if (!OpenPrinter(printer
, &ret
->hprinter
, NULL
))
78 docinfo
.pDocName
= "PuTTY remote printer output";
79 docinfo
.pOutputFile
= NULL
;
80 docinfo
.pDatatype
= "RAW";
82 if (!StartDocPrinter(ret
->hprinter
, 1, (LPSTR
)&docinfo
))
86 if (!StartPagePrinter(ret
->hprinter
))
94 EndPagePrinter(ret
->hprinter
);
96 EndDocPrinter(ret
->hprinter
);
98 ClosePrinter(ret
->hprinter
);
103 void printer_job_data(printer_job
*pj
, void *data
, int len
)
110 WritePrinter(pj
->hprinter
, data
, len
, &written
);
113 void printer_finish_job(printer_job
*pj
)
118 EndPagePrinter(pj
->hprinter
);
119 EndDocPrinter(pj
->hprinter
);
120 ClosePrinter(pj
->hprinter
);