From 09ad523acfce110f8ed69b99bbf76d934608ff3e Mon Sep 17 00:00:00 2001 From: simon Date: Sat, 9 Mar 2002 19:06:58 +0000 Subject: [PATCH] As ever, There's Always One. Check in the extra source file. *blush* git-svn-id: svn://svn.tartarus.org/sgt/putty@1582 cda61777-01e9-0310-a592-d414129be87e --- printing.c | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 printing.c diff --git a/printing.c b/printing.c new file mode 100644 index 00000000..9ba2d5d6 --- /dev/null +++ b/printing.c @@ -0,0 +1,117 @@ +/* + * Printing interface for PuTTY. + */ + +#include +#include "putty.h" + +struct printer_enum_tag { + int nprinters; + LPPRINTER_INFO_5 info; +}; + +struct printer_job_tag { + HANDLE hprinter; +}; + +printer_enum *printer_start_enum(int *nprinters_ptr) +{ + printer_enum *ret = smalloc(sizeof(printer_enum)); + char *buffer = NULL; + DWORD needed, nprinters; + + *nprinters_ptr = 0; /* default return value */ + buffer = smalloc(512); + if (EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 5, + buffer, 512, &needed, &nprinters) == 0) + goto error; + + buffer = srealloc(buffer, needed); + + if (EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 5, + (LPBYTE)buffer, needed, &needed, &nprinters) == 0) + goto error; + + ret->info = (LPPRINTER_INFO_5)buffer; + ret->nprinters = *nprinters_ptr = nprinters; + + return ret; + + error: + sfree(buffer); + sfree(ret); + return NULL; +} + +char *printer_get_name(printer_enum *pe, int i) +{ + if (!pe) + return NULL; + if (i < 0 || i >= pe->nprinters) + return NULL; + return pe->info[i].pPrinterName; +} + +void printer_finish_enum(printer_enum *pe) +{ + if (!pe) + return; + sfree(pe->info); + sfree(pe); +} + +printer_job *printer_start_job(char *printer) +{ + printer_job *ret = smalloc(sizeof(printer_job)); + DOC_INFO_1 docinfo; + int jobstarted = 0, pagestarted = 0; + + ret->hprinter = NULL; + if (!OpenPrinter(printer, &ret->hprinter, NULL)) + goto error; + + docinfo.pDocName = "PuTTY remote printer output"; + docinfo.pOutputFile = NULL; + docinfo.pDatatype = "RAW"; + + if (!StartDocPrinter(ret->hprinter, 1, (LPSTR)&docinfo)) + goto error; + jobstarted = 1; + + if (!StartPagePrinter(ret->hprinter)) + goto error; + pagestarted = 1; + + return ret; + + error: + if (pagestarted) + EndPagePrinter(ret->hprinter); + if (jobstarted) + EndDocPrinter(ret->hprinter); + if (ret->hprinter) + ClosePrinter(ret->hprinter); + sfree(ret); + return NULL; +} + +void printer_job_data(printer_job *pj, void *data, int len) +{ + DWORD written; + + if (!pj) + return; + + WritePrinter(pj->hprinter, data, len, &written); +} + +void printer_finish_job(printer_job *pj) +{ + if (!pj) + return; + + EndPagePrinter(pj->hprinter); + EndDocPrinter(pj->hprinter); + ClosePrinter(pj->hprinter); + sfree(pj); +} -- 2.11.0