diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/dktools/dk3print.c |
Initial commit
Diffstat (limited to 'support/dktools/dk3print.c')
-rw-r--r-- | support/dktools/dk3print.c | 1269 |
1 files changed, 1269 insertions, 0 deletions
diff --git a/support/dktools/dk3print.c b/support/dktools/dk3print.c new file mode 100644 index 0000000000..f9c489ceb5 --- /dev/null +++ b/support/dktools/dk3print.c @@ -0,0 +1,1269 @@ +/* + WARNING: This file was generated by dkct. + Changes you make here will be lost if dkct is run again! + You should modify the original source and run dkct on it. + Original source: dk3print.ctr +*/ + +/* +Copyright (C) 2013-2017, Dirk Krause + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above opyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +* Neither the name of the author nor the names of contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** @file dk3print.c The dk3print module. +*/ + + +#line 136 "dk3print.ctr" + + + +#include "dk3all.h" +#include "dk3print.h" +#include "dk3prcfg.h" +#include "dk3prreq.h" + + + + + +#line 147 "dk3print.ctr" + + + +/** Keywords used by the module, not localized. +*/ +static dkChar const * const dk3print_nl[] = { +/* 0 */ +dkT("dk3print.conf"), + +/* 1 */ +dkT("dk3print.str"), + +/* 2 */ +dkT("PS"), + +/* 3 */ +dkT("PostScript"), + +/* 4 */ +dkT("Ghostscript PDF"), + +/* 5 */ +dkT("/print/ps/level"), + +/* 6 */ +dkT("%d"), + +NULL + + +#line 183 "dk3print.ctr" +}; + + + +/** Texts used by the module, normaly replaced by localized texts. +*/ +static dkChar const * const dk3print_msg[] = { +/* 0 */ +dkT("PRINTER:"), + +/* 1 */ +dkT("PRIMARY CONFIGURATION:"), + +/* 2 */ +dkT("SECONDARY CONFIGURATION:"), + +/* 3 */ +dkT("Printer type: "), + +/* 4 */ +dkT("Host: "), + +/* 5 */ +dkT("Queue: "), + +/* 6 */ +dkT("Port: "), + +/* 7 */ +dkT("Connect timeout: "), + +/* 8 */ +dkT("Send timeout: "), + +/* 9 */ +dkT("Receive timeout: "), + +/* 10 */ +dkT("PS level: "), + +/* 11 */ +dkT("Default: "), + +/* 12 */ +dkT("SNMP host: "), + +/* 13 */ +dkT("SNMP community: "), + +/* 14 */ +dkT("SNMP version: "), + +/* 15 */ +dkT("Orderly release: "), + +/* 16 */ +dkT("unknown"), + +/* 17 */ +dkT("Windows"), + +/* 18 */ +dkT("Socket"), + +/* 19 */ +dkT("LPD"), + +/* 20 */ +dkT("LPRng"), + +/* 21 */ +dkT("yes"), + +/* 22 */ +dkT("no"), + +/* 23 */ +dkT("1"), + +/* 24 */ +dkT("2c"), + +/* 25 */ +dkT("2p"), + +/* 26 */ +dkT("3"), + +/* 27 */ +dkT("Missing closing bracket ']'!"), + +/* 28 */ +dkT("Keyword \""), + +/* 29 */ +dkT("\" not allowed here, must be \"host\" or \"printer\"!"), + +/* 30 */ +dkT("Missing name for printer or host!"), + +/* 31 */ +dkT("Printer \""), + +/* 32 */ +dkT("\" already exists!"), + +/* 33 */ +dkT("Printer alias \""), + +/* 34 */ +dkT("\" already exists!"), + +/* 35 */ +dkT("Option \""), + +/* 36 */ +dkT("\" requires an argument!"), + +/* 37 */ +dkT("Queue type is already set!"), + +/* 38 */ +dkT("Unknown print queue type \""), + +/* 39 */ +dkT("\"!"), + +/* 40 */ +dkT("Overwriting host name \""), + +/* 41 */ +dkT("\"!"), + +/* 42 */ +dkT("Option \""), + +/* 43 */ +dkT("\" invalid for printer type!"), + +/* 44 */ +dkT("Overwriting queue name \""), + +/* 45 */ +dkT("\"!"), + +/* 46 */ +dkT("Overwriting port number "), + +/* 47 */ +dkT("!"), + +/* 48 */ +dkT("Numeric overflow!"), + +/* 49 */ +dkT("Illegal PS level \""), + +/* 50 */ +dkT("\", must be 2 or 3!"), + +/* 51 */ +dkT("Overwriting SNMP host \""), + +/* 52 */ +dkT("\"!"), + +/* 53 */ +dkT("Overwriting SNMP community \""), + +/* 54 */ +dkT("\"!"), + +/* 55 */ +dkT("Overwriting SNMP version!"), + +/* 56 */ +dkT("Unknown SNMP version \""), + +/* 57 */ +dkT("\"!"), + +/* 58 */ +dkT("Overwriting receive timeout \""), + +/* 59 */ +dkT("\"!"), + +/* 60 */ +dkT("Overwriting send timeout \""), + +/* 61 */ +dkT("\"!"), + +/* 62 */ +dkT("Overwriting connect timeout \""), + +/* 63 */ +dkT("\"!"), + +/* 64 */ +dkT("Unknown configuration option \""), + +/* 65 */ +dkT("\"!"), + +/* 66 */ +dkT("Print host \""), + +/* 67 */ +dkT("\" already exists!"), + +/* 68 */ +dkT("Print host alias \""), + +/* 69 */ +dkT("\" already exists!"), + +/* 70 */ +dkT("Illegal encoding \""), + +/* 71 */ +dkT("\" for LPD protocol!"), + +/* 72 */ +dkT("Line outside scope, not belonging to printer or host!"), + +NULL + + +#line 415 "dk3print.ctr" +}; + + + +void +dk3print_win_det_cleanup(dk3_printer_windows_details_t *ptr) +{ + + +#line 423 "dk3print.ctr" + if(ptr) { + } + + +#line 426 "dk3print.ctr" +} + + + +void +dk3print_lprng_det_cleanup(dk3_printer_lprng_details_t *ptr) +{ + + +#line 434 "dk3print.ctr" + if(ptr) { + dk3_release(ptr->hostname); + dk3_release(ptr->queuename); + } + + +#line 439 "dk3print.ctr" +} + + + +void +dk3print_socket_det_cleanup(dk3_printer_socket_t *ptr) +{ + + +#line 447 "dk3print.ctr" + if(ptr) { + dk3_release(ptr->hostname); + ptr->portno = 0; + ptr->ordrel = 0x00; + } + + +#line 453 "dk3print.ctr" +} + + + +void +dk3print_det_cleanup(int tp, dk3_printer_details_t *ptr) +{ + + +#line 461 "dk3print.ctr" + if(ptr) { + switch(tp) { + case DK3_PRINTER_TYPE_WINDOWS: { + dk3print_win_det_cleanup(&(ptr->win)); + } break; + case DK3_PRINTER_TYPE_SOCKET: { + dk3print_socket_det_cleanup(&(ptr->sock)); + } break; + case DK3_PRINTER_TYPE_LPD: { + dk3print_lprng_det_cleanup(&(ptr->lprng)); + } break; + case DK3_PRINTER_TYPE_LPRNG: { + dk3print_lprng_det_cleanup(&(ptr->lprng)); + } break; + } + } + + +#line 478 "dk3print.ctr" +} + + + +void +dk3print_printer_delete(dk3_printer_t *ptr) +{ + + +#line 486 "dk3print.ctr" + if(ptr) { + dk3print_det_cleanup(ptr->t_p, &(ptr->det_p)); + dk3print_det_cleanup(ptr->t_s, &(ptr->det_s)); + dk3_release(ptr->name); + dk3_release(ptr->h_snmp); + dk3_release(ptr->c_snmp); + dk3_delete(ptr); + } + +#line 494 "dk3print.ctr" +} + + + +dk3_printer_t * +dk3print_printer_new(dk3_print_conf_t *pc, dkChar const *name) +{ + dk3_printer_t *back = NULL; + if((pc) && (name)) { + back = + (dk3_printer_t *)dk3sto_it_find_like(pc->iPrinters, (void *)name, 1); + if(!(back)) { + back = dk3_new_app(dk3_printer_t,1,pc->app); + if(back) { + back->name = NULL; + back->h_snmp = NULL; + back->c_snmp = 0; + back->t_p = DK3_PRINTER_TYPE_NONE; + back->t_s = DK3_PRINTER_TYPE_NONE; + back->v_snmp = DK3_SNMP_VERSION_UNKNOWN; + back->ps = 0; + back->name = dk3str_dup_app(name, pc->app); + if(back->name) { + if(!dk3sto_add(pc->sPrinters, back)) { + dk3print_printer_delete(back); + back = NULL; + } + } else { + dk3print_printer_delete(back); + back = NULL; + } + } + } + if(back) { + if(!(pc->defPrinter)) { + pc->defPrinter = back; + } + } + } + return back; +} + + + +void +dk3print_alias_delete(dk3_printer_alias_t *ptr) +{ + + +#line 542 "dk3print.ctr" + if(ptr) { + dk3_release(ptr->name); + ptr->printer = NULL; + dk3_delete(ptr); + } + + +#line 548 "dk3print.ctr" +} + + + +void +dk3print_host_delete(dk3_print_host_t *ptr) +{ + + +#line 556 "dk3print.ctr" + if(ptr) { + dk3_release(ptr->name); + dk3_delete(ptr); + } + + +#line 561 "dk3print.ctr" +} + + + +dk3_print_host_t * +dk3print_host_new(dk3_print_conf_t *pc, dkChar const *name) +{ + dk3_print_host_t *back = NULL; + if((pc) && (name)) { + back = + (dk3_print_host_t *)dk3sto_it_find_like(pc->iPrintHosts, (void *)name, 1); + if(!(back)) { + back = dk3_new_app(dk3_print_host_t,1,pc->app); + if(back) { + back->name = NULL; + /* Further initialization. */ + back->to_c = -1.0; + back->to_r = -1.0; + back->to_s = -1.0; + back->enc = DK3_ENCODING_UTF8; + /* Save name. */ + back->name = dk3str_dup_app(name, pc->app); + if(back->name) { + /* Add to configuration. */ + if(!dk3sto_add(pc->sPrintHosts, back)) { + dk3print_host_delete(back); + back = NULL; + } + } else { + dk3print_host_delete(back); + back = NULL; + } + } + } + if(back) { + if(!(pc->defHost)) { + pc->defHost = back; + } + } + } + return back; +} + + + +void +dk3print_host_alias_delete(dk3_print_host_alias_t *ptr) +{ + + +#line 610 "dk3print.ctr" + if(ptr) { + dk3_release(ptr->name); + ptr->host = NULL; + dk3_delete(ptr); + } + + +#line 616 "dk3print.ctr" +} + + + +void +dk3print_conf_delete(dk3_print_conf_t *pc) +{ + void *vptr; /* Current element to delete. */ + + + +#line 626 "dk3print.ctr" + if(pc) { + pc->defPrinter = NULL; + pc->defHost = NULL; + if(pc->sHostAliases) { + if(pc->iHostAliases) { + dk3sto_it_reset(pc->iHostAliases); + while(NULL != (vptr = dk3sto_it_next(pc->iHostAliases))) { + dk3print_host_alias_delete((dk3_print_host_alias_t *)vptr); + } + dk3sto_it_close(pc->iHostAliases); + } + dk3sto_close(pc->sHostAliases); + } pc->sHostAliases = NULL; pc->iHostAliases = NULL; + if(pc->sPrintHosts) { + if(pc->iPrintHosts) { + dk3sto_it_reset(pc->iPrintHosts); + while(NULL != (vptr = dk3sto_it_next(pc->iPrintHosts))) { + dk3print_host_delete((dk3_print_host_t *)vptr); + } + dk3sto_it_close(pc->iPrintHosts); + } + dk3sto_close(pc->sPrintHosts); + } pc->sPrintHosts = NULL; pc->iPrintHosts = NULL; + if(pc->sPrintAliases) { + if(pc->iPrintAliases) { + dk3sto_it_reset(pc->iPrintAliases); + while(NULL != (vptr = dk3sto_it_next(pc->iPrintAliases))) { + dk3print_alias_delete((dk3_printer_alias_t *)vptr); + } + dk3sto_it_close(pc->iPrintAliases); + } + dk3sto_close(pc->sPrintAliases); + } pc->sPrintAliases = NULL; pc->iPrintAliases = NULL; + if(pc->sPrinters) { + if(pc->iPrinters) { + dk3sto_it_reset(pc->iPrinters); + while(NULL != (vptr = dk3sto_it_next(pc->iPrinters))) { + dk3print_printer_delete((dk3_printer_t *)vptr); + } + dk3sto_it_close(pc->iPrinters); + } + dk3sto_close(pc->sPrinters); + } pc->sPrinters = NULL; pc->iPrinters = NULL; + pc->app = NULL; + pc->msg = NULL; + dk3_delete(pc); + } + +#line 673 "dk3print.ctr" +} + + + +/** Compare two printers by name. + @param l Left object. + @param r Right object or name. + @param cr Comparison criteria (0=printer/printer, 1=printer/name). + @return Comparison result. +*/ +static +int +dk3print_compare_printer(void const *l, void const *r, int cr) +{ + int back = 0; + dk3_printer_t const *pl; /* Pointer to left printer. */ + dk3_printer_t const *pr; /* Pointer to right printer. */ + dkChar const *n; /* Pointer to right name. */ + if(l) { + if(r) { + pl = (dk3_printer_t const *)l; + switch(cr) { + case 1: { + n = (dkChar const *)r; + if(pl->name) { + back = dk3str_cmp(pl->name, n); + if(back < 0) back = -1; + if(back > 0) back = 1; + } else { + back = -1; + } + } break; + default: { + pr = (dk3_printer_t const *)r; + if(pl->name) { + if(pr->name) { + back = dk3str_cmp(pl->name, pr->name); + if(back < 0) back = -1; + if(back > 0) back = 1; + } else { + back = 1; + } + } else { + if(pr->name) { + back = -1; + } + } + } break; + } + } else { + back = 1; + } + } else { + if(r) { + back = -1; + } + } + return back; +} + + + +/** Compare two printer aliases by name. + @param l Left object. + @param r Right object or name. + @param cr Comparison criteria (0=alias/alias, 1=alias/name). + @return Comparison result. +*/ +static +int +dk3print_compare_print_alias(void const *l, void const *r, int cr) +{ + int back = 0; + dk3_printer_alias_t const *pl; /* Left printer alias. */ + dk3_printer_alias_t const *pr; /* Right printer alias. */ + dkChar const *n; /* Right alias name. */ + if(l) { + if(r) { + pl = (dk3_printer_alias_t const *)l; + switch(cr) { + case 1: { + n = (dkChar const *)r; + if(pl->name) { + back = dk3str_cmp(pl->name, n); + if(back < 0) back = -1; + if(back > 0) back = 1; + } else { + back = -1; + } + } break; + default: { + pr = (dk3_printer_alias_t const *)r; + if(pl->name) { + if(pr->name) { + back = dk3str_cmp(pl->name, pr->name); + if(back < 0) back = -1; + if(back > 0) back = 1; + } else { + back = 1; + } + } else { + if(pr->name) { + back = -1; + } + } + } break; + } + } else { + back = 1; + } + } else { + if(r) { + back = -1; + } + } + return back; +} + + + +/** Compare two print hosts by name. + @param l Left object. + @param r Right object or name. + @param cr Comparison criteria (0=host/host, 1=host/name). + @return Comparison result. +*/ +static +int +dk3print_compare_host(void const *l, void const *r, int cr) +{ + int back = 0; + dk3_print_host_t const *pl; /* Left print host. */ + dk3_print_host_t const *pr; /* Right print host. */ + dkChar const *n; /* Right print host name. */ + if(l) { + if(r) { + pl = (dk3_print_host_t const *)l; + switch(cr) { + case 1: { + n = (dkChar const *)r; + if(pl->name) { + back = dk3str_cmp(pl->name, n); + if(back < 0) back = -1; + if(back > 0) back = 1; + } else { + back = -1; + } + } break; + default: { + pr = (dk3_print_host_t const *)r; + if(pl->name) { + if(pr->name) { + back = dk3str_cmp(pl->name, pr->name); + if(back < 0) back = -1; + if(back > 0) back = 1; + } else { + back = 1; + } + } else { + if(pr->name) { + back = -1; + } + } + } break; + } + } else { + back = 1; + } + } else { + if(r) { + back = -1; + } + } + return back; +} + + + +/** Compare two print host aliases by name. + @param l Left object. + @param r Right object or name. + @param cr Comparison criteria (0=alias/alias, 1=alias/name). + @return Comparison result. +*/ +static +int +dk3print_compare_host_alias(void const *l, void const *r, int cr) +{ + int back = 0; + dk3_print_host_alias_t const *pl; /* Left host alias. */ + dk3_print_host_alias_t const *pr; /* Right host alias. */ + dkChar const *n; /* Right alias name. */ + if(l) { + if(r) { + pl = (dk3_print_host_alias_t const *)l; + switch(cr) { + case 1: { + n = (dkChar const *)r; + if(pl->name) { + back = dk3str_cmp(pl->name, n); + if(back < 0) back = -1; + if(back > 0) back = 1; + } else { + back = -1; + } + } break; + default: { + pr = (dk3_print_host_alias_t const *)r; + if(pl->name) { + if(pr->name) { + back = dk3str_cmp(pl->name, pr->name); + if(back < 0) back = -1; + if(back > 0) back = 1; + } else { + back = 1; + } + } else { + if(pr->name) { + back = -1; + } + } + } break; + } + } else { + back = 1; + } + } else { + if(r) { + back = -1; + } + } + return back; +} + + + +dk3_print_conf_t * +dk3print_config_new(dk3_app_t *app) +{ + dk3_print_conf_t *back = NULL; + int ok = 0; /* Flag: Success. */ + + +#line 915 "dk3print.ctr" + if(app) { + back = dk3_new_app(dk3_print_conf_t,1,app); + if(back) { + /* Initialize members. */ + back->sPrinters = NULL; back->iPrinters = NULL; + back->sPrintAliases = NULL; back->iPrintAliases = NULL; + back->sPrintHosts = NULL; back->iPrintHosts = NULL; + back->defPrinter = NULL; + back->defHost = NULL; + back->defPsl = 3; + back->app = app; + back->msg = dk3app_messages(app, dk3print_nl[1], dk3print_msg); + if(!(back->msg)) { back->msg = dk3print_msg; } + /* Allocate resources for storages. */ + back->sPrinters = dk3sto_open_app(app); + if(back->sPrinters) { + dk3sto_set_comp(back->sPrinters, dk3print_compare_printer, 0); + back->iPrinters = dk3sto_it_open(back->sPrinters); + if(back->iPrinters) { + back->sPrintAliases = dk3sto_open_app(app); + if(back->sPrintAliases) { + dk3sto_set_comp(back->sPrintAliases,dk3print_compare_print_alias,0); + back->iPrintAliases = dk3sto_it_open(back->sPrintAliases); + if(back->iPrintAliases) { + back->sPrintHosts = dk3sto_open_app(app); + if(back->sPrintHosts) { + dk3sto_set_comp(back->sPrintHosts, dk3print_compare_host, 0); + back->iPrintHosts = dk3sto_it_open(back->sPrintHosts); + if(back->iPrintHosts) { + back->sHostAliases = dk3sto_open_app(app); + if(back->sHostAliases) { + dk3sto_set_comp( + back->sHostAliases, dk3print_compare_host_alias, 0 + ); + back->iHostAliases = dk3sto_it_open(back->sHostAliases); + if(back->iHostAliases) { + ok = 1; + } + } + } + } + } + } + } + } + /* Destroy configuration if allocations failed. */ + if(!(ok)) { + dk3print_conf_delete(back); + back = NULL; + } + } + } + +#line 967 "dk3print.ctr" + return back; +} + + +#if DK3_ON_WINDOWS + +/** Check whether a printer name contains the words + "PostScript" or "PS". + @param pc Print configuration to set up. + @param pr Printer structure to modify. + @param str Printer string to check. +*/ +static +void +dk3print_check_postscript( + dk3_print_conf_t *pc, + dk3_printer_t *pr, + dkChar const *str +) +{ + dkChar buf[DK3_MAX_PATH]; /* Private copy. */ + dkChar *c; /* Current string. */ + dkChar *n; /* Next string. */ + + if(!(pr->ps)) { + if(dk3str_len(str) < DK3_SIZEOF(buf,dkChar)) { + dk3str_cpy_not_overlapped(buf, str); + c = dk3str_start(buf, NULL); + while(c) { + n = dk3str_next(c, NULL); + if(dk3str_cmp(c, dk3print_nl[2]) == 0) { + pr->ps = pc->defPsl; + } else { + if(dk3str_casecmp(c, dk3print_nl[3]) == 0) { + pr->ps = pc->defPsl; + } + } + c = n; + } + } + if(!(pr->ps)) { + if(dk3str_casecmp(str, dk3print_nl[4]) == 0) { + pr->ps = pc->defPsl; + } + } + } +} + +#endif + + + +#if DK3_ON_WINDOWS +/* + Windows */ + +/** Read printer information from system. + @param pc Print configuration to set up. + @return 1 on success, 0 on error. +*/ +static +int +dk3print_read_system(dk3_print_conf_t *pc) +{ + dkChar buf[1024]; /* Default printer name. */ + char *peb; /* Result buffer. */ +#if DK3_CHAR_SIZE > 1 + PRINTER_INFO_2W *pi2; /* Printer information. */ +#else + PRINTER_INFO_2A *pi2; /* Printer information. */ +#endif + dk3_printer_t *printer; /* New printer to create. */ + DWORD cbNeeded; /* Bytes needed. */ + DWORD cbReturned; /* Bytes returned. */ + DWORD szPeb; /* Size of peb. */ + DWORD i; /* Index of current information. */ + DWORD dwSz; /* Buffer size. */ + BOOL res; /* Operation result. */ + int back = 1; + + +#line 1046 "dk3print.ctr" + cbNeeded = cbReturned = szPeb = (DWORD)0UL; +#if DK3_CHAR_SIZE > 1 + EnumPrintersW(PRINTER_ENUM_LOCAL,NULL,2,NULL,szPeb,&cbNeeded,&cbReturned); +#else + EnumPrintersA(PRINTER_ENUM_LOCAL,NULL,2,NULL,szPeb,&cbNeeded,&cbReturned); +#endif + if(cbNeeded > 0) { + szPeb = cbNeeded; + peb = dk3_new_app(char,(size_t)cbNeeded,pc->app); + if(peb) { + cbNeeded = cbReturned = (DWORD)0UL; +#if DK3_CHAR_SIZE > 1 + res = EnumPrintersW( + PRINTER_ENUM_LOCAL,NULL,2,(LPBYTE)peb,szPeb,&cbNeeded,&cbReturned + ); +#else + res = EnumPrintersA( + PRINTER_ENUM_LOCAL,NULL,2,(LPBYTE)peb,szPeb,&cbNeeded,&cbReturned + ); +#endif + if(res) { + if((DWORD)0UL < cbReturned) { + pi2 = (PRINTER_INFO_2 *)peb; + for(i = (DWORD)0UL; i < cbReturned; i++) { + printer = dk3print_printer_new(pc, pi2->pPrinterName); + if(printer) { + printer->t_p = DK3_PRINTER_TYPE_WINDOWS; + if(pi2->pDriverName) { + dk3print_check_postscript(pc, printer, pi2->pDriverName); + } + if(pi2->pComment) { + dk3print_check_postscript(pc, printer, pi2->pComment); + } + } else { + back = 0; + } + pi2++; + } + } else { + +#line 1085 "dk3print.ctr" + } + } else { + +#line 1087 "dk3print.ctr" + back = 0; + } + dk3_delete(peb); + } else { + +#line 1091 "dk3print.ctr" + back = 0; + } + if(back) { + dwSz = (DWORD)DK3_SIZEOF(buf,dkChar) ; +#if DK3_CHAR_SIZE > 1 + res = GetDefaultPrinterW(buf, &dwSz); +#else + res = GetDefaultPrinterA(buf, &dwSz); +#endif + if(res) { + if(dwSz > (DWORD)0UL) { + if(dwSz < DK3_SIZEOF(buf,dkChar)) { + buf[dwSz - 1] = dkT('\0'); + printer = + (dk3_printer_t *)dk3sto_it_find_like(pc->iPrinters, (void *)buf, 1); + if(printer) { + pc->defPrinter = printer; + } + } + } + } + } + } else { + +#line 1114 "dk3print.ctr" + } + + +#line 1116 "dk3print.ctr" + return back; +} + +/* - Windows */ + +#else +/* + non-Windows */ + +/** Read printer information from system. + @param pc Print configuration to set up. + @return 1 on success, 0 on error. +*/ +static +int +dk3print_read_system(dk3_print_conf_t *pc) +{ + int back = 1; + + +#line 1134 "dk3print.ctr" + /* ##### Read /etc/printcap */ + + +#line 1136 "dk3print.ctr" + return back; +} + +/* - non-Windows */ +#endif + + +/** Read print configuration data from system and/or configuration files. + @param pc Print configuration to set up. + @param useConfigFiles Flag: Use dk3print conf files. + @return 1 on success, 0 on error. +*/ +static +int +dk3print_read_configuration(dk3_print_conf_t *pc, int useConfigFiles) +{ + dkChar buf[512]; /* Buffer used for values in diagnostics. */ + int i; /* Temporary conversion result (PS level). */ + int back = 0; + + + +#line 1157 "dk3print.ctr" + /* Find default PS level from preferences */ + if(pc->app) { + if(dk3app_get_pref(pc->app, dk3print_nl[5], buf, DK3_SIZEOF(buf,dkChar))) { +#if VERSION_BEFORE_20140716 + if(dk3sf_sscanf3(buf, dk3print_nl[6], &i) == 1) +#else + if (0 != dk3ma_i_from_string(&i, buf, NULL)) +#endif + { + if((2 <= i) && (3 >= i)) { + pc->defPsl = i; + } else { + /* ERROR: PS level out of range! */ + dk3app_log_3(pc->app, DK3_LL_ERROR, pc->msg, 49, 50, buf); + } + } else { + /* ERROR: PS level not numeric! */ + dk3app_log_3(pc->app, DK3_LL_ERROR, pc->msg, 49, 50, buf); + } + } + } + /* Read system printers and configuration files. */ + if(dk3print_read_system(pc)) { + if(useConfigFiles) { + if(dk3print_read_config_files(pc)) { + back = 1; + } + } else { + back = 1; + } + } + +#line 1188 "dk3print.ctr" + return back; +} + + + +dk3_print_conf_t * +dk3print_conf_open(dk3_app_t *app, int useConfigFiles) +{ + dk3_print_conf_t *back = NULL; + + +#line 1198 "dk3print.ctr" + if(app) { + back = dk3print_config_new(app); + if(back) { + if(!dk3print_read_configuration(back, useConfigFiles)) { + dk3print_conf_delete(back); + back = NULL; + } + } + } + +#line 1207 "dk3print.ctr" + return back; +} + + + +void +dk3print_conf_close(dk3_print_conf_t *pc) +{ + + +#line 1216 "dk3print.ctr" + if(pc) { + dk3print_conf_delete(pc); + } + +#line 1219 "dk3print.ctr" +} + + + +void +dk3print_set_det(dk3_printer_details_t *det, int tp) +{ + + +#line 1227 "dk3print.ctr" + if(det) { + switch(tp) { + case DK3_PRINTER_TYPE_WINDOWS: { + (det->win).dummy = 0; + } break; + case DK3_PRINTER_TYPE_SOCKET: { + (det->sock).hostname = NULL; + (det->sock).portno = 0; + (det->sock).ordrel = 0x00; + (det->sock).to_c = -1.0; + (det->sock).to_r = -1.0; + (det->sock).to_s = -1.0; + } break; + case DK3_PRINTER_TYPE_LPD: case DK3_PRINTER_TYPE_LPRNG: { + (det->lprng).hostname = NULL; + (det->lprng).queuename = NULL; + (det->lprng).to_c = -1.0; + (det->lprng).to_r = -1.0; + (det->lprng).to_s = -1.0; + } break; + default: { + } break; + } + } + +#line 1251 "dk3print.ctr" +} + + + +dk3_printer_t * +dk3print_get_printer(dk3_print_conf_t *pc, dkChar const *pn) +{ + dk3_printer_t *back = NULL; + dk3_printer_alias_t *al = NULL; /* Alias for printer. */ + + if((pc) && (pn)) { + back = (dk3_printer_t *)dk3sto_it_find_like(pc->iPrinters, (void *)pn, 1); + if(!(back)) { + al = (dk3_printer_alias_t *)dk3sto_it_find_like( + pc->iPrintAliases, (void *)pn, 1 + ); + if(al) { + back = al->printer; + } + } + } + return back; +} + + +dk3_print_host_t * +dk3print_get_host(dk3_print_conf_t *pc, dkChar const *hn) +{ + dk3_print_host_t *back = NULL; + dk3_print_host_alias_t *al = NULL; /* Alias for host. */ + + if((pc) && (hn)) { + back = (dk3_print_host_t *)dk3sto_it_find_like( + pc->iPrintHosts, (void *)hn, 1 + ); + if(!(back)) { + al = (dk3_print_host_alias_t *)dk3sto_it_find_like( + pc->iHostAliases, (void *)hn, 1 + ); + if(al) { + back = al->host; + } + } + } + return back; +} + |