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)
29 buffer
= srealloc(buffer
, needed
);
31 if (EnumPrinters(PRINTER_ENUM_LOCAL
, NULL
, 5,
32 (LPBYTE
)buffer
, needed
, &needed
, &nprinters
) == 0)
35 ret
->info
= (LPPRINTER_INFO_5
)buffer
;
36 ret
->nprinters
= *nprinters_ptr
= nprinters
;
46 char *printer_get_name(printer_enum
*pe
, int i
)
50 if (i
< 0 || i
>= pe
->nprinters
)
52 return pe
->info
[i
].pPrinterName
;
55 void printer_finish_enum(printer_enum
*pe
)
63 printer_job
*printer_start_job(char *printer
)
65 printer_job
*ret
= smalloc(sizeof(printer_job
));
67 int jobstarted
= 0, pagestarted
= 0;
70 if (!OpenPrinter(printer
, &ret
->hprinter
, NULL
))
73 docinfo
.pDocName
= "PuTTY remote printer output";
74 docinfo
.pOutputFile
= NULL
;
75 docinfo
.pDatatype
= "RAW";
77 if (!StartDocPrinter(ret
->hprinter
, 1, (LPSTR
)&docinfo
))
81 if (!StartPagePrinter(ret
->hprinter
))
89 EndPagePrinter(ret
->hprinter
);
91 EndDocPrinter(ret
->hprinter
);
93 ClosePrinter(ret
->hprinter
);
98 void printer_job_data(printer_job
*pj
, void *data
, int len
)
105 WritePrinter(pj
->hprinter
, data
, len
, &written
);
108 void printer_finish_job(printer_job
*pj
)
113 EndPagePrinter(pj
->hprinter
);
114 EndDocPrinter(pj
->hprinter
);
115 ClosePrinter(pj
->hprinter
);